यह पता लगाने की कोशिश कर रहा है कि RecyclerView
एडेप्टर को अपडेट करने में क्या समस्या है ।
उत्पादों की एक नई सूची प्राप्त करने के बाद, मैंने कोशिश की:
ArrayList
उस खंड से अपडेट करें जहांrecyclerView
बनाया गया है, एडॉप्टर पर नया डेटा सेट करें, फिर कॉल करेंadapter.notifyDataSetChanged()
; काम नहीं किया।एक नया एडेप्टर बनाएँ, जैसा कि अन्य लोगों ने किया, और इसने उनके लिए काम किया, लेकिन मेरे लिए कोई बदलाव नहीं:
recyclerView.setAdapter(new RecyclerViewAdapter(newArrayList))
एक विधि बनाएं
Adapter
जिसमें डेटा को निम्नानुसार अपडेट किया जाए:public void updateData(ArrayList<ViewModel> viewModels) { items.clear(); items.addAll(viewModels); notifyDataSetChanged(); }
फिर जब भी मैं डेटा सूची को अपडेट करना चाहता हूं तो मैं इस विधि को कॉल करता हूं; काम नहीं किया।
यह जांचने के लिए कि क्या मैं किसी भी तरह से recyclerView को संशोधित कर सकता हूं, और मैंने कम से कम एक आइटम को हटाने की कोशिश की:
public void removeItem(int position) { items.remove(position); notifyItemRemoved(position); }
सब कुछ वैसा का वैसा ही रहा।
यहाँ मेरा एडाप्टर है:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> implements View.OnClickListener {
private ArrayList<ViewModel> items;
private OnItemClickListener onItemClickListener;
public RecyclerViewAdapter(ArrayList<ViewModel> items) {
this.items = items;
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler, parent, false);
v.setOnClickListener(this);
return new ViewHolder(v);
}
public void updateData(ArrayList<ViewModel> viewModels) {
items.clear();
items.addAll(viewModels);
notifyDataSetChanged();
}
public void addItem(int position, ViewModel viewModel) {
items.add(position, viewModel);
notifyItemInserted(position);
}
public void removeItem(int position) {
items.remove(position);
notifyItemRemoved(position);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ViewModel item = items.get(position);
holder.title.setText(item.getTitle());
Picasso.with(holder.image.getContext()).load(item.getImage()).into(holder.image);
holder.price.setText(item.getPrice());
holder.credit.setText(item.getCredit());
holder.description.setText(item.getDescription());
holder.itemView.setTag(item);
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public void onClick(final View v) {
// Give some time to the ripple to finish the effect
if (onItemClickListener != null) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
onItemClickListener.onItemClick(v, (ViewModel) v.getTag());
}
}, 0);
}
}
protected static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView image;
public TextView price, credit, title, description;
public ViewHolder(View itemView) {
super(itemView);
image = (ImageView) itemView.findViewById(R.id.image);
price = (TextView) itemView.findViewById(R.id.price);
credit = (TextView) itemView.findViewById(R.id.credit);
title = (TextView) itemView.findViewById(R.id.title);
description = (TextView) itemView.findViewById(R.id.description);
}
}
public interface OnItemClickListener {
void onItemClick(View view, ViewModel viewModel);
}
}
और मैं RecyclerView
निम्नानुसार आरंभ करता हूं :
recyclerView = (RecyclerView) view.findViewById(R.id.recycler);
recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 5));
adapter = new RecyclerViewAdapter(items);
adapter.setOnItemClickListener(this);
recyclerView.setAdapter(adapter);
तो, नए प्राप्त आइटमों को प्रदर्शित करने के लिए मैं वास्तव में एडॉप्टर डेटा को कैसे अपडेट करूं?
अद्यतन: मुद्दा यह था कि लेआउट जहां gridView को देखा गया था:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:tag="catalog_fragment"
android:layout_height="match_parent">
<FrameLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"/>
<ImageButton
android:id="@+id/fab"
android:layout_gravity="top|end"
style="@style/FabStyle"/>
</FrameLayout>
</LinearLayout>
तब मैंने सिर्फ अभिभावक लेआउट के रूप में हटा दिया LinearLayout
और बनाया FrameLayout
।
items.clear(); items.addAll(newItems);
एक बदसूरत पैटर्न है। यदि आपको वास्तव में यहां रक्षात्मक नकल की आवश्यकता है,items = new ArrayList(newItems);
तो यह कम बदसूरत होगा।