gpt4 book ai didi

java - E/RecyclerView : No adapter attached; skipping layout when using searchview

转载 作者:太空宇宙 更新时间:2023-11-04 09:05:26 24 4
gpt4 key购买 nike

适配器类

当前正在尝试实现对我的回收器 View 的搜索。当我尝试运行搜索时,出现“E/RecyclerView:未连接适配器;跳过布局”的错误。我尝试过使用notifyDatasetChanged()但仍然不起作用。当我打印过滤列表时,我可以看到它包含应返回的正确数量的项目,但它没有被更新。谢谢

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> implements Filterable {

Context context;
ArrayList<New> fullList;
ArrayList<New> list;

public RecyclerViewAdapter(Context context, ArrayList<New> fullList) {
this.fullList = fullList;
this.list = new ArrayList<>(fullList);
this.context = context;
}

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

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

New studentDetails = fullList.get(position);
holder.setTitle(studentDetails.getType().toString());

}
@Override
public int getItemCount() {

return fullList.size();
}

@Override
public Filter getFilter() {
return exampleFilter;
}

private Filter exampleFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<New> filteredList = new ArrayList<>();
if(constraint == null || constraint.length()==0)
{
filteredList.addAll(list);
}
else
{
String filterPattern = constraint.toString().toLowerCase().trim();

for(New item: fullList)
{
if(item.getType().toString().toLowerCase().contains(filterPattern))
{
filteredList.add(item);
}
}
}
FilterResults results= new FilterResults();
results.values = filteredList;
System.out.println("filtered " + filteredList.toString());
return results;
}

@Override
protected void publishResults(CharSequence constraint, FilterResults results) {

list.clear();
list.addAll((List)results.values);
notifyDataSetChanged();
}
};

fragment

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
// Do something that differs the Activity's menu here
MenuItem searchItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView)searchItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
System.out.println("before" + list);
adapter.getFilter().filter(newText);
System.out.println("after" + list);
return false;
}

});

}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mView= inflater.inflate(R.layout.fragment_shown,container,false);
myRecycler=(RecyclerView)mView.findViewById(R.id.recycler);
myRecycler.setHasFixedSize(true);
myRecycler.setLayoutManager(new LinearLayoutManager(getContext()));
mDatabase = FirebaseDatabase.getInstance().getReference().child("Student");

mDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
New studentDetails = dataSnapshot.getValue(New.class);
Map<String, String> map = (Map) dataSnapshot.getValue();
String message = map.get("name");
if(message.equals("studentname"))
{
list.add(studentDetails);
}

}

adapter = new RecyclerViewAdapter(getActivity(), list);
myRecycler.setAdapter(adapter);
adapter.notifyDataSetChanged();

}

@Override
public void onCancelled(DatabaseError databaseError) {



}
});

return mView;
}

最佳答案

问题是,在从数据库获取更新之前,您不会创建适配器。您应该在监听器之外设置适配器,并根据需要更新它:

 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mView= inflater.inflate(R.layout.fragment_shown,container,false);
myRecycler=(RecyclerView)mView.findViewById(R.id.recycler);
myRecycler.setHasFixedSize(true);
myRecycler.setLayoutManager(new LinearLayoutManager(getContext()));

//set your adapter when you create the view
adapter = new RecyclerViewAdapter(getActivity(), list);
myRecycler.setAdapter(adapter);
mDatabase = FirebaseDatabase.getInstance().getReference().child("Student");

mDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
New studentDetails = dataSnapshot.getValue(New.class);
Map<String, String> map = (Map) dataSnapshot.getValue();
String message = map.get("name");
if(message.equals("studentname"))
{
list.add(studentDetails);
}

}


adapter.notifyDataSetChanged();

}

@Override
public void onCancelled(DatabaseError databaseError) {



}
});

return mView;
}

您还需要更新您的数据集。您可以在适配器类中执行类似的操作:

public void updateData(List<New> myData){
list = myData;
notifyDataSetChanged()
}

然后,您不调用 adapter.notifyDataSetChanged(),而是调用 adapter.updateData(list)

关于java - E/RecyclerView : No adapter attached; skipping layout when using searchview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60265895/

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