Surisetti Swati
Surisetti Swati

Reputation: 11

Adding items into ListView in Fragments creates duplicates

This question has been asked so many times, but none of the solutions solved my issue. I have an activity with two fragments with a viewpager, And each fragment has a listview. Upon moving between tabs my listview's items are repeating.
here is the adapter code.

public class ComboMenuAdapter extends BaseAdapter {


    private Context mContext;

    private MenuHolder mMenuHolder;


    private ArrayList<Integer> index;

    public ComboMenuAdapter(Context mContext, ArrayList<Integer> index) {
        this.index = index;

        this.mContext = mContext;


    }


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

    @Override
    public MenuHolder getItem(int position) {

        return DataHandler.getInstance().getData(index.get(position));
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    private class Holder {
        ImageView image;
        TextView price, liters, itemnametxt, mAdd_txt, minus, plus, counter;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        final Holder mHolder;

        View v = convertView;

        if (v == null) {

            LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

           v= vi.inflate(R.layout.combo_meals_adapter, null);

            mHolder = new Holder();
            mHolder.price = (TextView) v.findViewById(R.id.price);
            mHolder.itemnametxt = (TextView) v.findViewById(R.id.itemnametxt);
            mHolder.image = (ImageView) v.findViewById(R.id.image);
            mHolder.liters = (TextView) v.findViewById(R.id.ml);
            mHolder.mAdd_txt = (TextView) v.findViewById(R.id.addtxt);
            mHolder.minus = (TextView) v.findViewById(R.id.minus);
            mHolder.counter = (TextView) v.findViewById(R.id.count);
            mHolder.plus = (TextView) v.findViewById(R.id.plus);


            v.setTag(mHolder);


        } else {
            mHolder = (Holder) v.getTag();
        }
        mMenuHolder = getItem(position);
        mHolder.itemnametxt.setText(mMenuHolder.getItemname());
        mHolder.image.setImageResource(R.mipmap.ic_launcher);
        mHolder.price.setText(mMenuHolder.getItemprice());
        mHolder.counter.setText(mMenuHolder.getItemCount());
        return v;

    }

}

I am unable to find the mistake, please help me, Thank you in advance.

Here, I am storing the data using DataHandler Class

public class DataHandler {

    ArrayList<MenuHolder> listOfItemsFromJson = new ArrayList<MenuHolder>();

    private static DataHandler mInstance = null;

  static   public DataHandler getInstance() {
        if (null == mInstance) {
            mInstance = new DataHandler();
        }
        return mInstance;
    }

    public DataHandler() {
        listOfItemsFromJson = new ArrayList<>();
    }


    public ArrayList<MenuHolder> getListOfItemsFromJson() {
        return listOfItemsFromJson;
    }

    public void clearList() {


        listOfItemsFromJson.clear();
    }

    public void addData(MenuHolder holder) {
        listOfItemsFromJson.add(holder);
    }

    public MenuHolder getData(int position) {

        return listOfItemsFromJson.get(position);

    }

    public void removeData(int position) {
        listOfItemsFromJson.remove(getData(position));
    }


    public void modifyData(MenuHolder holder, int position) {
        listOfItemsFromJson.set(position, holder);

    }


    public int size() {

        return listOfItemsFromJson.size();
    }


}

Upon onCreateView(), I am placing the data

 for (int i = 0; i < DataHandler.getInstance().size(); i++) {

            if (DataHandler.getInstance().getData(i).isCombo()) {
                DataHandler.getInstance().removeData(i);
            }

        }




        for (int i = 0; i < 3; i++) {
            MenuHolder mMenuHolder = new MenuHolder();

            mMenuHolder.setItemname(itemNames[i]);
            mMenuHolder.setImageName("@mipmap/ic_launcher");
            mMenuHolder.setItemCount("0");
            mMenuHolder.setItemprice("500");
            mMenuHolder.setUserSeleted(false);
            mMenuHolder.setCombo(true);
            mMenuHolder.setDrinks(false);
            mMenuHolder.setBiryani(false);
            DataHandler.getInstance().addData(mMenuHolder);

        }
        index.clear();
        for (int i = 0; i < DataHandler.getInstance().size(); i++) {
            if (DataHandler.getInstance().getListOfItemsFromJson().get(i).isCombo()) {
                index.add(i);
            }
        }

        mCombosAdapter = new ComboMenuAdapter(getActivity(), index);


        mlistView.setVisibility(View.VISIBLE);
        mlistView.setAdapter(mCombosAdapter);
        mlistView.setOnItemClickListener(this);

Upvotes: 0

Views: 71

Answers (3)

Bipin Bharti
Bipin Bharti

Reputation: 949

for this code you get Repeating data may be

  for (int i = 0; i < 3; i++) 
     {
        MenuHolder mMenuHolder = new MenuHolder();
        mMenuHolder.setItemname(itemNames[i]);
        mMenuHolder.setImageName("@mipmap/ic_launcher");
        mMenuHolder.setItemCount("0");
        mMenuHolder.setItemprice("500");
        mMenuHolder.setUserSeleted(false);
        mMenuHolder.setCombo(true);
        mMenuHolder.setDrinks(false);
        mMenuHolder.setBiryani(false);
        DataHandler.getInstance().addData(mMenuHolder);
    }

Upvotes: 0

TommySM
TommySM

Reputation: 3883

Make sure you clear your adapter before adding new objects to it:

if (!someAdapter.isEmpty())
     someAdapter.clear();

 someAdapter.addAll(new ArrarList(arrayListContainingUpdatedStuff));

No need for a new adapter allocation, you might lose you reference to the old one and the list might go blank.

Hope this helps.

Upvotes: 0

Blackbelt
Blackbelt

Reputation: 157457

 mMenuHolder = getItem(position);

should be retrieved before setting the data. Move it outside the if/else logic before.

mMenuHolder = getItem(position);
mHolder.itemnametxt.setText(mMenuHolder.getItemname());
mHolder.image.setImageResource(R.mipmap.ic_launcher);
mHolder.price.setText(mMenuHolder.getItemprice());
mHolder.counter.setText(mMenuHolder.getItemCount());

you want to retrieve the item at position before filling up your view

Upvotes: 1

Related Questions