2016-10-12 7 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; 
    } 
} 

私の問題は、私が追加または1つ、私はそれは常にリストビュー内の最初の行ではなく、クリック1つを取り外しています、削除を選択するどのように多くのアイテムという問題です。

+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

@カルナル私はこのようにして、私の問題を解決しました。 – 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; 
} 

EDIT:するか、黒帯が言うように、あなたは単にあればブロックのうち、holder.getRemove().setTag(position);文を移動することができます。

+0

ええ、私はブラックベルトが言ったことをした、そして今働いている。私はしかし、質問があります。あなたが提案したようにそれを行うことを選択した場合、 'int index =(int)v.getTag();'はタグを設定しないのでもう使用できません。 – user3501779

+0

はい、ifブロックからクリックリスナーを定義すると、タグを設定する必要はありません。 – yrazlik

0

良い方法あなたがgetViewメソッドに渡された位置を()することができ、最終的な パブリックビューgetViewメソッド(最終int型の位置、表示convertView、のViewGroupの親) とクリックリスナー内のその位置を使用します。

関連する問題