2015-02-24 136 views
0

这个问题遇到了我和很多机构在这里,但我还没有看到有效的答案。 我有列表中的每个项目的列表视图和删除按钮。当我点击按钮时,项目从数据库中删除,也从列表中删除,但列表视图不刷新项目。删除一个项目后刷新listview项目

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

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

这里是我的代码:

这里是整个代码:

公共类适配器注扩展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; 
} 

}

+0

那是什么'填写()'函数?它什么时候被叫?由谁?并使用哪些参数? – greenapps 2015-02-24 09:45:18

+0

如果可能,请显示更多代码片段 – 2015-02-24 10:12:20

+0

什么是“item”,什么是“deleteItem”? – 2015-02-24 10:19:08

回答

0

从列表或ArrayList中属于删除的项目到适配器根据列表的索引,然后尝试拨打notifyDataSetChanged()

+0

我做到了,但没有奏效。 – narcissus12 2015-02-24 15:50:43

0

您所面对的'具有相同标题部分的两个项目'的问题与听众与当前位置之间失去同步有关。尝试这样的事情,如果你的自定义产品类型:

Object item 

把它放在你旁边的文本视图的视图持有者。膨胀的观点之后,这样做:

holder.item = getItem(position); 

然后,而不是item.xx做到这一点:

holder.item.xx 
0

它,你需要通过调用yourAdapterObject.remove(POSITION);

从适配器中取出一件简单的事情

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

之后,您需要使用剩余的数据和信息刷新适配器。所以,你需要如下呼吁:

yourAdapterObject.notifyDataStateChanged(); 

此外here是由开发商网站显示动画给出的动画演示。但他们还表示,如何从列表中删除项目并将其添加到列表中。所有的作品都很好,动画效果不错。

我想它会帮助你。

享受编码... :)

+0

我做到了,但没有奏效。 – narcissus12 2015-02-24 15:52:28

+0

我做到了,但没有工作。 假设,我在我的列表中有3个项目,标题为:text1,text2和text3;除了每个项目还有一个删除按钮。当我点击text2旁边的删除按钮时,项目text2被删除,但列表显示我3项:text1,text3和text3! (实际上text2被删除,但列表显示的是:下面的项目出现) 当我退出程序并再次运行时,根本没有text2。 我不想重新启动应用程序。我希望我点击删除按钮时刷新列表。 – narcissus12 2015-02-24 16:15:54

+0

还有一些东西缺少更新或刷新。你可以请把你的Java文件从你使用这个功能的地方,以便我可以检查它。 – 2015-02-25 04:58:52

0

只要从数组列表中删除,并重新设置适配器到您的列表视图。在OnItemClickListener中执行此操作。

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

末到讨论...

当我做到了,从我使用适配器,列表视图是不会刷新的类。更糟糕的是,有时它会刷新,有时不会。我叫adapter.notifyDataSetChanged();

最后我得到了它通过制造方法来直接删除该转接器内的项目,像这样的工作:

CustomAdapter extends BaseAdapter { 

    public void deleteItem(AdapterItem ai) { 
     dataList.remove(ai); /*dataList = data source used by adapter*/ 
     notifyDataSetChanged(); 
    } 
} 
相关问题