gpt4 book ai didi

android - 为什么 `PagerAdapter::notifyDataSetChanged` 没有更新 View ?

转载 作者:IT老高 更新时间:2023-10-28 12:48:42 26 4
gpt4 key购买 nike

我正在使用兼容性库中的 ViewPager。我已经成功地让它显示了几个可以翻页的 View 。

但是,我很难弄清楚如何使用一组新 View 更新 ViewPager。

我尝试了各种方法,例如调用 mAdapter.notifyDataSetChanged()mViewPager.invalidate() 甚至每次我想使用时都创建一个全新的适配器一个新的数据列表。

没有任何帮助, TextView 与原始数据保持不变。

更新:我做了一个小测试项目,几乎可以更新 View 。我将粘贴下面的类。

似乎没有更新的是第二个 View ,“B”仍然存在,按下更新按钮后应该显示“Y”。

public class ViewPagerBugActivity extends Activity {

private ViewPager myViewPager;
private List<String> data;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

data = new ArrayList<String>();
data.add("A");
data.add("B");
data.add("C");

myViewPager = (ViewPager) findViewById(R.id.my_view_pager);
myViewPager.setAdapter(new MyViewPagerAdapter(this, data));

Button updateButton = (Button) findViewById(R.id.update_button);
updateButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
updateViewPager();
}
});
}

private void updateViewPager() {
data.clear();
data.add("X");
data.add("Y");
data.add("Z");
myViewPager.getAdapter().notifyDataSetChanged();
}

private class MyViewPagerAdapter extends PagerAdapter {

private List<String> data;
private Context ctx;

public MyViewPagerAdapter(Context ctx, List<String> data) {
this.ctx = ctx;
this.data = data;
}

@Override
public int getCount() {
return data.size();
}

@Override
public Object instantiateItem(View collection, int position) {
TextView view = new TextView(ctx);
view.setText(data.get(position));
((ViewPager)collection).addView(view);
return view;
}

@Override
public void destroyItem(View collection, int position, Object view) {
((ViewPager) collection).removeView((View) view);
}

@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}

@Override
public Parcelable saveState() {
return null;
}

@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}

@Override
public void startUpdate(View arg0) {
}

@Override
public void finishUpdate(View arg0) {
}
}
}

最佳答案

有几种方法可以实现这一点。

第一个选项更简单,但效率有点低。

在您的 PagerAdapter 中覆盖 getItemPosition,如下所示:

public int getItemPosition(Object object) {
return POSITION_NONE;
}

这样,当您调用 notifyDataSetChanged() 时, View 分页器将删除所有 View 并重新加载它们。这样就得到了reload效果。

第二个选项,suggested by Alvaro Luis Bustamante (previously alvarolb) , 是在实例化一个新 View 时在 instantiateItem() 中的 setTag() 方法。然后,您可以使用 findViewWithTag() 来查找要更新的 View ,而不是使用 notifyDataSetChanged()

结论

如果您有很多 View ,或者想要支持修改任何特定项目和/或 View (随时快速),那么第二种方法(标记)非常灵活且高性能,因为它可以防止重新创建所有修改 View 。
(感谢 alvarolb 的原创研究。)

但是,如果您的应用只有“刷新”功能(甚至不允许更改单个项目),或者只有很少的项目,请使用第一种方法,因为它可以节省开发时间。

关于android - 为什么 `PagerAdapter::notifyDataSetChanged` 没有更新 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7263291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com