Как обновить специфицированный c ассортимент в адаптере утилита просмотра - PullRequest
0 голосов
/ 04 мая 2020

У меня есть recyclerView. Я получаю список с сервера и показываю его в своем списке. У меня есть pagination, и когда я прокручиваю вниз, я прошу server, чтобы получить следующие, например, 50 пунктов Единственная проблема, когда я получаю ответ, я обновляю весь адаптер, используя notifyDataSetChanged().

mViewModel.getList().observe(
            getViewLifecycleOwner(),
            listResult -> {
                recycler.getAdapter().notifyDataSetChanged();
            });

Это просто, я использую ViewModel. Когда мой наблюдатель уведомляет меня, я звоню notifyDataSetChanged(). Мой адаптер получает список от ViewModel. И когда я получаю следующие 50 элементов с сервера, я просто добавляю новые элементы в существующий список. А после вызова notifyDataSetChanged() адаптер обновляет весь список новыми 50 пунктами. Так как же я могу обновить только последние 50 элементов, которые я получаю с сервера? Когда я добавляю эти элементы в список, мне нужно уведомить адаптер об обновлении его данных. Там я нашел один notifyItemInserted();, но ему нужна позиция.

1 Ответ

1 голос
/ 04 мая 2020

Вы можете использовать DiffUtils С AsyncListDiffer для выполнения работы (я вам это говорю, но я не совсем понимаю, как это работает внутри). Это делает рисунок простым и управляемым системой Android. Я прочитал и обнаружил в некоторых сообщениях, что AsyncListDiffer проверяет новые элементы и рисует только новые элементы.

Вот некоторые коды, которые помогут вам:

Класс адаптера

import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.AsyncListDiffer;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.SortedSet;

import neilsayok.github.launchertest5.R;
import neilsayok.github.launchertest5.adapter.viewholder.AppDrawerItemVH;
import neilsayok.github.launchertest5.data.AppInfo;

public class AppDrawerRVAdapter extends RecyclerView.Adapter<AppDrawerItemVH> {


    private Context context;

    private AsyncListDiffer<AppInfo> appList;


    public AppDrawerRVAdapter(Context context) {
        this.context = context;
        appList = new AsyncListDiffer<>(this, new DiffUtil.ItemCallback<AppInfo>() {

            @Override
            public boolean areItemsTheSame(@NonNull AppInfo oldItem, @NonNull AppInfo newItem) {
                return TextUtils.equals(oldItem.getPackageName(), newItem.getPackageName());
            }

            @Override
            public boolean areContentsTheSame(@NonNull AppInfo oldItem, @NonNull AppInfo newItem) {
                return TextUtils.equals(newItem.getLable(), oldItem.getLable());
            }
        });
    }

    public void submitList(SortedSet<AppInfo> data) {
        appList.submitList(new ArrayList<AppInfo>(data));
    }


    @NonNull
    @Override
    public AppDrawerItemVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new AppDrawerItemVH(LayoutInflater.from(context).inflate(R.layout.app_drawer_item,
                parent, false));
    }

    @Override
    public void onBindViewHolder(@NonNull AppDrawerItemVH holder, int position) {
        final AppInfo app = appList.getCurrentList().get(position);
        holder.getAppIcon().setImageDrawable(app.getAppIcon());
        holder.getAppLable().setText(app.getLable());

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(app.getPackageName());
                context.startActivity(launchIntent);
            }
        });
    }

    @Override
    public int getItemCount() {
        if (appList == null)
            return 0;
        else
            return appList.getCurrentList().size();    }
}

Класс AppInfo (Это мой класс POJO только для справки)

import android.graphics.drawable.Drawable;

public class AppInfo {
    private String lable;
    private String packageName;
    private Drawable appIcon;

    public AppInfo() {
    }

    public AppInfo(String lable, String packageName, Drawable appIcon) {
        this.lable = lable;
        this.packageName = packageName;
        this.appIcon = appIcon;
    }

    public String getLable() {
        return lable;
    }

    public void setLable(String lable) {
        this.lable = lable;
    }

    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }

    public Drawable getAppIcon() {
        return appIcon;
    }

    public void setAppIcon(Drawable appIcon) {
        this.appIcon = appIcon;
    }
}


Измените эту строку в вашем ViewModel Observer:

recycler.getAdapter().notifyDataSetChanged(); на appDrawerRVAdapter.submitList(appInfos); где appDrawerRVAdapter является объектом адаптера.

При использовании этого метода вам не придется вызывать notifydatachanged() или что-то подобное. Эта ссылка мне очень помогла.

...