0

我试图使用分页库实现一个带有分页的用户列表。但是,尽管能够从后端获取所有数据,但 PagedList 在观察 LiveData 时为空。

这是代码。

用户模型.java

class User{
@SerializedName("user_id")
public int user_id;

@SerializedName("username")
public String username;

@SerializedName("name")
public String name;

@SerializedName("familyname")
public String familyname;

@SerializedName("pp_dir")
public String pp_url; }

public class UserModel {

@SerializedName("users")
public List<User> list;

@SerializedName("last_page")
public boolean lastPage;

@SerializedName("total_page")
public int totalPage;

@SerializedName("total_user_count")
public int totalUserCount;}

用户搜索数据源.java

public class UserSearchDataSource extends ItemKeyedDataSource<Integer, User> {

public static final int PAGE_SIZE = 15;
private static final int FIRST_PAGE = 1;

@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull LoadInitialCallback<User> callback) {
    RetrofitClient.getInstance().getApi().getAllUsers(FIRST_PAGE, PAGE_SIZE).enqueue(new Callback<UserModel>() {
        @Override
        public void onResponse(Call<UserModel> call, Response<UserModel> response) {
            if (response.body() != null) {
                callback.onResult(response.body().list);
                System.out.println(response.body().list);
            }
            else {
                System.out.println(response.code());
                System.out.println(response.message());
            }
        }

        @Override
        public void onFailure(Call<UserModel> call, Throwable t) {
            System.out.println(t.getMessage());
        }
    });
}

@Override
public void loadAfter(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<User> callback) {
    RetrofitClient.getInstance().getApi().getAllUsers(FIRST_PAGE, PAGE_SIZE).enqueue(new Callback<UserModel>() {
        @Override
        public void onResponse(Call<UserModel> call, Response<UserModel> response) {
            if (response.body() != null) {
                //Integer key = response.body().lastPage ? null : params.key + 1;
                callback.onResult(response.body().list);
            }
        }

        @Override
        public void onFailure(Call<UserModel> call, Throwable t) {

        }
    });
}

@Override
public void loadBefore(@NonNull LoadParams<Integer> params, @NonNull LoadCallback<User> callback) {
    RetrofitClient.getInstance().getApi().getAllUsers(FIRST_PAGE, PAGE_SIZE).enqueue(new Callback<UserModel>() {
        @Override
        public void onResponse(Call<UserModel> call, Response<UserModel> response) {
            if (response.body() != null) {
                //Integer key = (params.key > 1) ? params.key - 1 : null;
                callback.onResult(response.body().list);
            }
            else {
                System.out.println(response.message());
            }
        }

        @Override
        public void onFailure(Call<UserModel> call, Throwable t) {
            System.out.println(t.getMessage());
        }
    });
}

@NonNull
@Override
public Integer getKey(@NonNull User item) {
    return item.user_id;
} }

UserSearchDataSourceFactory.java

public class UserSearchDataSourceFactory extends DataSource.Factory<Integer, User> {

private MutableLiveData<UserSearchDataSource> userLiveDataSource = new MutableLiveData<>();

public UserSearchDataSourceFactory() {

}

@NonNull
@Override
public DataSource<Integer, User> create() {
    UserSearchDataSource dataSource = new UserSearchDataSource();
    userLiveDataSource.postValue(dataSource);
    return dataSource;
}

public MutableLiveData<UserSearchDataSource> getUserLiveDataSource() {
    return userLiveDataSource;
} }

用户搜索适配器.java

public class UserSearchAdapter extends PagedListAdapter<User, UserSearchAdapter.ViewHolder> {

private Context context;

UserSearchAdapter(Context context) {
    super(DIFF_CALLBACK);
    this.context = context;
}

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

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    User model = getItem(position);
    if (model != null) {
        Picasso.get().load(model.pp_url).into(holder.userPp);
        holder.tvUsername.setText(model.username);
        holder.tvFullname.setText(model.name.concat(" ").concat(model.familyname));
    }
    else {
        Toast.makeText(context, "Item is null", Toast.LENGTH_LONG).show();
    }
}

private static DiffUtil.ItemCallback<User> DIFF_CALLBACK = new DiffUtil.ItemCallback<User>() {
    @Override
    public boolean areItemsTheSame(@NonNull User oldItem, @NonNull User newItem) {
        return oldItem.user_id == newItem.user_id;
    }

    @SuppressLint("DiffUtilEquals")
    @Override
    public boolean areContentsTheSame(@NonNull User oldItem, @NonNull User newItem) {
        return oldItem.equals(newItem);
    }
};

public class ViewHolder extends RecyclerView.ViewHolder {
    ImageView userPp;
    TextView tvUsername, tvFullname;
    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        userPp = itemView.findViewById(R.id.image_user);
        tvUsername = itemView.findViewById(R.id.tv_username);
        tvFullname = itemView.findViewById(R.id.tv_fullname);
    }
} }

UserSearchViewModel.java

public class UserSearchViewModel extends AndroidViewModel {

private LiveData<PagedList<User>> userPagedList;
LiveData<UserSearchDataSource> liveDataSource;

public UserSearchViewModel(Application application) {
    super(application);

}

public LiveData<PagedList<User>> getUserPagedList() {
    UserSearchDataSourceFactory userSearchDataSourceFactory = new UserSearchDataSourceFactory();
    liveDataSource = userSearchDataSourceFactory.getUserLiveDataSource();
    PagedList.Config config = (new PagedList.Config.Builder())
            .setEnablePlaceholders(true)
            .setPageSize(UserSearchDataSource.PAGE_SIZE)
            .build();
    userPagedList = new LivePagedListBuilder<>(userSearchDataSourceFactory, config).build();
    return userPagedList;
} }

用户搜索片段.java

mViewModel.getUserPagedList().observe(this, (PagedList<User> users) -> {
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setHasFixedSize(true);
        adapter = new UserSearchAdapter(getContext());
        adapter.submitList(users);
        recyclerView.setAdapter(adapter);
        //System.out.println(users.get(0).name);
    });
4

0 回答 0