在片段中调用适配器方法

问题描述 投票:0回答:2

朋友们,我有一个带有搜索视图和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();
    }
    }
}
android android-fragments android-recyclerview fragment searchview
2个回答
0
投票

我在你的代码中看到的一个问题,setCategorynames(List<String> category_name) method is not resolved,因为MyAdapter没有铸造到(MyCategoryAdaptercheckbox)

你需要更换

(MyCategoryAdaptercheckbox) MyAdapter.setCategorynames(result);

这样

((MyCategoryAdaptercheckbox) MyAdapter).setCategorynames(result);


0
投票

首先创建一个这样的界面;

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);
        }
}
© www.soinside.com 2019 - 2024. All rights reserved.