【问题标题】:Calling an adapter method in a fragment在片段中调用适配器方法
【发布时间】:2019-04-04 07:00:26
【问题描述】:

朋友们,我有一个带有搜索视图和回收视图的片段。我想在 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();
    }
    }
}

【问题讨论】:

  • 使用接口代替这个。
  • @HemantParmar 怎么样?请详细说明..实际上我是 android 新手
  • 你能显示你的片段代码吗?
  • 看看thisthis
  • @payal_suthar 是 category_name 某处声明为静态的?

标签: android android-fragments android-recyclerview fragment searchview


【解决方案1】:

我在您的代码中看到的一个问题是 setCategorynames(List&lt;String&gt; category_name) method is not resolved,因为 MyAdapter 未转换为 (MyCategoryAdaptercheckbox)

你需要更换

(MyCategoryAdaptercheckbox) MyAdapter.setCategorynames(result);

通过这个

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

【讨论】:

  • 谢谢它的工作,但你能告诉我为什么我的 notifydatachanged() 方法不起作用吗?我正在使用 edittext 进行搜索功能,但在文本更改时,它正在获取数据但不更新回收站视图数据
  • @payal_suthar 请不在 cmets 中
  • 那怎么办?你想让我更新问题吗?但这个问题与我之前提出的问题无关
  • 更新问题并添加代码。看看
  • 也许让我们创建聊天室?
【解决方案2】:

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

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);
    }
}
.
.

在您的片段的 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);
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多