简体   繁体   中英

Removing objects from listView in custom adapter

So I have an activity with a listview inside of it and when I click a delete button I want to remove the object from the list. I already know how to find which object I want to remove and remove it from the list that populates my array adapter but I am not sure what i need to do to call the.notifyDataSetChanged() routine which Is what I believe I need to do. Any help would be much appreciated.

My activity code

public class MealActivity2 extends AppCompatActivity {

private ListView lv;
public static ArrayList<Model> modelArrayList;
private CustomAdapter customAdapter;
private Button btnnext;
private String[] fruitlist = new String[]{"Apples", "Oranges", "Potatoes", "Tomatoes","Grapes"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_meal2);

    Integer numFoodItems =  ((Globals) getApplication()).getLength();

    lv = (ListView) findViewById(R.id.lv);
    btnnext = (Button) findViewById(R.id.next);

    modelArrayList = getModel(numFoodItems);
    customAdapter = new CustomAdapter(this);
    lv.setAdapter(customAdapter);

    btnnext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MealActivity2.this,NextActivity.class);
            startActivity(intent);
        }
    });
}

// this builds the array list of model opbjects that will be used by the adapter to populate
// the list view dynamically
private ArrayList<Model> getModel(Integer length){
    ArrayList<Model> list = new ArrayList<>();
    for(int i = 0; i < length; i++){

        FoodDetailsPost food =  ((Globals) getApplication()).getFoodList().get(i);

        Model model = new Model();
        model.setNumber(((Globals) getApplication()).getServing(i));
        model.setFruit(food.getDescription());
        list.add(model);
    }
    return list;
}

}

and here is my custom adapter code if you look near the end at the last comment that is where i need to notify my activity that I have changed the contents of the list and should update the displaying items

public class CustomAdapter  extends BaseAdapter {

private Context context;
private adapterGlobalAccess g = new adapterGlobalAccess();
private CustomAdapter customAdapter;


public CustomAdapter(Context context) {

    this.context = context;
}

@Override
public int getViewTypeCount() {
    return getCount();
}
@Override
public int getItemViewType(int position) {

    return position;
}

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

@Override
public Object getItem(int position) {
    return MealActivity2.modelArrayList.get(position);
}

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

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

    if (convertView == null) {
        holder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.lv_item, null, true);


        holder.tvFruit = (TextView) convertView.findViewById(R.id.animal);
        holder.tvnumber = (TextView) convertView.findViewById(R.id.number);
        holder.btn_edit = (Button) convertView.findViewById(R.id.plus);
        holder.btn_minus = (Button) convertView.findViewById(R.id.minus);

        convertView.setTag(holder);
    }else {
        // the getTag returns the viewHolder object set as a tag to the view
        holder = (ViewHolder)convertView.getTag();
    }

    holder.tvFruit.setText(MealActivity2.modelArrayList.get(position).getFruit());
    holder.tvnumber.setText(String.valueOf(MealActivity2.modelArrayList.get(position).getNumber()));


    holder.btn_edit.setTag(R.integer.btn_plus_view, convertView);
    holder.btn_edit.setTag(R.integer.btn_plus_pos, position);
    holder.btn_edit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            View tempview = (View) holder.btn_edit.getTag(R.integer.btn_plus_view);
            TextView tv = (TextView) tempview.findViewById(R.id.number);
            Integer pos = (Integer) holder.btn_edit.getTag(R.integer.btn_plus_pos);

            Double number = Double.parseDouble(tv.getText().toString()) + 1;
            tv.setText(String.valueOf(number));

            MealActivity2.modelArrayList.get(pos).setNumber(number);

            g.setServing(pos, number);
        }
    });

    holder.btn_minus.setTag(R.integer.btn_minus_view, convertView);
    holder.btn_minus.setTag(R.integer.btn_minus_pos, position);
    holder.btn_minus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            View tempview = (View) holder.btn_minus.getTag(R.integer.btn_minus_view);
            TextView tv = (TextView) tempview.findViewById(R.id.number);
            Integer pos = (Integer) holder.btn_minus.getTag(R.integer.btn_minus_pos);

            ((Globals) context.getApplicationContext()).remove(pos);

            MealActivity2.modelArrayList.remove(pos);
            // i need to do .notifyDataSetChanged() here but im not sure how
        }
    });

    return convertView;
}

You can just use a interface to solve the problem

CustomAdapter

public class CustomAdapter  extends BaseAdapter {

   ...

    private CustomAdapterListener listener;

    interface CustomAdapterListener{

        void itemClick();
    }

    public CustomAdapter(Context context, CustomAdapterListener listener) {

       this.context = context;
       this.listener = listener;
    }

MainActivity2

public class MealActivity2 extends AppCompatActivity implements CustomAdapterListener {

    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_meal2);

       ...

       customAdapter = new CustomAdapter(this, this);

    }

    @Override
    public void itemClick() {
    // you can do .notifyDataSetChanged() here 
    }

after that you can use listener to callback to Activity and do anything you want

CustomAdapter

    @Override
    public void onClick(View v) {

        listener.itemClick();
        // i need to do .notifyDataSetChanged() here but im not sure how
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM