Skip to content Skip to sidebar Skip to footer

How To Delete Item From Viewpager And Pageradapter

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 button i

Solution 1:

first you need to use List because of dynamically deleting objects. second you need

@Overridepublic int getItemPosition(Objectobject){
        returnPagerAdapter.POSITION_NONE;
    }

to force the adapter to create new page each time and not using in memory pages.

publicclassViewPagerAdapterextendsPagerAdapter {
    // Declare VariablesContext context;
    List<String> rank;
    List<String> country;
    List<String> population;
    List<Integer> flag = newArrayList<Integer>();
    LayoutInflater inflater;

    publicViewPagerAdapter(Context context, String[] rank, String[] country,
            String[] population, int[] flag) {
        this.context = context;
        this.rank = newArrayList<String>(Arrays.asList(rank));
        this.country = newArrayList<String>(Arrays.asList(country));
        this.population = newArrayList<String>(Arrays.asList(population));
        for (int i : flag){ 
            this.flag.add(i);
        }

    }

    @Overridepublic int getCount() {
        return rank.size();
    }

    @OverridepublicbooleanisViewFromObject(View view, Objectobject) {
        return view == ((RelativeLayout) object);
    }

    @OverridepublicObjectinstantiateItem(ViewGroup container, int position) {

        // Declare VariablesTextView txtrank;
        TextView txtcountry;
        TextView txtpopulation;
        ImageView imgflag;

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.viewpager_item, container,
                false);

        // Locate the TextViews in viewpager_item.xml
        txtrank = (TextView) itemView.findViewById(R.id.rank);
        txtcountry = (TextView) itemView.findViewById(R.id.country);
        txtpopulation = (TextView) itemView.findViewById(R.id.population);
         Button b=(Button)itemView.findViewById(R.id.button1);

         final int delPosition = position;

         b.setOnClickListener(newOnClickListener() {

             @OverridepublicvoidonClick(View v) {
                 rank.remove(delPosition);
                 country.remove(delPosition);
                 population.remove(delPosition);
                 flag.remove(delPosition);
                 notifyDataSetChanged();
             }
         });
        // Capture position and set to the TextViews
        txtrank.setText(rank.get(position));
        txtcountry.setText(country.get(position));
        txtpopulation.setText(population.get(position));

        // Locate the ImageView in viewpager_item.xml
        imgflag = (ImageView) itemView.findViewById(R.id.flag);
        // Capture position and set to the ImageView
        imgflag.setImageResource(flag.get(position));

        // Add viewpager_item.xml to ViewPager
        ((ViewPager) container).addView(itemView);

        return itemView;
    }

    @OverridepublicvoiddestroyItem(ViewGroup container, int position, Objectobject) {
        // Remove viewpager_item.xml from ViewPager
        ((ViewPager) container).removeView((RelativeLayout) object);

    }
    @Overridepublic int getItemPosition(Objectobject){
        returnPagerAdapter.POSITION_NONE;
    }
}

Solution 2:

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.

publicMyAdaptorPagerAdaptor(Context context, ArrayList<MyMedia> myMedias) {
    this.context = context;
    this.myMedias = myMedias;
    this.authCode = authCode;
}

public Object instantiateItem(@NonNull ViewGroup container, int position) {
    
    mageViewimageView=newImageView(context);
    imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
    mageView.setTag(myMedia.getName()); //the most important part//....... do your stuffreturn 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.

@Overridepublic int getItemPosition(@NonNullObjectobject) {
    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();  

Post a Comment for "How To Delete Item From Viewpager And Pageradapter"