繁体   English   中英

另一个Adapter.notifyDataSetChanged()无法正常工作-Android

[英]Yet another Adapter.notifyDataSetChanged() not working - Android

我一直在使用一种方法来填充适配器,如下所示:

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

}

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

我最终放弃了异步任务。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM