android:如何使用行中的删除按钮从ListView中删除行

时间:2011-10-20 05:06:07

标签: android listview

我知道有很多主题或多或少相同的主题,但没有一个涵盖我的情况:

我使用自定义行使用自定义CursorAdapter填充ListView。我有两个ListView状态:第一个状态只包含行中的文本;第二个状态在每一行都有一个删除按钮。两种状态之间的切换是视图底部的按钮。

我尝试实现的目标是:在第一个状态下,当我点击该行时,屏幕应切换到另一个视图。在第二种状态下,当我点击删除按钮时,应该从数据库中删除所选行,应该重新填充ListView,如果我按下删除按钮以外的行的任何其他部分,则不会发生任何事情。

我知道如何删除项目并在之后重新填充ListView,当我点击第一个状态的行时,我知道如何切换到另一个视图;但我无法将两者结合起来。我使用以下方法来获取行的id和位置:

protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
     //Code goes in here either for deleting or switching into another view
}

我尝试使用一些if语句来获取点击删除按钮的条件或单击行但是它不起作用。

第一个问题很明显:我怎样才能使它发挥作用?

第二个问题是:在第二个状态下,当按下行的任何部分而不是删除按钮屏幕切换到另一个视图。我怎么能阻止这个?我试图将行的.setClickable,.setPressed,.setSelected属性设置为false,但它没有帮助。

感谢您提前回复。

2 个答案:

答案 0 :(得分:25)

  

在第二个状态下,当按下行的任何部分而不是删除按钮屏幕切换到另一个视图。我该如何防止这种情况?

只需拥有deleteButton

的监听器
   @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()方法中,将ListItem标记为位置

deleteButton.setTag(position);

getTag()对象转换为整数

然后在OnClickListener()中删除项目

 items.remove(index.intValue());  

答案 1 :(得分:0)

我认为以下代码对第二个问题更好:

Button ic_delete = (Button) row.findViewById(R.id.ib_delete);

        ic_delete.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {

                // delete row from database
                notifyDataSetChanged();

            }

        });