ViewPager PagerAdapter更新不及时的查看 [英] ViewPager PagerAdapter not updating the View

查看:216
本文介绍了ViewPager PagerAdapter更新不及时的查看的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是ViewPager从兼容性库。我已经succussfully得到它显示的几个观点,我可以通过页面。

不过,我有一个很难搞清楚如何使用一套新的意见更新ViewPager。

我已经试过各种东西就像调用 mAdapter.notifyDataSetChanged() mViewPager.invalidate()甚至创建一个全新的接口,每次我想用一个新的数据表。

没有什么帮助时,textviews仍然从原来的数据不变。

感谢您的时间。

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

有什么不却出现更新是第二个观点,B仍然存在,它应该$ P $后显示'Y'pssing更新按钮。

 公共类ViewPagerBugActivity延伸活动{

    私人ViewPager myViewPager;
    私人列表<字符串>数据;

    @覆盖
    公共无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);

        数据=新的ArrayList<字符串>();
        data.add(A);
        data.add(B);
        data.add(C);

        myViewPager =(ViewPager)findViewById(R.id.my_view_pager);
        myViewPager.setAdapter(新MyViewPagerAdapter(此,数据));

        按钮updateButton =(按钮)findViewById(R.id.update_button);
        updateButton.setOnClickListener(新OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){
                updateViewPager();
            }
        });
    }

    私人无效updateViewPager(){
        data.clear();
        data.add(X);
        data.add(Y);
        data.add(Z);
        myViewPager.getAdapter()notifyDataSetChanged()。
    }

    私有类MyViewPagerAdapter扩展PagerAdapter {

        私人列表<字符串>数据;
        私人上下文CTX;

        公共MyViewPagerAdapter(上下文CTX,列表和LT;字符串>数据){
            this.ctx = CTX;
            this.data =数据;
        }

        @覆盖
        公众诠释getCount将(){
            返回data.size();
        }

        @覆盖
        公共对象instantiateItem(查看收集,INT位置){
            TextView的视图=新的TextView(CTX);
            view.setText(data.get(位置));
            ((ViewPager)集合).addView(视图);
            返回查看;
        }

        @覆盖
        公共无效destroyItem(查看收集,INT位置,对象视图){
             ((ViewPager)集合).removeView((视图));
        }

        @覆盖
        公共布尔isViewFromObject(查看视图,Object对象){
            返回查看==对象;
        }

        @覆盖
        公共Parcelable saveState和(){
            返回null;
        }

        @覆盖
        公共无效restoreState(Parcelable为arg0,ClassLoader的ARG1){
        }

        @覆盖
        公共无效startUpdate(查看为arg0){
        }

        @覆盖
        公共无效finishUpdate(查看为arg0){
        }
    }
}
 

解决方案

有几种方法可以做到这一点。

第一个选项是比较容易的,但更多的效率不高。

在覆盖 getItemPosition PagerAdapter 是这样的:

 公众诠释getItemPosition(Object对象){
    返回POSITION_NONE;
}
 

这样,当你调用 notifyDataSetChanged(),认为寻呼机将删除所有的意见,并重新加载它们。由于这样获得的重载效果。

第二个选项,建议阿尔瓦罗·路易斯·布斯塔曼特(previously alvarolb),是 setTag()方法 instantiateItem()实例化一个新的视图时。然后,而不是使用 notifyDataSetChanged(),您可以使用 findViewWithTag()来找到你想更新视图。

第二种方法是非常灵活的,高的高性能。荣誉对alvarolb的原创性研究。

I'm using the ViewPager from the compatibility library. I have succussfully got it displaying several views which I can page through.

However, I'm having a hard time figuring out how to update the ViewPager with a new set of Views.

I've tried all sorts of things like calling mAdapter.notifyDataSetChanged(), mViewPager.invalidate() even creating a brand new adapter each time I want to use a new List of data.

Nothing has helped, the textviews remain unchanged from the original data.

Thanks for your time.

Update: I made a little test project and I've almost been able to update the views. I'll paste the class below.

What doesn't appear to update however is the 2nd view, the 'B' remains, it should display 'Y' after pressing the update button.

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) {
        }
    }
}

解决方案

There are several ways to achieve this.

The first option is easier, but bit more inefficient.

Override getItemPosition in your PagerAdapter like this:

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

This way, when you call notifyDataSetChanged(), the view pager will remove all views and reload them all. As so the reload effect is obtained.

The second option, suggested by Alvaro Luis Bustamante (previously alvarolb), is to setTag() method in instantiateItem() when instantiating a new view. Then instead of using notifyDataSetChanged(), you can use findViewWithTag() to find the view you want to update.

The second approach is very flexible and high performant. Kudos to alvarolb for the original research.

这篇关于ViewPager PagerAdapter更新不及时的查看的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆