gpt4 book ai didi

java - 我的 DiffUtil 实现有什么问题?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:48:58 27 4
gpt4 key购买 nike

更新:其中一个问题解决了:现在updateList解决了,问题是我把mAdapter定义为RecyclerView .Adapter 而不是 MyAdapter。但是现在即使我正在获取数据,列表中也没有显示任何内容,它是空的

--------------------原帖---------------- --

我想使用 DiffUtil 更新我的 RecyclerView 以防止重复。

我有 4 个类:User 类、我设置数据的 Activity 类、Adapter 类和 DiffUtil 类。我不确定我是否正确组合了所有这 4 个。

这是用户类:

public class User {

private String mUserId;
private Uri mImageUrl;


public User(String userId, String imageUrl) {
mUserId = userId;
mImageUrl = Uri.parse(imageUrl);
}


public String getUserId() {
return mUserId;
}

public Uri getImageUrl() {
return mImageUrl;
}
}

这就是我动态设置数据的方式(我不断从服务器获取新的 Json 数组,其中包含要显示的用户 ID,然后我从 Firebase 存储中设置用户图像): (这是一个由 onClick 监听器调用的函数:)

这是 fragment 中的方法调用:

button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
updateUsersList();
}
});

这是函数:

   private void updateUsersList() {
@Override
public void onResponse(JSONArray response) { // the JSON ARRAY response of user ids ["uid1", "uid334", "uid1123"]
myDataset.clear(); // clear dataset to prevent duplicates
for (int i = 0; i < response.length(); i++) {
try {
String userKey = response.get(i).toString(); // the currently iterated user id
final DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userKeyRef = rootRef.child("users").child(userKey); // reference to currently iterated user
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
myDataset.add(new User(dataSnapshot.getKey(), dataSnapshot.child("imageUrl").getValue().toString())); //add new user: id and image url
mAdapter.updateList(myDataset); // cannot resolve this method, why?
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
userKeyRef.addListenerForSingleValueEvent(listener);
}
catch (JSONException e) { Log.d(TAG, "message " + e); }
}
}

这是我的 DiffUtil 类的样子:

public class MyDiffUtilCallBack extends DiffUtil.Callback{

ArrayList<User> oldUsers;
ArrayList<User> newUsers;

public MyDiffUtilCallBack(ArrayList<User> newUsers, ArrayList<User> oldUsers) {
this.newUsers = newUsers;
this.oldUsers = oldUsers;
}

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

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

@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return oldUsers.get(oldItemPosition).getUserId().equals( newUsers.get(newItemPosition).getUserId());
}

@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return oldUsers.get(oldItemPosition).equals(newUsers.get(newItemPosition));
}

@Nullable
@Override
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
//you can return particular field for changed item.
return super.getChangePayload(oldItemPosition, newItemPosition);
}
}

这是我的适配器:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

private ArrayList<User> mDataset;
private MyViewHolder myHolder;
private User user;

public static class MyViewHolder extends RecyclerView.ViewHolder {

public TextView singleItemTextView;
public ImageView singleItemImage;
public View layout;
public ConstraintLayout constraintLayout;
public MyViewHolder(View v) {
super(v);
layout = v;
singleItemImage = (ImageView) v.findViewById(R.id.icon);
singleItemTextView = (TextView) v.findViewById(R.id.singleitemtv);
constraintLayout = (ConstraintLayout) v.findViewById(R.id.nbConstraintLayout);
}
}

// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(ArrayList<User> myDataset) {
mDataset = myDataset;
}

// Create new views (invoked by the layout manager)
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {


View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.nb_image_view, parent, false);

MyViewHolder vh = new MyViewHolder(v);
return vh;
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
myHolder = holder;


user = mDataset.get(position);
Uri userImage = user.getImageUrl();
myHolder.singleItemTextView.setText(user.getUserId());

Glide.with(myHolder.itemView.getContext() /* context */)
.load(userImage)
.into(myHolder.singleItemImage);
myHolder.constraintLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Context context = v.getContext();
Intent intent = new Intent(v.getContext(), DisplayUserActivity.class);
context.startActivity(intent);
}
});

}
public void updateList(ArrayList<User> newList) {
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new MyDiffUtilCallBack(this.mDataset, newList));
diffResult.dispatchUpdatesTo(this);
}
}

我不确定我是否正确组合了所有类(我第一次使用 DiffUtil),而且我还得到了 cannot resolve method updateList(?)

我做错了什么?

这就是我在 Fragment 中定义 mAdapter 的方式:

public class MyFragment extends Fragment {
private ArrayList<User> myDataset;
private RecyclerView.Adapter mAdapter;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

// Inflate the layout for this fragment
rootView = inflater.inflate(R.layout.fragment_lks, container, false);

mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view);
myDataset = new ArrayList<User>();
mAdapter = new MyAdapter(myDataset);

最佳答案

问题出在 mAdapter 的定义上。您将其定义为 RecyclerView.Adapter,它是您的 MyAdapter 的父类(super class),并且不包含 updateList()。您应该按如下方式更改它:

private MyAdapter mAdapter;

2019 年 1 月 13 日更新:

我已经用 AsyncListDiffer 修改了你的适配器,它异步计算差异然后将它应用到适配器。

MyAdapter.java

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.constraint.ConstraintLayout;
import android.support.v7.recyclerview.extensions.AsyncListDiffer;
import android.support.v7.util.DiffUtil;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import java.util.List;


public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

private AsyncListDiffer<User> mAsyncListDiffer;

public static class MyViewHolder extends RecyclerView.ViewHolder {

public TextView singleItemTextView;
public ImageView singleItemImage;
public View layout;
public ConstraintLayout constraintLayout;

public MyViewHolder(View v) {
super(v);
layout = v;
singleItemImage = (ImageView) v.findViewById(R.id.icon);
singleItemTextView = (TextView) v.findViewById(R.id.singleitemtv);
constraintLayout = (ConstraintLayout) v.findViewById(R.id.nbConstraintLayout);
}
}

// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter() {
DiffUtil.ItemCallback<User> diffUtilCallback = new DiffUtil.ItemCallback<User>() {

@Override
public boolean areItemsTheSame(@NonNull User newUser, @NonNull User oldUser) {
return newUser.getUserId().equals(oldUser.getUserId());
}

@Override
public boolean areContentsTheSame(@NonNull User newUser, @NonNull User oldUser) {
return newUser.equals(oldUser);
}
};
mAsyncListDiffer = new AsyncListDiffer<>(this, diffUtilCallback);
}

// Create new views (invoked by the layout manager)
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.nb_image_view, parent, false);
MyViewHolder vh = new MyViewHolder(v);
return vh;
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
User user = mAsyncListDiffer.getCurrentList().get(position);
Uri userImage = user.getImageUrl();
holder.singleItemTextView.setText(user.getUserId());

Glide.with(holder.itemView.getContext() /* context */)
.load(userImage)
.into(holder.singleItemImage);

holder.constraintLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Context context = v.getContext();
Intent intent = new Intent(v.getContext(), DisplayUserActivity.class);
context.startActivity(intent);
}
});
}

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

public void updateList(List<User> newList) {
mAsyncListDiffer.submitList(newList);
}

}

用户.java

public class User {

private String mUserId;
private Uri mImageUrl;

public User(String userId, String imageUrl) {
mUserId = userId;
mImageUrl = Uri.parse(imageUrl);
}

public String getUserId() {
return mUserId;
}

public Uri getImageUrl() {
return mImageUrl;
}

@Override
public boolean equals(Object other) {
if (other instanceof User) {
User user = (User) other;
return mUserId.equals(user.getUserId()) && mImageUrl.equals(user.getImageUrl());
} else {
return false;
}
}

}

关于java - 我的 DiffUtil 实现有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54162101/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com