还有一个 Adapter.notifyDataSetChanged() 不工作 - Android

Yet another Adapter.notifyDataSetChanged() not working - Android

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

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

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

@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;
}

}

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

我最终放弃了异步任务。

它似乎有一个错误,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();
    }