[英]RecyclerView only shows new items when more items are added
我有一個無限滾動的RecyclerView
。 當片段打開時,它會將前十個項目加載到RecyclerView
,一切都很好。 但是當它加載接下來的十個項目時,它不會將它們添加到現有項目中,而是刪除舊項目並僅顯示新項目。
所以我的問題是:當我加載更多時,為什么不保留舊物品?
我從這里使用無盡滾動。
片段.java
public class twoFragment extends Fragment implements LifecycleOwner {
private twoViewModel twoViewModel;
private RecyclerView recyclerView;
private RecyclerViewAdapter recyclerViewAdapter;
private EndlessRecyclerViewScrollListener scrollListener;
WebRequest webRequest = new WebRequest();
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
System.out.println("************ onCreateView ***********");
System.out.println("************ ViewModelProvider ***********");
twoViewModel = new ViewModelProvider(this).get(twoViewModel.class);
View root = inflater.inflate(R.layout.two, container, false);
recyclerView = root.findViewById(R.id.rv_main);
recyclerView.setHasFixedSize(true);
recyclerViewAdapter = new RecyclerViewAdapter(requireActivity());
final int columns = getResources().getInteger(R.integer.gallery_columns);
GridLayoutManager gridLayoutManager = new GridLayoutManager(requireActivity(), columns);
recyclerView.setLayoutManager(gridLayoutManager);
// Endless scrolling
scrollListener = new EndlessRecyclerViewScrollListener(gridLayoutManager) {
@Override
public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
// Triggered only when new data needs to be appended to the list
// Add whatever code is needed to append new items to the bottom of the list
System.out.println("************ onLoadMore >>> EndlessRecyclerViewScrollListener ***********");
System.out.println("************ onLoadMore >>> page ***********" + page);
webRequest.MakeRequest("BROWSE_REQUEST", page +1, "", twoViewModel.getUserMutableLiveData());
}
};
// Adds the scroll listener to RecyclerView
recyclerView.addOnScrollListener(scrollListener);
twoViewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(),userListUpdateObserver);
return root;
};
private Observer<ArrayList<User>> userListUpdateObserver = new Observer<ArrayList<User>>() {
@Override
public void onChanged(ArrayList<User> userArrayList) {
System.out.println("************ onChanged ***********");
recyclerView.setAdapter(recyclerViewAdapter);
((RecyclerViewAdapter)recyclerView.getAdapter()).setData(userArrayList);
}
};
}
RecyclerViewAdapter.java
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Activity context;
private ArrayList<User> userArrayList;
public RecyclerViewAdapter(Activity context) {
this.context = context;
this.userArrayList = userArrayList;
}
public void setData(ArrayList<User> userArrayListOne){
userArrayList = userArrayListOne;
notifyDataSetChanged();
System.out.println("%% %% notifyDataSetChanged %% %%");
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
System.out.println("************ onCreateViewHolder ***********");
View rootView = LayoutInflater.from(context).inflate(R.layout.item,parent,false);
return new RecyclerViewViewHolder(rootView);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
System.out.println("************ onBindViewHolder ***********");
User user = userArrayList.get(position);
RecyclerViewViewHolder viewHolder= (RecyclerViewViewHolder) holder;
// Set title as HTML code on view
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
viewHolder.txtView_title.setText(Html.fromHtml(user.getTitle(), Html.FROM_HTML_MODE_COMPACT));
} else {
viewHolder.txtView_title.setText(Html.fromHtml(user.getTitle()));
}
viewHolder.txtView_description.setText(user.getDescription()); // TODO add error png
Glide.with(context).load(user.getImagePath()).centerInside().error(R.drawable.yahushuas_commands_pt__2).into(viewHolder.imgView_icon);
}
@Override
public int getItemCount() {
return userArrayList.size();
}
class RecyclerViewViewHolder extends RecyclerView.ViewHolder {
ImageView imgView_icon;
TextView txtView_title;
TextView txtView_description;
public RecyclerViewViewHolder(@NonNull View itemView) {
super(itemView);
imgView_icon = itemView.findViewById(R.id.imgView_icon);
txtView_title = itemView.findViewById(R.id.txtView_title);
txtView_description = itemView.findViewById(R.id.txtView_description);
}
}
}
在RecyclerViewAdapter.java
的setData
方法中,您userArrayList
通過分配新的ArrayList
來更新userArrayList
。 因此,舊數據正在被替換。 您需要將新數據添加到現有列表中。
private ArrayList<User> userArrayLis = new ArrayList<User>(); // Initialise the arraylist
public void setData(ArrayList<User> userArrayListOne){
userArrayList.addAll(userArrayListOne);
notifyDataSetChanged();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.