2016-10-12 115 views
0

我有一個自定義適配器和一個列表,我在動態添加項目時按鈕單擊。每個列表行都有一個刪除按鈕(或圖像)。這是我的自定義適配器類:嘗試從ListView中刪除項目總是刪除第一個項目

package com.ameer.easycooking; 

import android.content.Context; 
import android.media.Image; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.List; 

/** 
* Created by ameer on 12/10/2016. 
*/ 
public class IngredientAdapter extends ArrayAdapter<String> { 
    private List<String> ingredientList; 
    private Context context; 

    public IngredientAdapter(List<String> ingredientList, Context context) { 
     super(context, R.layout.ingredient_list_item, ingredientList); 
     this.ingredientList = ingredientList; 
     this.context = context; 
    } 

    public static class IngredientHolder { 
     private TextView name; 
     private ImageView remove; 

     public IngredientHolder(TextView name, ImageView remove) { 
      this.name = name; 
      this.remove = remove; 
     } 

     public TextView getName() { 
      return name; 
     } 

     public ImageView getRemove() { 
      return remove; 
     } 
    } 

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

     IngredientHolder holder; 

     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = inflater.inflate(R.layout.ingredient_list_item, null); 

      holder = new IngredientHolder((TextView) v.findViewById(R.id.ingredientName), (ImageView) v.findViewById(R.id.remove)); 

      holder.getRemove().setTag(position); 

      holder.getRemove().setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int index = (int) v.getTag(); 
        Toast.makeText(context, ingredientList.get(index) + " removed", Toast.LENGTH_SHORT).show(); 
        ingredientList.remove(index); 
        notifyDataSetChanged(); 
       } 
      }); 

      v.setTag(holder); 
     } else { 
      holder = (IngredientHolder) v.getTag(); 
     } 

     String ingredient = ingredientList.get(position); 
     holder.name.setText(ingredient); 

     return v; 
    } 
} 

我的問題是,我選擇無論有多少個項目添加或其中之一刪除,它總是在ListView除去第一排,而不是點擊一個。

+1

移動'holder.getRemove().setTag(position);'在你的if/else邏輯之後 – Blackbelt

+1

@Blackbelt謝謝你,現在工作正常。 :) – user3501779

回答

1

您只會遇到convertView == null一次,這就是爲什麼你有這個問題。您應在if/else陳述後設置holder.getRemove().setTag(position);

+0

沒有onClickListener。只有'holder.getRemove()。setTag(position);' – Blackbelt

+0

是的,這是真的你在說什麼。 – Carnal

+0

@Carnal我這樣做了,它解決了我的問題。 – user3501779

1

您不應該在您的if語句中設置您的點擊偵聽器,因爲您無法知道何時將使用轉換後的視圖,並且點擊的位置可能是錯誤的。所以,只要將點擊收聽出來的if語句,並刪除holder.getRemove().setTag(position)聲明:

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

    IngredientHolder holder; 

    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.ingredient_list_item, null); 
     holder = new IngredientHolder((TextView) v.findViewById(R.id.ingredientName), (ImageView) v.findViewById(R.id.remove)); 
     v.setTag(holder); 
    } else { 
     holder = (IngredientHolder) v.getTag(); 
    } 

    String ingredient = ingredientList.get(position); 
    holder.name.setText(ingredient); 

    holder.getRemove().setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      int index = (int) v.getTag(); 
      Toast.makeText(context, ingredientList.get(index) + " removed", Toast.LENGTH_SHORT).show(); 
      ingredientList.remove(index); 
      notifyDataSetChanged(); 
     } 
    }); 

    return v; 
} 

編輯:或者作爲黑帶說,你可以只簡單地移動holder.getRemove().setTag(position);陳述出來,如果塊。

+0

是的,我做了Blackbelt說的,它現在正在工作。但我有個問題。如果我選擇像你所建議的那樣做,那麼'int index =(int)v.getTag();'將不再起作用,因爲我不會爲它設置標籤,不是? – user3501779

+0

是的,但是如果您將點擊監聽器定義在if塊之外,那麼您不需要設置標籤。 – yrazlik

0

更好的辦法可以使()在getView通過位置最終 公共查看getView(最終詮釋的立場,觀點convertView,ViewGroup以及母公司) 和使用點擊監聽器裏那個位置。