【问题标题】:Recyclerview getAdapterPosition for Searchview用于 Searchview 的 Recyclerview getAdapterPosition
【发布时间】:2018-10-08 20:59:48
【问题描述】:

使用我的 recyclerview 的搜索视图后,我很难返回正确的视图。

当我在项目点击时仅使用回收器时,我会放大正确的视图,但是,一旦我进行搜索并出现结果,错误的视图就会被放大。

我相信这是因为我使用 position 并不是在使用 searchview 时保持原始 recyclerview 位置的最佳方式。

我已经看到getAdapterPosition() 是通过搜索视图保持项目位置的最佳方式。

如果有人可以帮助我实现在搜索后保持膨胀的最佳方法,我将不胜感激!具体场景的代码我也会在后面给出一个例子。

另外,为澄清起见,我在适配器的 onBindViewHolder 方法中对 RecyclerAdapter 的视图进行膨胀。

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {

private List<Data> listData = new ArrayList<Data>();
private Context context;
Dialog myDialog;

public RecyclerViewAdapter(List<Data> listData, Context context) {
    this.listData = listData;
    this.context = context;
}

@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View itemView = inflater.inflate(R.layout.item,parent,false);
    return new RecyclerViewHolder(itemView);
}


@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
    holder.itemz.setImageResource(listData.get(position).getitemz());
    holder.itemName.setText(listData.get(position).getitemName());
    holder.itemPrice.setText(listData.get(position).getitemPrice());
    holder.itemVal.setText(listData.get(position).getitemVal());

    holder.setItemClickListener(new ItemClickListener() {
        @Override
        public void onClick(View view, int position) {
            final SwipeDismissDialog swipeDismissDialog;
            Button btnOK;
            if (position == 0) {
                myDialog = new Dialog(context);

                LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
                View itemView = inflater.inflate(R.layout.item_cards, null);

                swipeDismissDialog = new SwipeDismissDialog.Builder(myDialog.getContext()).setView(itemView).build().show();

                TextView words = (TextView)itemView.findViewById(R.id.words);
                words.setText("Success1");

                btnOK = (Button)itemView.findViewById(R.id.btnOK);
                btnOK.setOnClickListener(
                        new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                swipeDismissDialog.dismiss();
                            }
                        }
                );

            }
            else if (position == 1){
                myDialog = new Dialog(context);

                LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
                View itemView = inflater.inflate(R.layout.item_cards, null);

                swipeDismissDialog = new SwipeDismissDialog.Builder(myDialog.getContext()).setView(itemView).build().show();

                TextView words = (TextView)itemView.findViewById(R.id.words);
                words.setText("Success2");

                btnOK = (Button)itemView.findViewById(R.id.btnOK);
                btnOK.setOnClickListener(
                        new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                swipeDismissDialog.dismiss();
                            }
                        }
                );
            }
        }
    });
}

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

public void filterList(ArrayList<Data> filteredList){
    listData = filteredList;
    notifyDataSetChanged();
}

}

发生了什么:

  1. 当我加载活动并单击回收器中的第 1 项时,内容 success1 会按预期显示。
  2. 当我搜索item2 时,该项目按预期返回,但是,如果我单击该项目,则出现success1 而不是success2

对此最好的解决办法是什么?

任何帮助将不胜感激!

【问题讨论】:

    标签: android android-studio searchview android-recyclerview


    【解决方案1】:

    我想当你进行搜索时,你在适配器中设置了一个新的数据列表,这个新列表包含位置 0 的 item2。

    因此,当您单击该项目时,您正在单击位置 0 的项目,并且在您的代码中您有类似的内容:

    所以你应该对项目而不是位置使用条件。 这是最好的方法:

    public Data getDataAtPosition(int position) {
        if (listData!= null && listData.size() > position)
            return listData.get(position);
        else
            return null;
    }
    

    然后:

    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, int position) {
        // ...
        holder.setItemClickListener(new ItemClickListener() {
            @Override
            public void onClick(View view, int position) {
                Data data = getDataAtPosition(position);
                if (data != null && data.isItem1())
                    // Success1
                else if (data != null && data.isItem2())
                   // Success2
            }
    }
    

    PS:每次持有人更改时,您都会创建一个新的侦听器,也许您可​​以查看有关如何在 RecyclerView 上创建 ClickListener 的说明:https://stackoverflow.com/a/26196831/9434800

    【讨论】:

    • 感谢您的回复! “data.isItem1()”到底是什么意思?我理解 data != null 部分,但我不确定你在后者中指的是什么
    • 我猜你真的不想检查列表中位置的条件,而是检查项目本身(如果这是 item1 或 item2)。因此,data.isItem1() 可以替换为您的项目上的 id,例如 data.getId() == 1
    • 我目前在 recyclerview 中的项目上没有 Id,因此尝试获取 Id 需要我先分配它们。我会在视图持有者中这样做吗?
    • 您的操作方式与您在条件之前使用的 Name、Price 和 Val 相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2015-04-26
    相关资源
    最近更新 更多