首页 > 解决方案 > 为 recyclerview 合并两个最相似的适配器

问题描述

我有两个适配器可以根据不同的条件适应回收站视图。我想合并它们。

问题是我首先在与正在使用它的活动相同的文件中创建,另一个在新文件中。

采取如下方式: DefaultAdapter 在使用它的文件中。AutoCompleteAdapter 也在同一个文件中使用,但在其他文件中声明。

我想摆脱默认适配器并将其功能放入 AutoCompleteAdapter。

它有一些问题:我不能再使用 ParentFiles 的变量。

下面是我想摆脱的适配器。


  public class DefaultAdapter extends RecyclerView.Adapter<DefaultAdapter.ViewHolder> {

    private Context context;
    private AdapterView.OnItemClickListener onItemClickListener;
    List<String> searchList;

    @NonNull @Override
    public DefaultAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
      View view = (View) LayoutInflater.from(parent.getContext())
        .inflate(android.R.layout.simple_list_item_1, null);
      ViewHolder holder = new ViewHolder(view);
      return holder;
    }

    @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
      holder.txt.setText(
        Html.fromHtml(getItem(position)).toString());///need to get rid of this error
    }

    @Override public int getItemCount() {
      return searchList.size();
    }

    @NonNull public String getItem(int position) {
      return searchList.get(position);
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
      TextView txt;

      public ViewHolder(@NonNull View itemView) {
        super(itemView);
        txt = itemView.findViewById(android.R.id.text1);
        itemView.setOnClickListener(new View.OnClickListener() {
          @Override public void onClick(View v) {
            String title = txt.getText().toString();
            searchPresenter.saveSearch(title);
          }
        });
        itemView.setOnLongClickListener(new View.OnLongClickListener() {
          @Override public boolean onLongClick(View v) {
            String searched = txt.getText().toString();
            deleteSpecificSearchDialog(searched);
            return true;
          }
        });
      }
    }
  }

请注意 SearchPresenter。这是父文件中的一个变量,这会导致重大问题。自动完成适配器不必使用它,但默认必须使用。

这是我希望它合并到的适配器

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

  @Inject JNIKiwix currentJNIReader;
  @Inject SharedPreferenceUtil sharedPreferenceUtil;
  @Inject ZimReaderContainer zimReaderContainer;
  private List<String> data;
  private KiwixFilter kiwifilter;
  private Context context;

  public AutoCompleteAdapter(Context context) {
    this.context = context;
    data = new ArrayList<>();
    kiwifilter = new KiwixFilter();
    setupDagger();
  }

  private void setupDagger() {
    CoreApp.getCoreComponent().inject(this);
  }

  @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = (View) LayoutInflater.from(parent.getContext())
      .inflate(android.R.layout.simple_list_item_1, null);
    ViewHolder holder = new ViewHolder(view);
    return holder;
  }

  @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    holder.title.setText(Html.fromHtml(getItem(position)).toString());
  }
  @Override
  public String getItem(int index) {
    String a = data.get(index);
    if (a.endsWith(".html")) {
      String trim = a.substring(2);
      trim = trim.substring(0, trim.length() - 5);
      return trim.replace("_", " ");
    } else {
      return a;
    }
  }

  @Override public int getItemCount() {
    return data.size();
  }

  public class ViewHolder extends RecyclerView.ViewHolder {
    TextView title;

    public ViewHolder(@NonNull View itemView) {
      super(itemView);
      title = itemView.findViewById(android.R.id.text1);
    }
  }
}
...

注意两者之间的相似性,它们几乎相似,autocompleteadapter 就像 defaultadapter 的超集。

我只想摆脱默认适配器。

注意:我已经从 autocompleteaadapter 中删除了一些其他的东西,我认为它们不是问题所必需的。菜鸟在这里...谢谢

标签: androidandroid-recyclerview

解决方案


推荐阅读