【问题标题】:android list array adapter.notifydatasetchanged not updating view correctlyandroid list array adapter.notifydatasetchanged没有正确更新视图
【发布时间】:2014-08-09 10:53:02
【问题描述】:

在我的 android 应用程序中,我试图将列表项删除为 -

dla.remove(itemselected);
Toast.makeText(getApplicationContext(), "Pos is : "+pos+": Item is "+itemselected.getTitle(), Toast.LENGTH_SHORT).show();
dla.notifyDataSetChanged();
dla.notifyDataSetInvalidated(); 

适配器getView()

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v=convertView;
    LayoutInflater inflater=(LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if(v==null){
        v=inflater.inflate(R.layout.downloaditem, parent,false);
        title=(TextView) v.findViewById(R.id.downTitle);
        status =(TextView) v.findViewById(R.id.downStatus);
        pb=(ProgressBar) v.findViewById(R.id.downprogressBar);

        title.setText(list.get(position).getTitle());
        status.setText(UnitConverter.convert(list.get(position).getDownloaded())+"/"+UnitConverter.convert(list.get(position).getFileSize())+" ("+
        list.get(position).getPercentage()+"%)");
        pb.setProgress(list.get(position).getPercentage());
        return v;
    }
else{
return v;
}

}

我在删除一个项目后记录了ListView,该项目被删除但没有正确更新view,我的意思是只删除了ListView 中最后一个项目。

例如。如果我在第 0 个索引处删除项目,它会被删除,但只删除最后一个项目。我会犯什么错误?

【问题讨论】:

  • 尝试重置适配器,而不是调用notifyDataSetChanged()。也许它应该工作。
  • 你能告诉我pos来自哪里
  • @FlatEric AdapterContextMenuInfo menuinfo=(AdapterContextMenuInfo) item.getMenuInfo(); int pos=menuinfo.position;
  • @T-Rush 我也尝试重新创建也不起作用的适配器
  • 可能itemselected 与位置pos 的项目不同。你可以试试dla.remove(dla.getItem(pos));

标签: android android-listview


【解决方案1】:

你的问题在这里:

 View v=convertView;

    if(v==null){
    }

您没有为 if 提供 else 语句,如果转换视图不为空,则不填充它。 所以你需要改变的是:

  @Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v=convertView;
    LayoutInflater inflater=(LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if(v==null){
        v=inflater.inflate(R.layout.downloaditem, parent,false);
    }
        title=(TextView) v.findViewById(R.id.downTitle);
        status =(TextView) v.findViewById(R.id.downStatus);
        pb=(ProgressBar) v.findViewById(R.id.downprogressBar);

        title.setText(list.get(position).getTitle());
        status.setText(UnitConverter.convert(list.get(position).getDownloaded())+"/"+UnitConverter.convert(list.get(position).getFileSize())+" ("+
        list.get(position).getPercentage()+"%)");
        pb.setProgress(list.get(position).getPercentage());


    return v;
}

【讨论】:

  • 如果 convertView 不为空,则不会进入 if 循环并返回不为空的 v。
  • 不,那么convertView 是无效的,convertView 是一个让android 使用更少内存并且GC 不会经常调用的对象。当您滚动视图并且对该位置无效的旧项目在其中时,此视图将被回收,因此您再次使用它而不是创建新对象来浪费内存。因此,当它传递给您时,您必须在任何情况下填充它,但要根据 listView 的当前位置使用正确的数据。
  • 我发布了完整的解决方案,您是否正在执行此操作并且没有显示任何内容?
猜你喜欢
  • 2023-03-17
  • 2016-03-19
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 2017-03-09
相关资源
最近更新 更多