朋友们,我有一个带有搜索视图和recyclerview的片段。我想在recyclerview数据上实现该搜索视图。当我尝试从我的片段中的我的适配器类调用一个方法时我遇到问题它不允许它并要求我将适配器类中的方法设为静态,这是不好。这是必需的片段代码 -
private void processQuery(String query) {
// in real app you'd have it instantiated just once
ArrayList<String> result = new ArrayList<>();
// case insensitive search
for (String category : category_name) {
if (category.toLowerCase().contains(query.toLowerCase())) {
result.add(category);
}
}
(MyCategoryAdaptercheckbox) MyAdapter.setCategorynames(result);
}
我在这条线上遇到错误 -
(MyCategoryAdaptercheckbox) MyAdapter.setCategorynames(result);
这是我的MyAdaper声明和初始化 -
RecyclerView.Adapter MyAdapter;
MyAdapter = new MyCategoryAdaptercheckbox(getMyCategoryAdapter1, getActivity().getApplicationContext(),category_name);
recyclerView.setAdapter(MyAdapter);
这是我的适配器类(setCategorynames)方法。它要求我将此方法设为静态 -
public void setCategorynames(List<String> category_name) {
this.category_name = category_name;
notifyDataSetChanged();
}
所以我想知道如何在片段中调用适配器类的方法?我的适配器类代码 -
public class MyCategoryAdaptercheckbox extends RecyclerView.Adapter<MyCategoryAdaptercheckbox.ViewHolder> {
List<GetMyCategoryAdapter> getMyCategoryAdapter;
Context context;
List<String> category_name;
GetMyCategoryAdapter getMyCategoryAdapter1;
public MyCategoryAdaptercheckbox(List<GetMyCategoryAdapter> getMyCategoryAdapter, Context context, List<String> category_name) {
this.getMyCategoryAdapter = getMyCategoryAdapter;
this.context = context;
this.category_name = category_name;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
if (viewHolder instanceof ViewHolder){
}
getMyCategoryAdapter1 = getMyCategoryAdapter.get(i);
((ViewHolder) viewHolder).tv_categorytitle.setText(getMyCategoryAdapter1.getC_name());
((ViewHolder) viewHolder).tv_categoryid.setText(getMyCategoryAdapter1.getC_id());
((ViewHolder) viewHolder).gt= getMyCategoryAdapter1;
}
public void filterList(ArrayList<String> filterdNames) {
this.category_name = filterdNames;
notifyDataSetChanged();
}
}
}
我在你的代码中看到的一个问题,setCategorynames(List<String> category_name) method is not resolved
,因为MyAdapter
没有铸造到(MyCategoryAdaptercheckbox)
你需要更换
(MyCategoryAdaptercheckbox) MyAdapter.setCategorynames(result);
这样
((MyCategoryAdaptercheckbox) MyAdapter).setCategorynames(result);
首先创建一个这样的界面;
public interface ProcessQueryListener{
void onSuccess(List<String> result);
}
在适配器中,您应该根据需要实现此侦听器。基本上是这样的:
public MyCategoryAdaptercheckbox extends RecyclerView.Adapter implements ProcessQueryListener {
@Override
public void onSuccess(List<String> result){
this.setCategorynames(result);
}
}
.
.
在你的fragment的processQuery函数中,你应该调用这个ProcessQueryListener。如;
ProcessQueryListener queryListener = (MyCategoryAdaptercheckbox) MyAdapter;
private void processQuery(String query) {
// in real app you'd have it instantiated just once
ArrayList<String> result = new ArrayList<>();
// case insensitive search
for (String category : category_name) {
if (category.toLowerCase().contains(query.toLowerCase())) {
result.add(category);
}
}
if (queryListener != null) {
queryListener.onSuccess(result);
}
}