recyclerview notifyDataSetChanged() 不工作
recyclerview notifyDataSetChanged() is not working
我正在尝试使用 updateList() 中的 notifyDataSetchanged() 来更新我的适配器。但不适用于 recyclerview。我可以在 updateList() 中看到列表大小及其显示的实际结果,但只有 reclerview 不是 updating.This class 是在 MVVM 设计模式中设计的。
public class TasksAdapter extends RecyclerView.Adapter<TasksAdapter.TasksAdapterViewHolder> {
private static final String TAG = TasksAdapter.class.getSimpleName();
static ArrayList<ItemModel> list;
static Context mContext;
private Fragment fragment;
private int row_index = -1;
private SessionManager session;
// SelectColorVM colorVM;
public TasksAdapter(Fragment fragment, Context context, ArrayList<ItemModel> itemList) {
this.mContext = context;
this.list = itemList;
this.fragment = fragment;
session = new SessionManager(fragment.getContext());
}
public void updateList(ArrayList<ItemModel> itemList){
list.clear();
this.list = itemList;
notifyDataSetChanged();
}
@Override
public TasksAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
TasksItemBinding binding =
DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.tasks_item,
parent, false);
return new TasksAdapter.TasksAdapterViewHolder(binding);
}
@Override
public void onBindViewHolder(TasksAdapterViewHolder holder, final int position) {
holder.binding.setViewModel(list.get(position));
if(position == 0 && list.get(position).btnText.get().toString().length() > 0)
holder.binding.btnUpdate.setVisibility(View.VISIBLE);
else
holder.binding.btnUpdate.setVisibility(View.INVISIBLE);
holder.binding.layoutItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// row_index = position;
// notifyDataSetChanged();
Fragment fragment = new DetailFragment();
FragmentManager manager = ((FragmentActivity) mContext).getSupportFragmentManager();
FragmentTransaction fragmentTransaction = manager.beginTransaction();
Bundle bundle = new Bundle();
ItemModel item = list.get(position);
bundle.putSerializable("item", item);
fragment.setArguments(bundle);
fragmentTransaction.replace(R.id.id_frame, fragment, "details");
fragmentTransaction.addToBackStack("details");
fragmentTransaction.commit();
}
});
holder.binding.btnUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
HashMap<String, String> user = session.getUserDetails();
if(list.get(position).btnText.get().equals("Task Start")){
LandingEngine.updateStatusAndSetStartTimeForRequest(fragment, user.get(SessionManager.KEY_CLEANER_ID), list.get(position).sid.get().toString());
} else if(list.get(position).btnText.get().equals("Task Complete")){
LandingEngine.updateStatusAndSetCompleteTimeForRequest(fragment, user.get(SessionManager.KEY_CLEANER_ID), list.get(position).sid.get().toString());
}
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public static class TasksAdapterViewHolder extends RecyclerView.ViewHolder {
TasksItemBinding binding;
public TasksAdapterViewHolder(TasksItemBinding rowbinding) {
super(rowbinding.getRoot());
this.binding = rowbinding;
}
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
}
我正在从我的片段调用适配器,如下所示
if(list.size() > 0) {
if(adapter == null) {
view.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(fragment.getContext());
view.setLayoutManager(mLayoutManager);
adapter = new TasksAdapter(fragment, fragment.getContext(), list);
view.setAdapter(adapter);
view.addItemDecoration(new DividerItemDecoration(fragment.getContext()));
} else {
adapter.updateList(list);
// view.getAdapter().notifyDataSetChanged();
// view.invalidate();
}
}
请检查一下,让我知道我做错了什么地方here.Thanks提前..
不要
public void updateList(ArrayList<ItemModel> itemList)
{
list.clear();
this.list = itemList;
notifyDataSetChanged();
}
- 每当调用此方法时
list.clear();
清除所有值。
The clear() method is used to remove all of the elements from a list.
DO
public void updateList(ArrayList<ItemModel> itemList)
{
this.list.addAll(itemList);
notifyDataSetChanged();
}
尝试将 list.clear();
从您的 updateList
方法中删除
public void updateList(ArrayList<ItemModel> itemList){
this.list.addAll(itemList);
notifyItemInserted(list.size());
notifyDataSetChanged();
}
notifyItemInserted(int position)
Notify any registered observers that the item reflected at position has been newly inserted.
也试试这个
list.addAll(your new list);
if (adapter == null) {
view.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(fragment.getContext());
view.setLayoutManager(mLayoutManager);
adapter = new TasksAdapter(fragment, fragment.getContext(), list);
view.setAdapter(adapter);
view.addItemDecoration(new DividerItemDecoration(fragment.getContext()));
} else {
view.notifyItemInserted(list.size());
view.notifyDataSetChanged();
}
尝试在您的 Fragment
class 中添加 notifyDataSetChanged()
,例如...
adapter.notifyDataSetChanged();
我遇到了同样的问题,你在这方面做错了,将列表更改为itemList:
@Override
public int getItemCount() {
return itemList.size();
}
试试这个
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
view.adapter.notifyDataSetChanged();
}
});
一旦从 volley 库获得 API 响应,它最终通过从片段 class 调用此方法来工作。
我在 ViewModel 中编写了以下方法 class。
public void updateList(ArrayList<Class> list){
if(adapter != null) {
adapter.updateList(list);
}
}
然后从片段 class 调用此方法,如下所示。
ArrayList<StatisticsModel> list = (ArrayList) data;
viewModel.updateList(list);
因此在适配器中 class 更新方法如下。
public void updateList(ArrayList<StatisticsModel> itemList){
list.clear();
// this.list = itemList;
// list.addAll(itemList);
// notifyItemInserted(list.size());
// notifyDataSetChanged();
this.list.addAll(itemList);
// notifyItemInserted(list.size());
notifyDataSetChanged();
}
有同样的问题。就我而言,logcat RecyclerView 中出现错误消息:未附加布局管理器;跳过布局
我已经用下面的代码修复了
LinearLayoutManager llm = new LinearLayoutManager(this.getActivity());
llm.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(llm);
然后 notifyDataSetChanged 开始工作
我正在尝试使用 updateList() 中的 notifyDataSetchanged() 来更新我的适配器。但不适用于 recyclerview。我可以在 updateList() 中看到列表大小及其显示的实际结果,但只有 reclerview 不是 updating.This class 是在 MVVM 设计模式中设计的。
public class TasksAdapter extends RecyclerView.Adapter<TasksAdapter.TasksAdapterViewHolder> {
private static final String TAG = TasksAdapter.class.getSimpleName();
static ArrayList<ItemModel> list;
static Context mContext;
private Fragment fragment;
private int row_index = -1;
private SessionManager session;
// SelectColorVM colorVM;
public TasksAdapter(Fragment fragment, Context context, ArrayList<ItemModel> itemList) {
this.mContext = context;
this.list = itemList;
this.fragment = fragment;
session = new SessionManager(fragment.getContext());
}
public void updateList(ArrayList<ItemModel> itemList){
list.clear();
this.list = itemList;
notifyDataSetChanged();
}
@Override
public TasksAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
TasksItemBinding binding =
DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.tasks_item,
parent, false);
return new TasksAdapter.TasksAdapterViewHolder(binding);
}
@Override
public void onBindViewHolder(TasksAdapterViewHolder holder, final int position) {
holder.binding.setViewModel(list.get(position));
if(position == 0 && list.get(position).btnText.get().toString().length() > 0)
holder.binding.btnUpdate.setVisibility(View.VISIBLE);
else
holder.binding.btnUpdate.setVisibility(View.INVISIBLE);
holder.binding.layoutItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// row_index = position;
// notifyDataSetChanged();
Fragment fragment = new DetailFragment();
FragmentManager manager = ((FragmentActivity) mContext).getSupportFragmentManager();
FragmentTransaction fragmentTransaction = manager.beginTransaction();
Bundle bundle = new Bundle();
ItemModel item = list.get(position);
bundle.putSerializable("item", item);
fragment.setArguments(bundle);
fragmentTransaction.replace(R.id.id_frame, fragment, "details");
fragmentTransaction.addToBackStack("details");
fragmentTransaction.commit();
}
});
holder.binding.btnUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
HashMap<String, String> user = session.getUserDetails();
if(list.get(position).btnText.get().equals("Task Start")){
LandingEngine.updateStatusAndSetStartTimeForRequest(fragment, user.get(SessionManager.KEY_CLEANER_ID), list.get(position).sid.get().toString());
} else if(list.get(position).btnText.get().equals("Task Complete")){
LandingEngine.updateStatusAndSetCompleteTimeForRequest(fragment, user.get(SessionManager.KEY_CLEANER_ID), list.get(position).sid.get().toString());
}
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public static class TasksAdapterViewHolder extends RecyclerView.ViewHolder {
TasksItemBinding binding;
public TasksAdapterViewHolder(TasksItemBinding rowbinding) {
super(rowbinding.getRoot());
this.binding = rowbinding;
}
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
}
我正在从我的片段调用适配器,如下所示
if(list.size() > 0) {
if(adapter == null) {
view.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(fragment.getContext());
view.setLayoutManager(mLayoutManager);
adapter = new TasksAdapter(fragment, fragment.getContext(), list);
view.setAdapter(adapter);
view.addItemDecoration(new DividerItemDecoration(fragment.getContext()));
} else {
adapter.updateList(list);
// view.getAdapter().notifyDataSetChanged();
// view.invalidate();
}
}
请检查一下,让我知道我做错了什么地方here.Thanks提前..
不要
public void updateList(ArrayList<ItemModel> itemList)
{
list.clear();
this.list = itemList;
notifyDataSetChanged();
}
- 每当调用此方法时
list.clear();
清除所有值。
The clear() method is used to remove all of the elements from a list.
DO
public void updateList(ArrayList<ItemModel> itemList)
{
this.list.addAll(itemList);
notifyDataSetChanged();
}
尝试将 list.clear();
从您的 updateList
方法中删除
public void updateList(ArrayList<ItemModel> itemList){
this.list.addAll(itemList);
notifyItemInserted(list.size());
notifyDataSetChanged();
}
notifyItemInserted(int position)
Notify any registered observers that the item reflected at position has been newly inserted.
也试试这个
list.addAll(your new list);
if (adapter == null) {
view.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(fragment.getContext());
view.setLayoutManager(mLayoutManager);
adapter = new TasksAdapter(fragment, fragment.getContext(), list);
view.setAdapter(adapter);
view.addItemDecoration(new DividerItemDecoration(fragment.getContext()));
} else {
view.notifyItemInserted(list.size());
view.notifyDataSetChanged();
}
尝试在您的 Fragment
class 中添加 notifyDataSetChanged()
,例如...
adapter.notifyDataSetChanged();
我遇到了同样的问题,你在这方面做错了,将列表更改为itemList:
@Override
public int getItemCount() {
return itemList.size();
}
试试这个
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
view.adapter.notifyDataSetChanged();
}
});
一旦从 volley 库获得 API 响应,它最终通过从片段 class 调用此方法来工作。
我在 ViewModel 中编写了以下方法 class。
public void updateList(ArrayList<Class> list){
if(adapter != null) {
adapter.updateList(list);
}
}
然后从片段 class 调用此方法,如下所示。
ArrayList<StatisticsModel> list = (ArrayList) data;
viewModel.updateList(list);
因此在适配器中 class 更新方法如下。
public void updateList(ArrayList<StatisticsModel> itemList){
list.clear();
// this.list = itemList;
// list.addAll(itemList);
// notifyItemInserted(list.size());
// notifyDataSetChanged();
this.list.addAll(itemList);
// notifyItemInserted(list.size());
notifyDataSetChanged();
}
有同样的问题。就我而言,logcat RecyclerView 中出现错误消息:未附加布局管理器;跳过布局
我已经用下面的代码修复了
LinearLayoutManager llm = new LinearLayoutManager(this.getActivity());
llm.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(llm);
然后 notifyDataSetChanged 开始工作