【问题标题】:Recyclerview Single Item SelectorRecyclerview 单项选择器
【发布时间】:2017-12-18 07:41:21
【问题描述】:

我为我的 RecyclerView 项目添加了一个选择器背景,但我需要一次只允许选择单个项目。即,如果选择了一项,则不得选择所有其余的项。我怎样才能做到这一点?

这是我的适配器类

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

    Context context;
    private List<VisaType> visaTypeList;

    int selected_position;


    public VisaTypeAdapter(Context context, List<VisaType> visaTypeList) {
        this.context = context;
        this.visaTypeList = visaTypeList;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.visa_type_row, parent, false);
        return new jp.workjapan.adapters.VisaTypeAdapter.ViewHolder(view);

    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        final VisaType a = visaTypeList.get(position);
        final jp.workjapan.adapters.VisaTypeAdapter.ViewHolder viewHolder = (jp.workjapan.adapters.VisaTypeAdapter.ViewHolder) holder;
        viewHolder.visa_eng.setText(a.getName_en());
        viewHolder.visa_jp.setText(a.getName_jp());


        final long id = a.getId();
        if (id == AppSingleTon.visaType) {
            viewHolder.visa_layout.setSelected(true);
        } else {
            viewHolder.visa_layout.setSelected(false);
        }


        viewHolder.visa_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (viewHolder.visa_layout.isSelected()) {
                    viewHolder.visa_layout.setSelected(false);


                } else {

                    viewHolder.visa_layout.setSelected(true);
                    AppSingleTon.visaType = id;
                    selected_position = position;


                }


            }
        });

    }

}

【问题讨论】:

  • 您是否在 AlertDialog 中显示此回收视图?如果是,您应该使用 ArrayAdapter 和布局 android.R.layout.select_dialog_singlechoice

标签: android


【解决方案1】:

这是我的示例解决方案:

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

    Context context;
    private List<VisaType> visaTypeList;

    int selected_position;


    public VisaTypeAdapter(Context context, List<VisaType> visaTypeList) {
        this.context = context;
        this.visaTypeList = visaTypeList;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.visa_type_row, parent, false);
        return new jp.workjapan.adapters.VisaTypeAdapter.ViewHolder(view);

    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        final VisaType a = visaTypeList.get(position);
        final jp.workjapan.adapters.VisaTypeAdapter.ViewHolder viewHolder = (jp.workjapan.adapters.VisaTypeAdapter.ViewHolder) holder;
        viewHolder.visa_eng.setText(a.getName_en());
        viewHolder.visa_jp.setText(a.getName_jp());


        final long id = a.getId();
        if (id == AppSingleTon.visaType) {
            viewHolder.visa_layout.setSelected(true);
        } else {
            viewHolder.visa_layout.setSelected(false);
        }

        if (position == selected_position) {
            viewHolder.visa_layout.setSelected(true);
        } else {
            viewHolder.visa_layout.setSelected(false);
        }

        viewHolder.visa_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                selected_position = getAdapterPosition();
                notifyDataSetChanged();
            }
        });

    }

}

希望对你有帮助... 谢谢

【讨论】:

  • 如果这段代码解决了 OP 的问题,请解释一下你做了什么以及为什么。以及 OP 做错了什么。
  • 重要notifyDataSetChanged();
  • 作为 notifyDataSetChanged();通知 recyclerview 中的所有项目,这不是一个好的行为尝试一些其他逻辑并使用 notifyItemChanged。
【解决方案2】:

您还可以考虑使用 SelectionTracker 扩展的 RecyclerView。然后必须将一些代码添加到您当前的实现中以实现所有需要的方法。最后,在您构建 SelectionTracker 的地方,您可以放置​​如下代码并将 SelectionTracker 注入您的 Adapter 类。

SelectionTracker 构建示例代码:

SelectionTracker selectionTracker = new SelectionTracker.Builder<>(
        "example-unique-id",
        mRecyclerView,
        new UsersListAdapter.UserItemKeyProvider(list),
        new UsersListAdapter.UserItemLookup(mRecyclerView),
        StorageStrategy.createStringStorage()
    ).withSelectionPredicate(SelectionPredicates.<String>createSelectSingleAnything()).build();

方法:

withSelectionPredicate(SelectionPredicates.<String>createSelectSingleAnything())

在这里至关重要,因为它定义了“选择方法”。这里的字符串是可能的键之一。更多信息请关注:

  1. RecyclerView官方指南:https://developer.android.com/guide/topics/ui/layout/recyclerview
  2. 开发文档:https://developer.android.com/reference/androidx/recyclerview/selection/SelectionPredicates

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-19
    • 2019-08-02
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    相关资源
    最近更新 更多