Search code examples
androidlistviewcustom-adapter

Android custom listadapter always deleting the last item


Good day,

I am trying to refresh my knowledge in android programming
by creating a simple memo app with custom adapter list.

My problem is, even I call "NotifyDataSetChanged();",
the value deleted in my list is always the last one.
Though when I refresh it, it will display the correct one.

Here is my code :

public class CustomAdapter extends BaseAdapter{   
List<Memo> memos;
Context context;
int [] imageId;


private static LayoutInflater inflater = null;
public CustomAdapter(MainActivity mainActivity, List<Memo> _memos) {
    memos = _memos;
    context = mainActivity;
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
    return memos.size();
}

@Override
public Object getItem(int position) {
    return position;
}

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

public class Holder
{
    TextView tv;
    TextView tv2;
    Button deleteMemoBtn;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    Holder mViewHolder = null;

    if (convertView == null) {
        mViewHolder = new Holder();
        LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        convertView = vi.inflate(R.layout.list_memo, parent, false);
        mViewHolder.tv = (TextView) convertView.findViewById(R.id.textView1);
        mViewHolder.tv2 = (TextView) convertView.findViewById(R.id.textView2);
        mViewHolder.deleteMemoBtn = (Button) convertView.findViewById(R.id.deleteMemoBtn);

        mViewHolder.tv.setText(memos.get(position).getMemoTitle());
        mViewHolder.tv2.setText(Integer.toString(memos.get(position).getMemoID()));

        mViewHolder.tv.setOnClickListener(new OnClickListener() {            
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "You Clicked " + memos.get(position).getMemoTitle(), Toast.LENGTH_LONG).show();
            }
        });  



        mViewHolder.deleteMemoBtn.setOnClickListener(new OnClickListener() {            
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "deleted " + Integer.toString(position), Toast.LENGTH_LONG).show();   
                memos.remove(position);
                notifyDataSetChanged();
            }
        });  


    }
    return convertView;
}


} 

Hoping someone can lighten me up why this code is not working.
Thank you!


Solution

  • Try this code.

    public class CustomAdapter extends BaseAdapter {
        List<Memo> memos;
        Context context;
        int[] imageId;
    
    
        private LayoutInflater inflater = null;
    
        public CustomAdapter(Context mainActivity, List<Memo> _memos) {
            memos = _memos;
            context = mainActivity;
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        @Override
        public int getCount() {
            return memos.size();
        }
    
        @Override
        public Object getItem(int position) {
            return memos.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        public class Holder {
            TextView tv;
            TextView tv2;
            Button deleteMemoBtn;
        }
    
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            Holder mViewHolder = null;
    
            if (convertView == null) {
                mViewHolder = new Holder();
    
                convertView = inflater.inflate(R.layout.list_memo, parent, false);
                mViewHolder.tv = (TextView) convertView.findViewById(R.id.textView1);
                mViewHolder.tv2 = (TextView) convertView.findViewById(R.id.textView2);
                mViewHolder.deleteMemoBtn = (Button) convertView.findViewById(R.id.deleteMemoBtn);
                convertView.setTag(mViewHolder);
            } else {
                mViewHolder = (Holder) convertView.getTag();
            }
    
            mViewHolder.tv.setText(memos.get(position).getMemoTitle());
            mViewHolder.tv2.setText(Integer.toString(memos.get(position).getMemoID()));
            mViewHolder.tv.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "You Clicked " + memos.get(position).getMemoTitle(), Toast.LENGTH_LONG).show();
                }
            });
            mViewHolder.deleteMemoBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "deleted " + Integer.toString(position), Toast.LENGTH_LONG).show();
                    memos.remove(position);
                    notifyDataSetChanged();
                }
            });
    
    
            return convertView;
        }
    
    
    }