Search code examples
androidlistviewevent-handlingandroid-event

Event error when clicked each delete button in Android ListView


I am making Android app but I am stuck on constructing list view. I want to remove each item by using delete button on each list item. What I mean that if I press a delete button in a specific row, a list item on the same row should be removed.

However, I got some bugs on here. When I press any delete buttons on the view, only last item on the view is deleted, not the item in same row. I don't know why each delete button's event action is connected to only last item's id.

Here is my Adapter code.

public View getView(int i, View convertView, ViewGroup parent){
    if(convertView == null){
        convertView = LayoutInflater.from(context).inflate(R.layout.item,null);
        viewHolder = new ViewHolder();
        viewHolder.nickname_textView = (TextView)convertView.findViewById(R.id.nickname);
        viewHolder.content_textView = (TextView)convertView.findViewById(R.id.post_content);
        viewHolder.date_textView = (TextView)convertView.findViewById(R.id.date);
        viewHolder.company_textView = (TextView)convertView.findViewById(R.id.company);
        viewHolder.location_textView = (TextView)convertView.findViewById(R.id.location);
        viewHolder.profile_imageView = (ImageView)convertView.findViewById(R.id.imageView);
        viewHolder.deleteButton = (Button)convertView.findViewById(R.id.deleteButton);
        viewHolder.idHolder_textView = (TextView)convertView.findViewById(R.id.idView);

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

    viewHolder.nickname_textView.setText(list_itemArrayList.get(i).getNickname());
    viewHolder.content_textView.setText(list_itemArrayList.get(i).getContent());
    viewHolder.date_textView.setText(list_itemArrayList.get(i).getWrite_date().toString());
    viewHolder.location_textView.setText(list_itemArrayList.get(i).getLocation());
    viewHolder.company_textView.setText(list_itemArrayList.get(i).getCompany());
    viewHolder.profile_imageView.setImageResource(list_itemArrayList.get(i).getProfile_image());
    viewHolder.idHolder_textView.setText(""+list_itemArrayList.get(i).getId());
    viewHolder.idHolder_textView.setVisibility(View.INVISIBLE);
    viewHolder.deleteButton.setId(list_itemArrayList.get(i).getId());

    viewHolder.deleteButton.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
            String sID = viewHolder.idHolder_textView.getText().toString();
            long id = Long.parseLong(sID);

            UserPosts deletePost = new UserPosts(context);
            deletePost.open();
            deletePost.deleteItem(id);
            deletePost.close();
        }
    });

    return convertView;
}

I have no idea why my deleteButton.setOnClickListener doesn't work well. Thank you.

Here is my application screenshot enter image description here


Solution

  • viewHolder.idHolder_textView.getText() will return the value of last visible items of the ListView. Try replacing these lines

    String sID = viewHolder.idHolder_textView.getText().toString();
            long id = Long.parseLong(sID);
    

    With this

    long id = list_itemArrayList.get(i).getId();