-3

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

Wongeun Cho
  • 101
  • 2
  • 10

1 Answers1

0

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();
Suresh Kumar
  • 2,014
  • 3
  • 19
  • 32
  • I can't use index 'i' in the setOnclickListener method ㅠㅠ – Wongeun Cho May 30 '17 at 06:21
  • create a final variable and initialize it with i, then use that final variable instead of i like this `final int finalI = i;`. Add this line before your button click. Use finalI instead of i like this `long id = list_itemArrayList.get(finalI).getId();` – Suresh Kumar May 30 '17 at 06:26
  • 1
    @SureshKumar good suggestion for making the position final in getview method – Ravindra Kushwaha May 30 '17 at 06:36