Ben
Ben

Reputation: 1849

Refresh ListView when item in adapter is removed

I have created a ListView of items that each one of them looks as follows:

enter image description here

In simplified code, It looks like this:

public class MyBAdapter extends ArrayAdapter {

    private static class ViewHolder {
        public ImageButton ib_Delete;
        public ToggleButton tb_Status;
    }

    public MyBAdapter(Context context, ArrayList<MyB> aB) {
        super(context, 0, aB);
    }

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

        final MyB b = getItem(position);

        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate( R.layout.item_b_myb, parent, false);
            viewHolder.ib_DeleteB = convertView.findViewById( R.id.ib_DeleteB );
            viewHolder.tb_Status = convertView.findViewById( R.id.tb_Status );

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        return convertView;
    }

}

Now, I had like that once a user clicks on the ToggleButton of on the x button, that it will remove this item from the list and that the view will be updated on this screen.

How can I do it?

I saw that for this case notifyDataSetChanged() won't work.

Basically what I'm trying to do is to refresh the list without calling again the activity.

Thank you

Upvotes: 1

Views: 41

Answers (1)

Kasım &#214;zdemir
Kasım &#214;zdemir

Reputation: 5634

You can try like this:

public static class MyBAdapter extends ArrayAdapter {

    private ArrayList<String> aB;
    private class ViewHolder {
        public ImageButton ib_Delete;
        public ToggleButton tb_Status;
        public TextView text;
    }

    public MyBAdapter(Context context, ArrayList<String> aB) {
        super(context,0, aB);
        this.aB = aB;

    }

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

        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate( R.layout.item_b_myb, parent, false);
            viewHolder.ib_Delete = convertView.findViewById( R.id.ib_DeleteB );
            viewHolder.tb_Status = convertView.findViewById( R.id.tb_Status );
            viewHolder.text = convertView.findViewById( R.id.text );

            convertView.setTag(viewHolder);


        } else {
            viewHolder = (ViewHolder) convertView.getTag();
            viewHolder.tb_Status.setChecked(false);
        }

        viewHolder.text.setText(aB.get(position));
        viewHolder.ib_Delete.setTag(position);
        viewHolder.ib_Delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(viewHolder.tb_Status.isChecked()){
                    delete((Integer)view.getTag());
                }
            }
        });
        return convertView;
    }

    private void delete(int position) {
        aB.remove(position);
        notifyDataSetChanged();
    }

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

Upvotes: 1

Related Questions