How to delete item from viewpager and pageradapter

前端 未结 2 995
鱼传尺愫
鱼传尺愫 2021-01-05 08:56

I am using pageradapter and viewpager to display imageview array,textview array .But how do I delete pager on button click .Entire code in the code below ,but I have added b

2条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-01-05 09:58

    The Selected answer will quickly hit a performance knock.

    True you need to implement the getItemPosition() method of your Adaptor but you should override it as intended.

    The getItemPosition() method tells the ViewPager whether or not to delete viewItem, to redraw or not redraw viewItem when the adapter.notifyDataSetChanged() is called.

    Basically your implementation of getItemPosition() method is called to answer a simple question when adapter.notifyDataSetChanged() is called.

    The question is "For each of the viewItems we have, has the position changed?"

    There are two answers to this question

    1. PagerAdapter.POSITION_UNCHANGED //nothing changed save resources use cached viewitem
    2. PagerAdapter.POSITION_NONE //we don't have that view any more recreate it or delete it.

    This question determines weather ViewPager recreates a new viewItem or uses one that was cached. Also it's from this answer that a decision is made to Remove a ViewItem deemed to be deleted or removed.

    If ViewPager has to create a new viewitem for every data item in your items list every time adapter.notifyDataSetChanged() is called. Imagine if you had a list of thousands of data from database; performance will be hit. That's exactly what just returning PagerAdapter.POSITION_NONE; from getItemPosition() does. You are bypassing a crucial performance mechanism.

    It's your responsibility as a developer to figure out how you answer that question. But remember the way you answer that question impacts performance of your app.

    How I implement it

    In Your PagerAdapter, instantiateItem(@NonNull ViewGroup container, int position). Set a tag on your view after instantiation. give it a unique name. I use the name of the image that I am showing in that view.

    public MyAdaptorPagerAdaptor(Context context, ArrayList myMedias) {
        this.context = context;
        this.myMedias = myMedias;
        this.authCode = authCode;
    }
    
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        
        mageView imageView = new ImageView(context);
        imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        mageView.setTag(myMedia.getName()); //the most important part
    
        //....... do your stuff
        return imageView;
    }
    

    Then Override the getItemPosition(@NonNull Object object)

    super.getItemPosition(object); in that message return answer no.1 above PagerAdapter.POSITION_UNCHANGED //nothing changed save resources use cached viewitem that's the default behavior.

    But we want to iterate through our data items to see if the viewItem passed to us as an object from getItemPosition(@NonNull Object object) still exists in out Adapter items array or not.

    We are interested in when it does not exists. that's when we return answer no.2. PagerAdapter.POSITION_NONE

    The viewItem passed to us as an Object, is exactly the Object we returned in our public Object instantiateItem(@NonNull ViewGroup container, int position) method. In my case it's the ImageView.

    @Override
    public int getItemPosition(@NonNull Object object) {
        int res = super.getItemPosition(object);
        ImageView imageView = (ImageView) object;
        final String tag = (String) imageView.getTag();
    
        // look for an item with our tag from our items list.
        MyMedia myMedia = null;
        for (MyMedia item : myMedias) {
            if (item.getName().equals(tag)) {
                myMedia = item;
                break;
            }
        }
    
        //if this item is null, then it does not exist in my items list
        // so I tell View pager I don't have that item.
        if (myMedia == null) {
            res = PagerAdapter.POSITION_NONE;
        }
        return res;
    }
    

    Last part. Now from your activity of fragment, just remove data from the Adapter array or ArrayList which you pass to your adapter as a data source.

    //remove deleted item from myMedias ArrayList
    myMedias.remove(position);
    
    //tell your adapter instance data changed
    pagerAdapter.notifyDataSetChanged();  
    

提交回复
热议问题