我有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 都会立即调用。这真的很奇怪。[/编辑]