2016-10-12 118 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以及母公司) 和使用点击监听器里那个位置。