【问题标题】:android: how to delete a row from a ListView with a delete button in the rowandroid:如何使用行中的删除按钮从 ListView 中删除一行
【发布时间】:2011-10-20 05:06:07
【问题描述】:

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

我正在使用我的自定义行使用自定义 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,但没有帮助。

感谢您提前回复。

【问题讨论】:

    标签: android listview


    【解决方案1】:

    在第二种状态下,当按下除删除按钮以外的行的任何部分时,屏幕会切换到另一个视图。我怎样才能防止这种情况发生?

    只需为 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());  
    

    【讨论】:

    • Reno,这里需要 deleteButton.setTag(position);,我想没有 setTag() 和 getTag() 我们也可以使用 items.remove(position); notifyDataSetChanged();还是我错过了一些有用的东西?
    • @Lalit 我认为如果有ListView 项目不构成实际项目的一部分,那将不起作用。 (例如标题)。在这种情况下,有两个适配器,一个是您自己的,另一个是由ListView 内部维护的
    • @Reno 好的,谢谢您的信息,但我尝试使用我坚持的方法并且正在工作,那么将来也会继续关注您的想法,这看起来不错。
    • 整数索引 = (Integer) view.getTag();什么是观点????视图是如何使用的,可以解释一下吗??
    • 什么是item及其移除方法?
    【解决方案2】:

    我认为下面的代码更适合第二个问题:

    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();
    
                }
    
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      相关资源
      最近更新 更多