我有一个CustomAdapter类,它在getView方法中指向4个小部件(3个TextViews和1个Button)。我希望能够在任何行中单击按钮并删除该特定行。我在Adapter类的getView方法中为我的Button设置了一个onClick方法。问题是,每次按下按钮,它都会删除创建的最后一行而不是我想要的特定行。这是我的getView方法:
@Override
public View getView(final int position, final View convertView, ViewGroup parent) {
View view = convertView;
if (view == null){
view = inflater.inflate(R.layout.contacts_custom_row,null);
Button deleteBtn = (Button)view.findViewById(R.id.customRowDeleteButton);
TextView name = (TextView)view.findViewById(R.id.customRowContactName);
TextView phone = (TextView)view.findViewById(R.id.customRowContactNumber);
TextView email = (TextView)view.findViewById(R.id.customRowContactEmail);
name.setText(names.get(position));
phone.setText(phoneNumbers.get(position));
email.setText(emails.get(position));
phone.setOnClickListener(this);
deleteBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//This is the Issue I think, the position number
names.remove(position);
phoneNumbers.remove(position);
emails.remove(position);
notifyDataSetChanged();
}
});
}
return view;
}
答案 0 :(得分:1)
试试这个......
@Override
public View getView(final int position, final View convertView, ViewGroup parent) {
final Holder holder;
if (convertView == null) {
holder = new Holder();
convertView = ((LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE)).inflate(R.layout.contacts_custom_row, parent, false);
holder.deleteBtn = (Button)convertView.findViewById(R.id.customRowDeleteButton);
holder.name = (TextView)convertView.findViewById(R.id.customRowContactName);
holder.phone = (TextView)convertView.findViewById(R.id.customRowContactNumber);
holder.email = (TextView)convertView.findViewById(R.id.customRowContactEmail);
convertView.setTag(holder);
} else {
holder = (Holder) convertView.getTag();
}
holder.name.setText(names.get(position));
holder.phone.setText(phoneNumbers.get(position));
holder.email.setText(emails.get(position));
holder.pos = position;
holder.phone.setOnClickListener(this);
holder.deleteBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
names.remove(holder.pos);
phoneNumbers.remove(holder.pos);
emails.remove(holder.pos);
notifyDataSetChanged();
}
});
}
return convertView;
}
static class Holder{
Button deleteBtn ;
TextView name, phone, email;
int pos;
}
答案 1 :(得分:0)
声明全局变量int pos = 0;
然后
更改此
TextView phone = (TextView)view.findViewById(R.id.customRowContactNumber);
TextView email = (TextView)view.findViewById(R.id.customRowContactEmail);
name.setText(names.get(position));
phone.setText(phoneNumbers.get(position));
到此
TextView phone = (TextView)view.findViewById(R.id.customRowContactNumber);
TextView email = (TextView)view.findViewById(R.id.customRowContactEmail);
pos = names.get(position);
name.setText(names.get(position));
phone.setText(phoneNumbers.get(position));
使用pos
进入删除按钮侦听器,将其从列表中删除。问题是,如果您的列表从数据库填充,您必须从数据库中删除该项目,否则每次启动应用程序时,您删除的列表项仍将存在。
答案 2 :(得分:0)
请尝试使用onListItemClick
。将其放在您声明Activity
的{{1}}或Fragment
内,而不是ListView
Adapter