在Android中从ListView中删除一个项目:一些OnClickListener停止工作(编辑:稍后会一次性调用它们)
我有一个带有自定义布局的在Android中从ListView中删除一个项目:一些OnClickListener停止工作(编辑:稍后会一次性调用它们),android,listview,onclicklistener,Android,Listview,Onclicklistener,我有一个带有自定义布局的列表视图。此布局有一个EditText和一个按钮来删除行 我希望用户能够向列表中添加项目(单击外部按钮)或从列表中删除项目(单击行中的按钮)。为了能够删除某一行(我需要它的位置),我决定实现一个OnClickListener,将项目位置存储为一个变量 问题是,一旦我删除一行,以下所有行的侦听器都会停止工作。为什么会这样? 因为当用户决定完成时,我必须检索EditText的值,所以我决定实现我的自定义适配器并将行存储在其中(ArrayList) 这是我的活动: pr
列表视图
。此布局有一个EditText
和一个按钮来删除行
我希望用户能够向列表中添加项目(单击外部按钮)或从列表中删除项目(单击行中的按钮)。为了能够删除某一行(我需要它的位置),我决定实现一个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();
}
private-ListView-mList;
私有模板字段适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_模板);
customFieldsLayout=(LinearLayout)findViewById(R.id.customFieldsContent);
numFields=0;
childs=newarraylist();
//mDragListen=new MyDragEventListener();
mList=(ListView)findViewById(R.id.customFieldsList);
适配器=新模板字段适配器(此);
mList.setAdapter(适配器);
mList.setClickable(假);
}
公共无效添加字段(视图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();
}
}
}
公共类TemplateFieldsAdapter扩展BaseAdapter{
私人充气机;
私有数组列表行;
私人整数计数;
私有上下文;
公共模板字段适配器(上下文){
mContext=上下文;
this.inflater=layoutiner.from(上下文);
行=新的ArrayList();
计数=0;
}
@凌驾
public int getCount(){
返回计数;
}
@凌驾
公共视图getItem(内部位置){
返回行。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
如果(rows.size()像那样使用delete
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View row = null;
LayoutInflater inflater = getLayoutInflater();
row = inflater.inflate(R.layout.one_result_details_row, parent, false);
// inflate other items here :
Button deleteButton = (Button) row.findViewById(R.id.Details_Button01);
deleteButton.setTag(position);
deleteButton.setOnClickListener(
new Button.OnClickListener() {
@Override
public void onClick(View v) {
Integer index = (Integer) view.getTag();
items.remove(index.intValue());
notifyDataSetChanged();
}
}
);
我找到的唯一解决方法是每次调用getView时创建视图:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(rows.size() <= position || rows.get(position) == null){ // If the View is not cached
rows.add(position, this.inflater.inflate(R.layout.template_field, null));
}
else{
View newView = this.inflater.inflate(R.layout.template_field, null);
((TextView)newView.findViewById(R.id.etFieldName)).setText(((TextView)rows.get(position).findViewById(R.id.etFieldName)).getText());
((TextView)newView.findViewById(R.id.etFieldUnit)).setText(((TextView)rows.get(position).findViewById(R.id.etFieldUnit)).getText());
rows.remove(position);
rows.add(position, newView);
}
rows.get(position).findViewById(R.id.removeImg).setTag(position);
rows.get(position).findViewById(R.id.removeImg).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Integer index = (Integer) v.getTag();
rows.remove(index.intValue());
count --;
mContext.updateList();
}
});
rows.get(position).findViewById(R.id.etFieldName).requestFocus();
return rows.get(position);
}
@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
如果(rows.size()仍然相同,则我无法获得单击事件。请问您为什么保留视图的列表而不是它们显示的数据?因为显示的数据最初是空的(行具有编辑文本),用户填充它。我决定存储视图并在最后检查它们,而不是每次用户修改EditText时都必须更新字符串的ArrayList。