【问题标题】:Refreshing listview items after deleting one item删除一项后刷新列表视图项
【发布时间】:2015-02-24 09:39:41
【问题描述】:

我和这里的很多机构都遇到过这个问题,但我还没有看到有效的答案。 对于列表中的每个项目,我都有一个列表视图和一个删除按钮。当我单击按钮时,该项目将从数据库中删除并从列表中删除,但列表视图不会刷新项目。

我已经调用了方法notifyDataSetChanged(),但没有结果。(当项目被删除时,下一个项目的标题出现,似乎有两个项目有一个标题,一个接一个地排序)。 myListView.invalidateViews()myListView.invalidate() 也不起作用。

确切的原因是什么,绝对的解决方案是什么?

这是我的代码:

以下是全部代码:

公共类 AdapterNote 扩展 ArrayAdapter {

public AdapterNote(ArrayList<StructNote> notes) {
    super(G.context, R.layout.adapter_note, notes);
}

private class ViewHolder {

    TextView     txtTitle;
    ImageView    imgDelete;


    public ViewHolder(View view) {
        txtTitle = (TextView) view.findViewById(R.id.txtTitle);
        imgDelete = (ImageView) view.findViewById(R.id.imgDelete);
    }

    public void fill(final ArrayAdapter<StructNote> adapter, final StructNote item, final int position) {
        txtTitle.setText(item.title + "");          
        imgDelete.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                G.notes.remove(item);
                adapter.remove(item);
                deleteDataFromDatabase(item.id);
                G.adapter.notifyDataSetChanged();

            }
        });
    }
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    StructNote item = getItem(position);
    if (convertView == null) {
        convertView = G.inflater.inflate(R.layout.adapter_note, parent, false);
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);
    }
    else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.fill(this, item, position);
    return convertView;
}

}

【问题讨论】:

  • fill() 函数是什么?什么时候叫?由谁?以及使用哪些参数?
  • 如果可能,显示更多 sn-p
  • 这里的“item”是什么,“deleteItem”是什么?
  • 我写了上面的全部代码。请检查代码。这个问题真是烦死我了!

标签: android listview


【解决方案1】:

根据列表的索引从列表中移除该项目或ArrayList属于适配器,然后尝试调用notifyDataSetChanged()

【讨论】:

    【解决方案2】:

    这很简单,您需要通过调用yourAdapterObject.remove(POSITION);将其从适配器中删除

    这里,yourAdapterObject 是适配器的对象,POSITION 是您要从列表视图中删除的位置。

    之后,您需要使用剩余的数据和信息刷新适配器。因此,您需要按以下方式调用:

    yourAdapterObject.notifyDataStateChanged();
    

    另外here是开发者网站提供的Animation demo,用于展示动画。但他们也展示了如何从列表中删除项目并将其添加到列表中。一切都很好,动画效果很好。

    我想它会对你有帮助。

    享受编码... :)

    【讨论】:

    • 我做到了,但没有奏效。假设,我的列表中有 3 个项目的标题:text1、text2 和 text3;每个项目旁边还有一个删除按钮。当我单击 text2 旁边的删除按钮时,项目 text2 被删除,但列表显示 3 个项目:text1、text3 和 text3! (实际上 text2 已被删除,但列表显示的是:出现以下项目)当我退出程序并再次运行时,根本没有 text2。我不想重新启动应用程序。当我点击删除按钮时,我希望我的列表得到刷新。
    • 您肯定缺少一些需要更新或刷新的内容。您能否将您的 java 文件放在您使用此功能的位置,以便我检查它。
    【解决方案3】:

    您面临的关于“具有相同标题部分的两个项目”的问题与听众和当前位置之间失去同步有关。如果您的自定义项目属于以下类型,请尝试这样的操作:

    Object item
    

    将它放在文本视图旁边的视图架中。膨胀视图后,执行以下操作:

    holder.item = getItem(position);
    

    然后,代替 item.xx 这样做:

    holder.item.xx
    

    【讨论】:

      【解决方案4】:

      只需将其从您的数组列表中删除,然后再次将适配器设置为您的列表视图。在 OnItemClickListener 中执行此操作。

      private OnItemClickListener listPairedClickItem = new OnItemClickListener() {
          @Override
          public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
              arrlist.remove(2);
              lv.setAdapter(adapter);
          }
      };
      

      【讨论】:

        【解决方案5】:
        int pos = nameList.indexOf(object);
        nameList.remove(pos);
        listAdapter.notifyDataSetChanged();
        

        【讨论】:

          【解决方案6】:

          讨论迟到了……

          当我从使用适配器的类中执行此操作时,列表视图不会刷新。更糟糕的是,在某一时刻,它有时会刷新,有时则不会。我已经打电话给adapter.notifyDataSetChanged();

          最后我通过创建一个直接在适配器内部删除项目的方法来实现它,如下所示:

          CustomAdapter extends BaseAdapter {
          
              public void deleteItem(AdapterItem ai) {
                  dataList.remove(ai); /*dataList = data source used by adapter*/
                  notifyDataSetChanged();   
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2013-10-03
            • 2019-08-16
            • 2018-08-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-28
            • 1970-01-01
            相关资源
            最近更新 更多