【问题标题】:Yet another Adapter.notifyDataSetChanged() not working - Android另一个 Adapter.notifyDataSetChanged() 不工作 - Android
【发布时间】:2018-04-24 17:18:29
【问题描述】:

我一直在使用如下方法填充适配器:

  1. onCreate(...)内的自定义方法中设置UI组件

//..
mRecentSales = new ArrayList<>();
        recentSaleAdapter = new RecentSaleAdapter(getApplicationContext(), R.layout.row_recent_sale, mRecentSales);
        lvRecentSales.setAdapter(recentSaleAdapter);
//.
  1. 在另一个线程中加载适配器的数据,就在onResume() 之后

@Override
public void onLoadingPrepare() {
    super.onLoadingPrepare();
    if (qDaySales == null)
        qDaySales = new ArrayList<>();
    else
        qDaySales.clear();
    if (mRecentSales == null)
        mRecentSales = new ArrayList<>();
    else
        mRecentSales.clear();
}

@Override
public void onLoading() {
    super.onLoading();
    todayIncome = Conversor.asCurrency(presenter.getDaySales());
    performance = presenter.getImprovement(getApplicationContext());
    for (int i = 1; i<= DateTime.now().getDayOfMonth(); i++){
        qDaySales.add(new Entry(i, presenter.getSalesFromDay(i)));
    }
    mRecentSales.addAll(presenter.getRecentSales());
}

@Override
public void onLoadingComplete() {
    super.onLoadingComplete();
    tvTodayIncome.setText(todayIncome);
    tvPerformance.setText(performance);
    setPerformanceChart(qDaySales);
    recentSaleAdapter.notifyDataSetChanged();
}

这是适配器代码:

public class RecentSaleAdapter extends ArrayAdapter<MTicket> {

public RecentSaleAdapter(@NonNull Context context, int resource, @NonNull List objects) {
    super(context, resource, objects);
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    if (convertView == null){
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_recent_sale, null);
    }
    MTicket ticket = getItem(position);
    TextView tvTicketId = (TextView)convertView.findViewById(R.id.tv_ticket_id);
    TextView tvTicketReference = (TextView)convertView.findViewById(R.id.tv_ticket_reference);
    TextView tvTicketTotal = (TextView)convertView.findViewById(R.id.tv_ticket_total);
    if (ticket != null){
        tvTicketId.setText(String.format("# %d", ticket.id));
        tvTicketReference.setText(ticket.ticketReference);
        tvTicketTotal.setText(ticket.maskSaleTotal);
    }
    return convertView;
}

@Override
public long getItemId(int position) {
    MTicket ticket = getItem(position);
    if (ticket != null)
        return ticket.id;
    return -1;
}

}

结果不是我所期望的,因为列表没有显示任何内容。

【问题讨论】:

  • 您应该发布适配器的代码。
  • 调试你的代码并确保在recentSaleAdapter.notifyDataSetChanged();mRecentSales之前填充了数据。
  • 最近几天一直在这样做。在方法onLoading() 之后,它的大小会按预期变化
  • 调试你的代码。在调试器通过 mRecentSales.addAll(presenter.getRecentSales());检查适配器中的 objects 字段,看看那里是否有元素。如果它们不存在但项目存在于 mRecentSales 中,请查看 mRecentSales 的使用情况并确保此列表中只有一个引用。
  • 附加步骤之后。我可以确认当对象加载到recentSales.addAll(presenter.getRecentSales())recentSalesAdapter 也会发生变化。我开始认为这是 Android 平台的错误

标签: android list listview adapter


【解决方案1】:

我最终放弃了异步任务。

它似乎有一个错误,Android 无法正确处理回调。

这是由此产生的解决方法:

  1. 我没有在onLoading() 方法中填充对象列表,而是在主线程中调用所有需要的方法。

    @Override
    protected void onResume() {
        super.onResume();
        setTitle(getPreferenceString(SettingsActivity.KEY_BUSINESS_NAME,
            getString(R.string.set_default_business_name)));
        start(); // <- This will start the Async Task
        mRecentSales.clear();
        mRecentSales.addAll(presenter.getRecentSales());
        recentSaleAdapter.notifyDataSetChanged();
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多