android 筛选逻辑 recyclerview 选中和取消选中 -内附完整代码

首先是一个筛选的逻辑

 

我这里面是设置的五种形态店铺和价格都有分升序和降序 我这里是用不同颜色的圆体现的升序降序

/**
 * 筛选的主要逻辑就是字体变色和imageview的设置
 * 首先每个imageview有两个状态
 * 二有两个imageview就分为了四个状态 因为设置到筛选的上下 没放矢量图我放的颜色
 * 这样就涉及到五中形态的 type
 * 1.两个都未选中
 * 2.Screen_Store_im 选中为上
 * 3.Screen_Store_im 选中为下
 * 4.Screen_Price_im 选中为下
 * 5.Screen_Price_im 选中为下
 * 接下来主要就是判断那种形态了  这里就要定义一个标识了
 * 这样还要考虑一个问题 就是选中的时候先选中 上还是下  这样设置都可以 只要后期改下参数就可以了
 * 首先我是创建了一个标识默认选中的 Screen_Price_im
 * @param type  三个drawable为三个颜色的圆角图片
 */
private void changeView(int type){
        if (type==0){
            Screen_Store_im.setImageResource(R.drawable.slect);
            Screen_Price_im.setImageResource(R.drawable.slect);
            Screen_all_tv.setTextColor(Color.RED);
            Screen_Store_tv.setTextColor(Color.BLACK);
            Screen_Price_tv.setTextColor(Color.BLACK);
        }else if(type==1){
            Screen_Store_im.setImageResource(R.drawable.slect_no);
            Screen_Price_im.setImageResource(R.drawable.slect);
            Screen_all_tv.setTextColor(Color.BLACK);
            Screen_Store_tv.setTextColor(Color.RED);
            Screen_Price_tv.setTextColor(Color.BLACK);
        }else if(type==2){
            Screen_Store_im.setImageResource(R.drawable.slect_off);
            Screen_Price_im.setImageResource(R.drawable.slect);
            Screen_all_tv.setTextColor(Color.BLACK);
            Screen_Store_tv.setTextColor(Color.RED);
            Screen_Price_tv.setTextColor(Color.BLACK);

        }else if(type==3){
            Screen_Store_im.setImageResource(R.drawable.slect);
            Screen_Price_im.setImageResource(R.drawable.slect_no);
            Screen_all_tv.setTextColor(Color.BLACK);
            Screen_Store_tv.setTextColor(Color.BLACK);
            Screen_Price_tv.setTextColor(Color.RED);
        }else if (type==4){
            Screen_Store_im.setImageResource(R.drawable.slect);
            Screen_Price_im.setImageResource(R.drawable.slect_off);
            Screen_all_tv.setTextColor(Color.BLACK);
            Screen_Store_tv.setTextColor(Color.BLACK);
            Screen_Price_tv.setTextColor(Color.RED);
        }
    }

  还有一个问题就是字体选中和未选中时的颜色改变 所以这就引用出了第二个标识 tabFlag由于字体只有两种形态 选中和未选中我这里采用的时把三个textview放入到了一个 Group

mTextGroup=new TextView[]{Screen_all_tv,Screen_Store_tv,Screen_Price_tv};

然后根据传入的下标来切换颜色

/**
     * 选中的下标
     * @param index
     */
    private void changeGroup(int index){
        for (int i = 0; i < mTextGroup.length; i++) {
            if (mTextGroup[i] != null && i == index) {
                mTextGroup[i].setTextColor(Color.RED);
            } else {
                mTextGroup[i].setTextColor(Color.BLACK);
            }
        }

    }

接下来是选中的具体逻辑  首先是要考虑标识是如何定义的 我们定义的标识又如何区分呢?首先字体选中的话定义三个下标就够了 0 1 2 即 tabFlag 的值

分别对应 全部 店铺 价格 然后又涉及升序和降序 这样的话就得定义 五个 type的值

即: 0 全部 1店铺升序 2店铺降序  3价格升序 4价格降序

逻辑:

选中全部的时候 tabFlag=0 type=0

选中店铺的时候 tabFlag=1 type=1 默认选择升序 再次点击降序 再次点击升序 通过if来判断

选中价格的时候 tabFlag=2 type=3 默认选择升序 再次点击降序 再次点击升序 通过if来判断

changeView(type);
        changeGroup(tabFlag);
        //全部
        mScreen_all.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                type=0;
                tabFlag=0;
                changeView(type);
                changeGroup(tabFlag);
            }
        });
        //商城
        mScreen_Store.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 tabFlag=1;
                 if (type==1){
                     type=2;
                 }else if (type==2){
                     type=1;
                 }else{
                     type=1;
                 }
                changeView(type);
                changeGroup(tabFlag);
            }
        });
        //价格
        mScreen_Price.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tabFlag=2;
                if (type==3){
                    type=4;
                }else if (type==4){
                    type=3;
                }else{
                    type=3;
                }
                changeView(type);
                changeGroup(tabFlag);
            }
        });

到这里筛选的逻辑就结束了,可以根据自己的需要进行数据的网络请求,和自己扩展

下面来介绍一下recyview选中和取消选中的逻辑

/**
 * android 选中业务分析
 * 第一步首先是需要点击事件这样就用到了接口回调
 * 第二步是要确定传入的是哪个下标然后根据下标判断选中的是哪个item
 * 第三步是要判断选中后如何取消选中  我这里处理的是在实体类里面定义了一个标识 首先定义了一个false 然后切换完判断是true 就更改为false 如果为false 就更改为true 这样就基本完事了
 */

直接上代码

这段代码定义了一些基本参数和接口回调

 private Context mContext;
    private ArrayList<mData> mList;
    private int selectPosition = -1;
    private OnItemListener onItemListener;

    public void setOnItemListener(OnItemListener onItemListener) {
        this.onItemListener = onItemListener;
    }

    public interface OnItemListener {
        void onClick(View v, int pos, String s);
    }

    public void setSelectPosition(int position) {
        this.selectPosition = position;
        notifyDataSetChanged();
    }

然后在 onBindViewHolder 里面做具体逻辑操作

@Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        ViewHolder holder1 = (ViewHolder) holder;
        holder1.screen_text.setText(mList.get(position).content);

        holder1.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (v!=null){
                    onItemListener.onClick(v, position, mList.get(position).content);
                }
            }
        });
        if (selectPosition != -1) {
            if (selectPosition == position) {
                if (mList.get(position).isSelect) {
                    holder1.screen_text.setBackgroundResource(R.drawable.screen_selted);
                } else {
                    holder1.screen_text.setBackgroundResource(R.drawable.screen_unselted);
                }
            } else {
                holder1.screen_text.setBackgroundResource(R.drawable.screen_unselted);
                mList.get(position).isSelect=false;
            }
        } else {
            mList.get(position).isSelect=false;
            holder1.screen_text.setBackgroundResource(R.drawable.screen_unselted);
        }
    }

然后就是如何使用了

screenRcyOneAdpter.setOnItemListener(new ScreenRcyOneAdpter.OnItemListener() {
            @Override
            public void onClick(View v, int pos, String s) {
                screenRcyOneAdpter.setSelectPosition(pos);
                if (mData.get(pos).isSelect){
                    mData.get(pos).isSelect=false;
                    screenRcyOneAdpter.notifyDataSetChanged();
                }else{
                    mData.get(pos).isSelect=true;
                    screenRcyOneAdpter.notifyDataSetChanged();
                }
            }
        });

到这里就结束了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android中,RecyclerView是一个可滚动的列表视图,它可以用来展示大量的数据。GridLayoutManager是RecyclerView的内置LayoutManager之一,用于将视图以网格布局的形式展示。如果你想要创建一个三列的网格布局,你可以按照以下步骤进行代码实现: 1. 添加依赖: 首先确保你的项目已添加RecyclerView依赖。如果你使用的是Gradle,可以在build.gradle文件中添加: ```gradle implementation 'com.google.android.widget:recyclerview-v7:{{version}}' ``` 替换`{{version}}`为最新的RecyclerView版本号。 2. 创建GridLayoutManager实例: 在你的Activity或Fragment中,初始化GridLayoutManager,并指定列数(这里设置为3): ```java GridLayoutManager layoutManager = new GridLayoutManager(context, 3); ``` 3. 设置给RecyclerView: 将`layoutManager`应用到你的RecyclerView上: ```java RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(layoutManager); ``` 4. 绑定Adapter: 确保你的数据源已经准备好,然后创建一个适配器(如 LinearLayoutManagerAdapter)并将它绑定到RecyclerView: ```java YourCustomAdapter adapter = new YourCustomAdapter(yourDataList); recyclerView.setAdapter(adapter); ``` 记得替换`YourCustomAdapter`为你的实际Adapter类名,`yourDataList`为你的数据集合。 5. 布局: 如果需要的话,调整RecyclerView的内嵌布局(item layout)以适应三列布局。例如,你可能需要使用`wrap_content`作为宽度约束,让每一项自适应宽度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值