如何编写删除当前列表项的自定义ListView项中的删除按钮?

时间:2014-05-05 12:57:28

标签: android android-listview android-adapter

我有一个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

2 个答案:

答案 0 :(得分:3)

为什么要为布局创建新类?您可以创建一个布局xml并在适配器的getView方法中对其进行充气。

如果您这样做,可以在适配器的getview方法中设置单击侦听器,并从那里您可以访问arraylist和适配器。

答案 1 :(得分:1)

我有同样的问题。经过这么多天的搜索,与代表们在JAVA概念中达成和解。 这是一个教程Click here。然后在删除按钮上添加单击侦听器。从该事件发送删除操作到必要的对象。您也可以尝试Mark Buikema的回答。