在我们的ViewPager中,显示的每项子项都是通过适配器的形式添加的,对于ViewPager适配器的数据实时刷新我们可以直接通过调用适配器的**notifyDataSetChanged();**方法实现刷新,但我们的Fragment在显示时是在我们的内存中的,也就意味着不能动态对我们的Fragment数据进行刷新,那么对于Fragment的刷新无非就是两种方法,一种就是每次需要刷新时都重新创建一个Fragment,或者更改Fragment的ID,下面是第一种方法的实现方法:
- Fragment中
public class OneFragment extends Fragment{
private List<String> data;
private ListView messageList;
private ArrayAdapter adapter;
// 通过静态方法的形式传入数据,可以避免因界面重绘时造成传入数据丢失,比如当屏幕旋转时,活动会界面会重新绘制,这时候如果界面上有Fragment则会造成传入Fragment的数据丢失
public static OneFragment newFratment(List<String> data){
OneFragment f = new OneFragment();
Bundle b = new Bundle();
b.putStringArrayList("data", (ArrayList<String>) data);
// 除了八大基础数据类型之外,其他数据类型需要进行序列化,序列化的对象需要继承Serializable接口,否则无法完成序列化
f.setArguments(b);
return f;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 取出传入的数据信息
Bundle b = getArguments();
data = b.getStringArrayList("data");
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View mView = inflater.inflate(R.layout.ont_fragment,container,false);
messageList = mView.findViewById(R.id.messageList);
adapter = new ArrayAdapter(getContext(),R.layout.support_simple_spinner_dropdown_item,data);
messageList.setAdapter(adapter);
return mView;
}
// 刷新Fragment数据的方法
public void updateFragment(List<String> data){
this.data = data;//更新字段的值
Bundle b = getArguments();
if(b != null){
b.putStringArrayList("data", (ArrayList<String>) data);//更新Arguments内的值
}
}
}
- Adapter中
public class MessageShowAdapter extends FragmentStatePagerAdapter {
private List<List<String>> data;//显示数据集合
public MessageShowAdapter(@NonNull FragmentManager fm, List<List<String>> data) {
super(fm);
this.data = data;
}
@NonNull
@Override
public Fragment getItem(int position) {
//调用OneFratment传递数据的方法,实现Fragment初始化、数据传递
return OneFragment.newFratment(data.get(position));
}
@Override
public int getCount() {
return data.size();
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
//获取数据被更改的界面
OneFragment fmt = (OneFragment)super.instantiateItem(container, position);
//调用Fragment刷新数据的方法,刷新数据
fmt.updateFragment(data.get(position));
return fmt;//将刷新后的Fragment返回显示
}
@Override
public int getItemPosition(@NonNull Object object) {
//设置强制刷新
return PagerAdapter.POSITION_NONE;
}
}
- Activity中
public class MainActivity extends AppCompatActivity {
private ViewPager messageShow;//翻页控件
private List<List<String> > data;//翻页控件子页数据集合(一个页面一个List<String>,这里是多个页面的数据集合)
private MessageShowAdapter adapter;//翻页控件适配器
private Button refresh;//刷新数据按钮
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bd();//先调用绑定控件的方法
data = new ArrayList<>();//实例化数据集合
AddData();//调用模拟动态添加数据的方法
adapter = new MessageShowAdapter(getSupportFragmentManager(),data);//实例化适配器
messageShow.setAdapter(adapter);//给翻页控件设置适配器
}
// 关联控件的方法
private void bd(){
messageShow = findViewById(R.id.messageShow);
refresh = findViewById(R.id.refresh);
refresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AddData();//调用模拟动态台添加数据的方法
adapter.notifyDataSetChanged();//刷新ViewPager适配器的数据(间接刷新Fragment数据)
}
});
}
// 模拟动态添加数据的方法
private void AddData(){
// 随机生成显示数据
// data = new ArrayList<>();切勿每次更改数据时new一个ArrayList()对象!!!
data.clear();
List<String> one = new ArrayList<>();
one.add(new Random().nextInt(100) + "");
one.add(new Random().nextInt(100) + "");
one.add(new Random().nextInt(100) + "");
one.add(new Random().nextInt(100) + "");
one.add(new Random().nextInt(100) + "");
one.add(new Random().nextInt(100) + "");
one.add(new Random().nextInt(100) + "");
one.add(new Random().nextInt(100) + "");
one.add(new Random().nextInt(100) + "");
one.add(new Random().nextInt(100) + "");
data.add(one);
List<String> two = new ArrayList<>();
two.add(new Random().nextInt(100) + "");
two.add(new Random().nextInt(100) + "");
two.add(new Random().nextInt(100) + "");
two.add(new Random().nextInt(100) + "");
two.add(new Random().nextInt(100) + "");
two.add(new Random().nextInt(100) + "");
two.add(new Random().nextInt(100) + "");
two.add(new Random().nextInt(100) + "");
two.add(new Random().nextInt(100) + "");
two.add(new Random().nextInt(100) + "");
data.add(two);
List<String> three = new ArrayList<>();
three.add(new Random().nextInt(100) + "");
three.add(new Random().nextInt(100) + "");
three.add(new Random().nextInt(100) + "");
three.add(new Random().nextInt(100) + "");
three.add(new Random().nextInt(100) + "");
three.add(new Random().nextInt(100) + "");
three.add(new Random().nextInt(100) + "");
three.add(new Random().nextInt(100) + "");
three.add(new Random().nextInt(100) + "");
three.add(new Random().nextInt(100) + "");
data.add(three);
}
}
-
**注意:**在MainActivity的布局文件中只有一个ViewPager控件和一个Button控件,Fragment布局文件中只有一个ListView控件
-
该方法存在的缺陷是每次刷新都是重新创建Fragment,对内存消耗较大。
-
在这个案例中,可以将ListView换成其他的控件,比如图标,在Fragment的onCreateView()方法中返回相应的视图即可,刷新只需更改data即可实现效果