【问题标题】:My listview is not being updated even after calling notifydatasetchanged()即使在调用 notifydatasetchanged() 后,我的列表视图也没有更新
【发布时间】:2016-11-03 14:15:20
【问题描述】:

我不知道为什么,但我的列表视图没有更新...我正在调用 notifyDataSetChanged() 并且我还尝试了他们要求这样做的另一个答案:

 private void editTransaction(int position) {
    h = historyItems.get(position);
    historyItems.remove(position);
    this.position = position;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 5 && resultCode == RESULT_OK) {
        String description = data.getStringExtra("description");
        if (description == null) description = "no description";

        double amount = Double.parseDouble(data.getStringExtra("amount"));

        h.setDescription(description);
        h.setAmount(amount);
        //h.setTimestamp(System.currentTimeMillis());

        //this is where I am updating my arraylist....

        historyItems.add(position,h);
        adapter.notifyDataSetChanged();


        user.makeEdit(h);

    }
}

这是在我的自定义适配器中。

public class HistoryCustomAdapter extends BaseAdapter {

Context context;
ArrayList<HistoryItem> historyItems;
HashMap<String,String> iconMapper;

private static LayoutInflater inflater=null;

public HistoryCustomAdapter(Context context, ArrayList<HistoryItem> historyItems, HashMap<String, String> iconMapper) {
    this.context=context;
    this.historyItems=historyItems;
    this.iconMapper=iconMapper;
    inflater = ( LayoutInflater )context.
            getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return historyItems != null ? historyItems.size() : 0;
}

@Override
public Object getItem(int position) {
    return historyItems.get(position);
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    Holder holder;
    if (convertView == null) {
        holder = new Holder();
        LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.history_item, parent, false);

        holder.tvCat = (TextView)convertView.findViewById(R.id.tv_category);
        holder.tvAmt = (TextView)convertView.findViewById(R.id.tv_amount);
        holder.tvDate = (TextView)convertView.findViewById(R.id.tv_date);
        holder.img = (ImageView)convertView.findViewById(R.id.iv);
        convertView.setTag(holder);

    }

    holder=(Holder)convertView.getTag();
    HistoryItem historyItem;
    historyItem = historyItems.get(position);

    holder.tvCat.setText(historyItem.getCategory());
    holder.tvAmt.setText(historyItem.getAmount()+"");

    DateFormat df = new SimpleDateFormat("yyyy/MM/dd kk:mm:ss");
    Calendar c    = Calendar.getInstance();
    c.setTimeInMillis(historyItem.getTimestamp());
    Date day      = c.getTime();

    holder.tvDate.setText(df.format(day));

    Resources res = context.getResources();
    String mDrawableName = iconMapper.get(historyItem.getCategory());
    int resID = res.getIdentifier(mDrawableName , "drawable", context.getPackageName());
    holder.img.setImageResource(resID);

    return convertView;
}

public void refresh(ArrayList<HistoryItem> historyItems)
{
    this.historyItems.clear();
    this.historyItems.addAll(historyItems);
    //notifyDataSetChanged();
}

public class Holder
{
    TextView tvCat,tvAmt,tvDate;
    ImageView img;
}

}

我不知道为什么我的列表视图没有立即更新...我应该切换到 ArrayAdapters 吗?

【问题讨论】:

  • 该类是 ArrayAdapter 吗?如果是这样,请使用 adapter.addAll 而不是您的刷新方法
  • 它没有用...它给了我一个清晰的屏幕
  • public void refresh(ArrayList historyItems) { this.historyItems.clear(); this.historyItems = historyItems; notifyDataSetChanged(); }
  • 不...它扩展了 BaseAdapter
  • 如果你没有看到数据,你可能需要让getCount不返回0

标签: java android listview android-adapter


【解决方案1】:

尝试清除您的this.historyItems,然后清除this.historyItems.addAll(historyItems)。希望它有效!

无论如何,如果你尝试 ViewHolder Pattern,你应该重用它:

if (rowView == null) {
   // init view, holder
   rowView.setTag(holder)
} else {
   holder = (Holder) rowView.getTag();
}

// fill data

这可能是您的列表视图没有立即反映的原因。

【讨论】:

  • public void refresh(ArrayList historyItems) { this.historyItems.clear(); this.historyItems.addAll(historyItems); notifyDataSetChanged(); }
  • 你的参数 historyItems 有数据吗?
  • 请记住,如果您持有对 historyItems 的引用,notifiyDataSetChange() 将起作用,而不是在刷新函数中分配数据。
  • 是的...我在日志中检查了它...此外,当我返回并再次打开列表视图时,更改会反映...它们只是没有立即反映跨度>
  • 你在哪里调用refresh函数?
【解决方案2】:

当您将新的 ArrayList 分配给 this.historyItems 时,将无法再通知数据,因为您丢失了对您最初指定的 Arraylist 的引用。

如果您希望该方法起作用,您需要覆盖getCount 和getItem。

但你也需要

this.historyItems.clear();
this.historyItems.addAll(historyItems);

或者,如果使用 ArrayAdapter,则不需要将列表作为成员变量

clear();
addAll(historyItems);

那么,notifyDatasetChanged 应该可以工作了

【讨论】:

  • 我正在这样做:this.historyItems.clear(); this.historyItems.addAll(historyItems);此外,getCount 和 getItem 被覆盖...
  • @Override public int getCount() { return historyItems != null ? historyItems.size() : 0; } public Object getItem(int position) { return historyItems.get(position); }
  • 我觉得不错。为了阻止我们猜测问题,您必须在帖子中显示minimal reproducible example
  • 我的代码 sn-p 现在可以了吗@cricket_007?请看一下....谢谢
  • 您可以尝试不将适配器作为内部类吗?我想你可能会跨越对 Arraylist 的引用
【解决方案3】:

在拨打adapter.notifyDataSetChanged();之前尝试.setAdapter(adapter)

【讨论】:

    【解决方案4】:

    请检查此方法

    public void refresh(ArrayList<HistoryItem> historyitems)
    {
        this.historyItems=historyitems;
        notifyDataSetChanged();
    }
    

    这样做。它会工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      相关资源
      最近更新 更多