Еще один Adapter.notifyDataSetChanged () не работает - Android - PullRequest
0 голосов
/ 24 апреля 2018

Я использовал метод для заполнения адаптера, как показано ниже:

  1. Установите компоненты пользовательского интерфейса в пользовательский метод внутри onCreate(...)

//..
mRecentSales = new ArrayList<>();
        recentSaleAdapter = new RecentSaleAdapter(getApplicationContext(), R.layout.row_recent_sale, mRecentSales);
        lvRecentSales.setAdapter(recentSaleAdapter);
//.
Загрузите в другой поток данные для адаптера сразу после 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;
}

}

Результат не тот, который я ожидал, так как список ничего не показывает.

1 Ответ

0 голосов
/ 25 апреля 2018

В итоге я получил Async Tasks.

Кажется, с этим связана ошибка, и 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();
    }
    
...