我有一个ListView,其中每个列表项行都有一个具有人名和删除按钮的自定义布局。
我不知道如何在删除按钮中对事件处理程序进行编码,以便删除该行。我知道我需要删除ArrayList中的项目,然后调用adapter.notifyDataSetChanged(),但是我无法访问自定义行布局类中的ArrayList或适配器。
我已经看到了一些类似的问题,但我没有看到任何涉及自定义列表项布局中的删除按钮。
我能想到的唯一可能的解决方案是将对适配器对象的引用以及对ArrayList的引用传递到PersonLayout(在适配器的getView()方法中执行此操作),但是是一个更好的解决方案。
以下是代码:
/**
* PersonLayout is the layout for a single list item (row) in the listview.
* It displays the name for a single person.
*
* Each PersonLayout row also contains a delete button that is used to delete that row.
*
* I do not know what I should do in onClick() for the delete button
* in order to delete this row.
*/
public class PersonLayout extends RelativeLayout implements OnClickListener
{
private TextView nameTextView;
private Button deleteButton;
private Person person;
private Context context;
public PersonLayout(Context context)
{
super(context);
}
public PersonLayout(Context context, Person p)
{
super(context);
this.context = context;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.listview_person, this, true);
nameTextView = (TextView) findViewById(R.id.nameTextView);
deleteButton = (Button) findViewById(R.id.deleteButton);
this.setOnClickListener(this);
setPerson(p);
}
public void setPerson(Person p)
{
person = p;
nameTextView.setText(p.getName());
}
@Override
public void onClick(View v)
{
// handle delete button click
// How do I delete the current list item (row) ?
}
} // end class PersonLayout
/**
* The custom adapter for the ListView.
*/
public class PeopleListAdapter extends BaseAdapter
{
private Context context;
private ArrayList<Person> people;
public PeopleListAdapter(Context context, ArrayList<Person> people)
{
this.context = context;
this.people = people
}
@Override
public int getCount()
{
return people.size();
}
@Override
public Object getItem(int position)
{
return people.get(position);
}
@Override getItemId(int position)
{
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
PersonLayout personLayout = null;
Person person = people.get(position);
if (convertView == null)
{
personLayout = new PersonLayout(context, person);
}
else
{
personLayout = (PersonLayout) convertView;
personLayout.setPerson(person);
}
return personLayout;
}
} // end class PeopleListAdapter
答案 0 :(得分:3)
为什么要为布局创建新类?您可以创建一个布局xml并在适配器的getView方法中对其进行充气。
如果您这样做,可以在适配器的getview方法中设置单击侦听器,并从那里您可以访问arraylist和适配器。
答案 1 :(得分:1)
我有同样的问题。经过这么多天的搜索,与代表们在JAVA概念中达成和解。 这是一个教程Click here。然后在删除按钮上添加单击侦听器。从该事件发送删除操作到必要的对象。您也可以尝试Mark Buikema的回答。