Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用DiffUtils更新RecyclerView中的列表?_Android_Android Recyclerview_Android Diffutils - Fatal编程技术网

Android 如何使用DiffUtils更新RecyclerView中的列表?

Android 如何使用DiffUtils更新RecyclerView中的列表?,android,android-recyclerview,android-diffutils,Android,Android Recyclerview,Android Diffutils,当使用DiffUtil ItemCallback时,如何使用DiffCallback在RecyclerView中加载新列表 我想给用户一个选项,当用户选择我希望RecyclerView更新的不同大小时,可以从数据库返回不同大小的列表 回收器 RecyclerViewAdapter extends ListAdapter<WordEntity, RecyclerViewAdapter.ViewHolder> { private RecyclerViewAdapter() { s

当使用DiffUtil ItemCallback时,如何使用DiffCallback在RecyclerView中加载新列表

我想给用户一个选项,当用户选择我希望RecyclerView更新的不同大小时,可以从数据库返回不同大小的列表

回收器

RecyclerViewAdapter extends ListAdapter<WordEntity, RecyclerViewAdapter.ViewHolder> {
private RecyclerViewAdapter() {
    super(DIFF_CALLBACK);
}

private static final DiffUtil.ItemCallback<WordEntity> DIFF_CALLBACK = new DiffUtil.ItemCallback<WordEntiti>() {

    @Override
    public boolean areItemsTheSame...

    @Override
    public boolean areContentsTheSame...
};

@Override
public viewHolder onCreateViewHolder...

@Override
public void onVindViewHolder ...

class ViewHolder extends RecyclerView.ViewHolder ...

public void updateWordList(List<WordEntity> words) {
    final WordDiffCallBack diffCallBack = new WordDiffCallBack(list???, words);
    final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallBack);

    this.list???.clear();
    this.addAll(words);
    diffResult.dispatcheUpdatesTo(this);
}
RecycleServiceAdapter扩展ListAdapter{
私人回收服务适配器(){
超级(差异回调);
}
私有静态final DiffUtil.ItemCallback DIFF_CALLBACK=new DiffUtil.ItemCallback(){
@凌驾
公共布尔项是相同的。。。
@凌驾
公共布尔值的内容相同。。。
};
@凌驾
公共视图持有者onCreateViewHolder。。。
@凌驾
公开无效的文件。。。
类ViewHolder扩展了RecyclerView.ViewHolder。。。
public void updateWordList(列出单词){
final WordDiffCallBack diffCallBack=新单词diffCallBack(列表??,单词);
最终DiffUtil.diffesult diffesult=DiffUtil.calculateDiff(diffCallBack);
此.list???.clear();
这个。addAll(单词);
衍射结果。发送更新至(本);
}
WordsDiffCallBack

private final List<WordEntity> mOldList;
private final List<WordEntity> mNewList;

public WordsDiffCallBack(List<WordEntity> oldList, List<WordEntity> newList) {
    this.mOldList = oldList;
    this.mNewList = newList;
}

@Override
public int getOldListSize() {
    return mOldList.size();
}

@Override
public int getNewListSize() {
    return mNewList.size();
}

@Override
public boolean areItemsTheSame(int OldItemPostion, int newItemPosition) ...

@Override boolean areContentsTheSame(int oldItemPosition, int newItemPosition)...

@Override getChangePayload(int oldItemPosition, int newItemPosition) ...
}

私人最终列表模具列表;
私人最终名单;
PublicWordsDiffCallback(列表oldList、列表newList){
this.mOldList=旧列表;
this.mNewList=newList;
}
@凌驾
public int getOldListSize(){
返回mOldList.size();
}
@凌驾
public int getNewListSize(){
返回mNewList.size();
}
@凌驾
公共布尔值areItemsTheSame(int-OldItemPosition,int-newItemPosition)。。。
@重写布尔值AreContentsSame(int-oldItemPosition,int-newItemPosition)。。。
@覆盖getChangePayload(int-oldItemPosition,int-newItemPosition)。。。
}
我希望RecycelView在用户更改列表大小时自动更新。如何从ListAdapter调用旧列表,这会更新RecyclerView吗

这是我的diffutil回调

public class MyDiffUtilCallback extends DiffUtil.Callback {

List<String> oldlist;
List<String > newlist;

public MyDiffUtilCallback(List<String> oldlist, List<String> newlist) {
    this.oldlist = oldlist;
    this.newlist = newlist;
}
@Override
public int getOldListSize() {
    return oldlist.size();
}
@Override
public int getNewListSize() {
    return newlist.size();
}
@Override
public boolean areItemsTheSame(int olditempostion, int newitemPostion) {
    return olditempostion==newitemPostion;
}
@Override
public boolean areContentsTheSame(int olditempostion, int newitemPostion) {
    return olditempostion==newitemPostion;
}
@Nullable
@Override
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
    return super.getChangePayload(oldItemPosition, newItemPosition);
}
public class recyclerviewAdapter extends RecyclerView.Adapter<recyclerviewAdapter.Viewholder> {

List<String> datasource;

public recyclerviewAdapter(List<String> datasource) {
    this.datasource = datasource;
}

@Override
public Viewholder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.demorow,viewGroup,false);
    return new Viewholder(itemView);
}

@Override
public void onBindViewHolder(@NonNull Viewholder viewholder, int i) {
    viewholder.tv_demo_data_row.setText(datasource.get(i));
}

@Override
public int getItemCount() {
    return datasource.size();
}

public static class Viewholder extends RecyclerView.ViewHolder {

    TextView tv_demo_data_row;

    public Viewholder(@NonNull View itemView) {
        super(itemView);

        tv_demo_data_row=itemView.findViewById(R.id.tv_demo_data_row);
    }
}

//DIFF CALLBACK STATE
public void insertdata(List<String> insertList){
    /**
     * Insert list insert data to list
     */
    MyDiffUtilCallback diffUtilCallback = new MyDiffUtilCallback(datasource,insertList);
    DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffUtilCallback);
    datasource.addAll(insertList);
    diffResult.dispatchUpdatesTo(this);
}

public void updateList(List<String> newList){
    /**
     * update list clear old data and update new data
     */
    MyDiffUtilCallback diffUtilCallback = new MyDiffUtilCallback(datasource,newList);
    DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffUtilCallback);
    datasource.clear();
    datasource.addAll(newList);
    diffResult.dispatchUpdatesTo(this);
}}
公共类MyDiffUtilCallback扩展了DiffUtil.Callback{ 旧名单; 列表新建列表; 公共MyDiffUtilCallback(列表旧列表、列表新列表){ this.oldlist=oldlist; this.newlist=newlist; } @凌驾 public int getOldListSize(){ 返回oldlist.size(); } @凌驾 public int getNewListSize(){ 返回newlist.size(); } @凌驾 公共布尔值areItemsTheSame(int-olditempostion、int-newitemPostion){ return olditempostion==newitemPostion; } @凌驾 公共布尔值是相同的内容(int-olditempostion、int-newitemPostion){ return olditempostion==newitemPostion; } @可空 @凌驾 公共对象getChangePayload(int-oldItemPosition、int-newItemPosition){ 返回super.getChangePayload(oldItemPosition、newItemPosition); } }

这是使用DiffulicCallback的recyclerview Adpeter

public class MyDiffUtilCallback extends DiffUtil.Callback {

List<String> oldlist;
List<String > newlist;

public MyDiffUtilCallback(List<String> oldlist, List<String> newlist) {
    this.oldlist = oldlist;
    this.newlist = newlist;
}
@Override
public int getOldListSize() {
    return oldlist.size();
}
@Override
public int getNewListSize() {
    return newlist.size();
}
@Override
public boolean areItemsTheSame(int olditempostion, int newitemPostion) {
    return olditempostion==newitemPostion;
}
@Override
public boolean areContentsTheSame(int olditempostion, int newitemPostion) {
    return olditempostion==newitemPostion;
}
@Nullable
@Override
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
    return super.getChangePayload(oldItemPosition, newItemPosition);
}
public class recyclerviewAdapter extends RecyclerView.Adapter<recyclerviewAdapter.Viewholder> {

List<String> datasource;

public recyclerviewAdapter(List<String> datasource) {
    this.datasource = datasource;
}

@Override
public Viewholder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.demorow,viewGroup,false);
    return new Viewholder(itemView);
}

@Override
public void onBindViewHolder(@NonNull Viewholder viewholder, int i) {
    viewholder.tv_demo_data_row.setText(datasource.get(i));
}

@Override
public int getItemCount() {
    return datasource.size();
}

public static class Viewholder extends RecyclerView.ViewHolder {

    TextView tv_demo_data_row;

    public Viewholder(@NonNull View itemView) {
        super(itemView);

        tv_demo_data_row=itemView.findViewById(R.id.tv_demo_data_row);
    }
}

//DIFF CALLBACK STATE
public void insertdata(List<String> insertList){
    /**
     * Insert list insert data to list
     */
    MyDiffUtilCallback diffUtilCallback = new MyDiffUtilCallback(datasource,insertList);
    DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffUtilCallback);
    datasource.addAll(insertList);
    diffResult.dispatchUpdatesTo(this);
}

public void updateList(List<String> newList){
    /**
     * update list clear old data and update new data
     */
    MyDiffUtilCallback diffUtilCallback = new MyDiffUtilCallback(datasource,newList);
    DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffUtilCallback);
    datasource.clear();
    datasource.addAll(newList);
    diffResult.dispatchUpdatesTo(this);
}}
公共类RecycleServiceAdapter扩展了RecyclerView.Adapter{
列出数据源;
公共RecycleServiceAdapter(列表数据源){
this.datasource=数据源;
}
@凌驾
public Viewholder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){
View itemView=LayoutFlater.from(viewGroup.getContext()).inflate(R.layout.demorow,viewGroup,false);
返回新的Viewholder(itemView);
}
@凌驾
public void onBindViewHolder(@NonNull Viewholder Viewholder,int i){
viewholder.tv_demo_data_row.setText(datasource.get(i));
}
@凌驾
public int getItemCount(){
返回datasource.size();
}
公共静态类Viewholder扩展了RecyclerView.Viewholder{
TextView tv\u demo\u data\u行;
公共视图持有者(@NonNull View itemView){
超级(项目视图);
tv\u demo\u data\u row=itemView.findviewbyd(R.id.tv\u demo\u data\u row);
}
}
//差异回调状态
公共void insertdata(列表insertList){
/**
*插入列表将数据插入列表
*/
MyDiffUtilCallback diffUtilCallback=新的MyDiffUtilCallback(数据源,插入列表);
DiffUtil.DiffiesUlt DiffiesUlt=DiffUtil.calculateDiff(diffUtilCallback);
addAll(insertList);
diffResult.dispatchUpdatesTo(本);
}
公共无效更新列表(列表新建列表){
/**
*更新列表清除旧数据并更新新数据
*/
MyDiffUtilCallback diffUtilCallback=新的MyDiffUtilCallback(数据源,newList);
DiffUtil.DiffiesUlt DiffiesUlt=DiffUtil.calculateDiff(diffUtilCallback);
datasource.clear();
addAll(newList);
diffResult.dispatchUpdatesTo(本);
}}
在这里,我可以更新按钮clickevent活动中的列表

insert_data.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //inserting the data
            List<String> insertlist = new ArrayList<>(); //asign old list
            for(int i=0;i<2;i++){
                insertlist.add(UUID.randomUUID().toString()); // insert new list
                adapter.insertdata(insertlist);
                faster_recyclerview.smoothScrollToPosition(adapter.getItemCount()-1); //auto scroll to last postion
            }
        }
    });
insert_data.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//插入数据
List insertlist=new ArrayList();//asign旧列表

对于(int i=0;i,您可以创建一个模板,如youTube上的视频所示:

下面是适配器的一个示例

public class CartFragAdapter extends RecyclerView.Adapter<CartFragAdapter.CartFragViewHolder> {

    private static final String TAG = "debinf PurchaseAdap";

    private static final DiffUtil.ItemCallback<ProductsObject> DIFF_CALLBACK = new DiffUtil.ItemCallback<ProductsObject>() {
        @Override
        public boolean areItemsTheSame(@NonNull ProductsObject oldProduct, @NonNull ProductsObject newProduct) {
            Log.i(TAG, "areItemsTheSame: old is "+oldProduct.getCode()+" ; new is "+newProduct.getCode());
            return oldProduct.getCode().equals(newProduct.getCode());
        }

        @Override
        public boolean areContentsTheSame(@NonNull ProductsObject oldProduct, @NonNull ProductsObject newProduct) {
            Log.i(TAG, "areContentsTheSame: old is "+oldProduct.getPrice()+" ; new is "+newProduct.getPrice());
            return oldProduct.getPrice() == newProduct.getPrice();
        }
    };

    private AsyncListDiffer<ProductsObject> differ = new AsyncListDiffer<ProductsObject>(this, DIFF_CALLBACK);

    @NonNull
    @Override
    public CartFragViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_purchase, parent, false);
        return new CartFragViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull CartFragViewHolder holder, int position) {
        final ProductsObject purchaseList = differ.getCurrentList().get(position);

        holder.mCode.setText(purchaseList.getCode());
        holder.mPrice.setText(String.valueOf(purchaseList.getPrice()));
        holder.mDescription.setText(purchaseList.getDescription());


    }

    @Override
    public int getItemCount() {
        Log.i(TAG, "getItemCount");
        return differ.getCurrentList().size();
    }

    public void submitList(List<ProductsObject> products){
        Log.i(TAG, "submitList: products.size is "+products.size());
        differ.submitList(products);
    }

    public class CartFragViewHolder extends RecyclerView.ViewHolder {

        public TextView mCode, mPrice, mDescription;

        public CartFragViewHolder(@NonNull View itemView) {
            super(itemView);

            mCode = (TextView) itemView.findViewById(R.id.item_productCode);
            mPrice = (TextView) itemView.findViewById(R.id.item_productPrice);
            mDescription = (TextView) itemView.findViewById(R.id.item_productDescription);
        }
    }
}

我希望它能有所帮助!

除上述内容外(使用DiffUtils),如果您使用单击更改RecyclerView的内容,请

ViewHolder implements View.OnClickListener
并使用此选项在onBindViewHolder中设置OnClickListener

.setOnClickListener(holder);
并通过

this.getAdapterPosition()
私有类HistoryRecyclerAdapter扩展了RecyclerView.Adapter{
私人名单条目;
HistoryRecyclerAdapter(列表条目){
this.entries=条目;
}
公共无效更新容器(列表){
DiffUtil.diffesult diffesult=DiffUtil.calculateDiff(新的DiffUtil.Callback(){
@凌驾
public int getOldListSize(){return entries.size();}
@凌驾
public int getNewListSize(){return list.size();}
@凌驾
公共布尔值areItemsTheSame(int-oldItemPosition,int-newItemPosition){
返回条目.get(oldItemPosition).getId()==list.get(newItemPosition).getId();
}
@凌驾
公共布尔值是相同的内容(int oldItemP