私はListView
カスタムレイアウトを持っています。このレイアウトにはEditText
とButton
行を削除する があります。
ユーザーがリストに項目を追加したり (外側のボタンをクリック)、リストから項目を削除したり (行のボタンをクリック) できるようにしたい。特定の行を削除できるようにするために (その位置が必要です) OnClickListener
、アイテムの位置を変数として格納する場所を実装することにしました。
問題は、行を削除すると、次のすべての行リスナーが機能しなくなることです。何故ですか?
EditText
ユーザーが終了したと判断したときに の値を取得する必要があるため、カスタム アダプターを実装し、そこに行を格納することにしました (ArrayList)。
これは私の活動です:
private ListView mList;
private TemplateFieldsAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_template);
customFieldsLayout = (LinearLayout) findViewById(R.id.customFieldsContent);
numFields = 0;
childs = new ArrayList<View>();
// mDragListen = new MyDragEventListener();
mList = (ListView) findViewById(R.id.customFieldsList);
adapter = new TemplateFieldsAdapter(this);
mList.setAdapter(adapter);
mList.setClickable(false);
}
public void AddField(View v){
adapter.addItem();
adapter.notifyDataSetChanged();
}
そして、これは私のアダプターです:
public class TemplateFieldsAdapter extends BaseAdapter{
private LayoutInflater inflater;
private ArrayList<View> rows;
private int count;
private Context mContext;
public TemplateFieldsAdapter(Context context){
mContext = context;
this.inflater = LayoutInflater.from(context);
rows = new ArrayList<View>();
count = 0;
}
@Override
public int getCount() {
return count;
}
@Override
public View getItem(int position) {
return rows.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(rows.size() <= position || rows.get(position) == null){ // If the View is not cached
// Inflates the Common View from XML file
rows.add(position, this.inflater.inflate(R.layout.template_field, null));
rows.get(position).findViewById(R.id.removeImg).setOnClickListener(new DeleteRow(position));
}
return rows.get(position);
}
public void addItem(){
count ++;
}
private class DeleteRow implements View.OnClickListener{
private int position;
public DeleteRow(int pos){
this.position = pos;
}
@Override
public void onClick(View v) {
rows.remove(position);
count --;
notifyDataSetChanged();
}
}
}
アイテムを削除するときにリスナーを更新する必要があることはわかっていますが (位置が変更されるため)、コードを削除して理解しやすくしました。
4 つの項目を追加してから、位置 1 の項目を削除すると、位置 2 と 3 (現在は位置 1 と 2) のリスナーが機能しなくなり、onClick 関数は呼び出されません。誰もそれを修正する方法を知っていますか?
ありがとう!
【追記】面白いものを見つけました。上記の例では、onClick 関数は呼び出されないと言いましたが、実際には呼び出されていません。しかし、その後、(新しい項目を追加するために) 外側のボタンをクリックすると、一度に呼び出されなかったすべての onClicks が呼び出されます。これは本当に奇妙です。[/編集]