Android PopupWindow+RecyclerView 实现二级联动筛选

这篇具有很好参考价值的文章主要介绍了Android PopupWindow+RecyclerView 实现二级联动筛选。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

这篇文章主要的功能是利用 PopupWindow 和  RecyclerView 实现条件筛选包括二级联动筛选,主要是仿小红书里的筛选功能而写的一个 Demo 效果如下,代码通俗易懂,保姆级教程

android recyclerview 联动,功能,java,android


一、使用步骤

1.引入库

api 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46'
api 'com.google.code.gson:gson:2.8.6'
api 'com.alibaba:fastjson:1.2.61'

2. 模拟API数据

这里我模拟实际接口返回的数据而准备的数据源,在工程目录下新建 assets 资源文件,在新建一个JsonData.json 文件,复制数据源到此文件里

{
    "code": "200",
    "data": {
        "result": [
            {
                "id": 1,
                "list": [
                    {
                        "name": "全部分类"
                    }
                ],
                "name": "全部分类"
            },
            {
                "id": 2,
                "list": [
                    {
                        "name": "天安门"
                    },
                    {
                        "name": "故宫"
                    },
                    {
                        "name": "颐和园"
                    },
                    {
                        "name": "圆明园"
                    },
                    {
                        "name": "北海公园"
                    },
                    {
                        "name": "雍和宫"
                    }
                ],
                "name": "景点"
            },
            {
                "id": 2,
                "list": [
                    {
                        "name": "海鲜"
                    },
                    {
                        "name": "烧烤"
                    },
                    {
                        "name": "火锅"
                    },
                    {
                        "name": "烤肉"
                    },
                    {
                        "name": "西餐"
                    },
                    {
                        "name": "日料"
                    }
                ],
                "name": "餐饮"
            },
            {
                "id": 2,
                "list": [
                    {
                        "name": "西单"
                    },
                    {
                        "name": "SKP"
                    },
                    {
                        "name": "荟聚"
                    },
                    {
                        "name": "凯德茂"
                    },
                    {
                        "name": "奥特莱斯"
                    },
                    {
                        "name": "老佛爷"
                    }
                ],
                "name": "购物地"
            },
            {
                "id": 2,
                "list": [
                    {
                        "name": "电影"
                    },
                    {
                        "name": "SPA"
                    },
                    {
                        "name": "密室逃脱"
                    },
                    {
                        "name": "酒吧"
                    },
                    {
                        "name": "KTV"
                    },
                    {
                        "name": "足疗"
                    },
                    {
                        "name": "汗蒸/洗浴"
                    }
                ],
                "name": "休闲娱乐"
            },
            {
                "id": 2,
                "list": [
                    {
                        "name": "希岸"
                    },
                    {
                        "name": "云朵"
                    },
                    {
                        "name": "橘子"
                    },
                    {
                        "name": "兰朵"
                    },
                    {
                        "name": "汉庭"
                    },
                    {
                        "name": "如家"
                    },
                    {
                        "name": "维也纳"
                    }
                ],
                "name": "酒店"
            }
        ]
    },
    "message": "success"
}

3. 布局文件

主页面  activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:orientation="horizontal"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <LinearLayout
            android:id="@+id/ll_list_default"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/ll_list_default_txt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="综合排序"
                android:textColor="#333333"
                android:textSize="15dp" />

            <ImageView
                android:id="@+id/ll_list_default_icon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:src="@mipmap/screen_icon_normal" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/ll_list_brand"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/list_brand_txt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="全部分类"
                android:textColor="#333333"
                android:textSize="15dp" />

            <ImageView
                android:id="@+id/ll_list_brand_icon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:src="@mipmap/screen_icon_normal" />
        </LinearLayout>


        <LinearLayout
            android:id="@+id/list_list_type"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/list_list_type_txt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="全部商区"
                android:textColor="#333333"
                android:textSize="15dp" />

            <ImageView
                android:id="@+id/list_list_type_icon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:src="@mipmap/screen_icon_normal" />
        </LinearLayout>


    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

一级 AcolumnAdapter 适配器 item 文件

a_column_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/tv_class_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp" />


</LinearLayout>

二级 BcolumnAdapter 适配器 item 文件

b_column_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_layout"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:gravity="center|left"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="20dp" />

    <ImageView
        android:id="@+id/iv_select_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="15dp"
        android:src="@mipmap/icon_pair_number"
        android:visibility="gone" />


</RelativeLayout>

单选 GeneAdapter 适配器 item 文件

item_listview_popwin.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ffffff"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/lv_pop_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:paddingLeft="15dp"
        android:paddingRight="15dp">

        <TextView
            android:id="@+id/listview_popwind_tv"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:textColor="#333333"
            android:textSize="14dp" />

        <ImageView
            android:id="@+id/iv_select_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/icon_pair_number"
            android:visibility="gone" />
    </LinearLayout>

</LinearLayout>

这里是 popupWindow 实现二级联动 布局文件,

popwin_supplier_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ffffff"
    android:orientation="vertical">


    <com.summer.popwindow.MyScrollView
        android:id="@+id/pop_common_sl_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">

                    <androidx.recyclerview.widget.RecyclerView
                        android:id="@+id/popwin_supplier_list_lv"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1" />

                    <androidx.recyclerview.widget.RecyclerView
                        android:id="@+id/supplier_list_lv"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1" />


                </LinearLayout>

            </LinearLayout>
        </LinearLayout>
    </com.summer.popwindow.MyScrollView>

</LinearLayout>

4. 自定义 MyScrollView

在 popupWindow 布局里自定义了 MyScrollView,重写 onMeasure() 方法可以实现自定义测量规则。其中,使用 getMeasuredHeight() 方法和 getMeasuredWidth() 方法可以获取 ScrollView 的测量高度和测量宽度。通过 setMaxHeight 来设置 ScrollView 的最大高度

public class MyScrollView extends ScrollView {
    public static final String TAG = "MyScrollView";
    private int maxHeight = -1;

    public MyScrollView(Context context) {
        super(context);
    }

    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int height = getMeasuredHeight();
        int width = getMeasuredWidth();
        if (maxHeight > 0 && height > maxHeight) {
            setMeasuredDimension(width, maxHeight);
        }
    }

    public void setMaxHeight(int height) {
        this.maxHeight = height;
    }
}

5.读取本地资源文件工具类

public class ToolsUtils {

    /**
     * 读取本地资源文件
     *
     * @param context  上下文
     * @param fileName 本地数据文件名
     * @return
     */
    public static String getFromAssets(Context context, String fileName) {
        InputStreamReader inputReader = null;
        BufferedReader bufReader = null;
        try {
            inputReader = new InputStreamReader(context.getResources().getAssets().open(fileName));
            bufReader = new BufferedReader(inputReader);
            String line = "";
            StringBuilder result = new StringBuilder();
            while ((line = bufReader.readLine()) != null)
                result.append(line);
            return result.toString();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputReader != null) {
                    inputReader.close();
                }
                if (bufReader != null) {
                    bufReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "";
    }
}

6.数据实体类 JsonBean

public class JsonBean {


    private String code;
    private String message;
    private DataBean data;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public DataBean getData() {
        return data;
    }

    public void setData(DataBean data) {
        this.data = data;
    }

    public static class DataBean {
        private List<ResultBean> result;

        public List<ResultBean> getResult() {
            return result;
        }

        public void setResult(List<ResultBean> result) {
            this.result = result;
        }

        public static class ResultBean {
            private int id;
            private List<ListBean> list;
            private String name;

            public int getId() {
                return id;
            }

            public void setId(int id) {
                this.id = id;
            }

            public List<ListBean> getList() {
                return list;
            }

            public void setList(List<ListBean> list) {
                this.list = list;
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public static class ListBean {
                private String name;

                public String getName() {
                    return name;
                }

                public void setName(String name) {
                    this.name = name;
                }
            }
        }
    }
}

7.一级适配器 AcolumnAdapter

public class AcolumnAdapter extends BaseQuickAdapter<JsonBean.DataBean.ResultBean, BaseViewHolder> {
    private int position;


    public AcolumnAdapter(int layoutResId, @Nullable List<JsonBean.DataBean.ResultBean> resultList) {
        super(layoutResId, resultList);
    }

    @Override
    protected void convert(BaseViewHolder helper, JsonBean.DataBean.ResultBean item) {
        helper.setTextColor(R.id.tv_class_name, helper.getLayoutPosition() == position ? Color.parseColor("#00d8a0") : Color.parseColor("#363636"));
        helper.setText(R.id.tv_class_name, item.getName());
    }

    public void setSelection(int pos) {
        this.position = pos;
        notifyDataSetChanged();
    }

}

8.二级适配器 BcolumnAdapter

public class BcolumnAdapter extends BaseQuickAdapter<JsonBean.DataBean.ResultBean.ListBean, BaseViewHolder> {

    private BcolumnAdapter.OnCallBackData<JsonBean.DataBean.ResultBean.ListBean> onCallBackData;

    public BcolumnAdapter(int layoutResId, @Nullable List<JsonBean.DataBean.ResultBean.ListBean> resultList) {
        super(layoutResId, resultList);
    }

    @Override
    protected void convert(BaseViewHolder helper, JsonBean.DataBean.ResultBean.ListBean item) {
        helper.addOnClickListener(R.id.item_layout);
        helper.setText(R.id.tv_name, item.getName() + "");
        onCallBackData.convertView(helper, item);
    }

    public void setOnCallBackData(BcolumnAdapter.OnCallBackData<JsonBean.DataBean.ResultBean.ListBean> onCallBackData) {
        this.onCallBackData = onCallBackData;
    }


    public interface OnCallBackData<T> {
        void convertView(BaseViewHolder holder, T item);
    }
}

9.单选适配器 GeneAdapter

public class GeneAdapter<T> extends BaseQuickAdapter<T, BaseViewHolder> {

    public GeneAdapter(@LayoutRes int layoutResId, @Nullable List<T> data) {
        super(layoutResId, data);
    }

    public GeneAdapter(@Nullable List<T> data) {
        super(data);
    }

    public GeneAdapter(@LayoutRes int layoutResId) {
        super(layoutResId);
    }


    private OnCallBackData<T> onCallBackData;

    @Override
    protected void convert(BaseViewHolder holder, T item) {
        if (onCallBackData != null) {
            onCallBackData.convertView(holder, item);
        }
    }

    public void setOnCallBackData(OnCallBackData<T> onCallBackData) {
        this.onCallBackData = onCallBackData;
    }

    public interface OnCallBackData<T> {
        void convertView(BaseViewHolder holder, T item);
    }

}

这里在 adapter 中 定义了一个 OnCallBackData 接口,它是一个泛型接口,表示在回调中传递数据的类型是 T。该接口包含一个 convertView() 方法,用于将数据绑定到 ViewHolder 中。同二级适配器 BcolumnAdapter 中一样  类型可以自定,其中,BaseViewHolder 是一个通用的 ViewHolder 类,用于存储 ItemView 中的 View 控件,从而避免在每次滚动列表时都重新查找控件。OnCallBackData 接口将数据绑定到 ViewHolder 中,可以通过 ViewHolder 中的控件来更新 ItemView 的内容。该接口的作用是将数据和视图分离,避免在 Activity 或 Fragment 中写过多的 UI 逻辑,同时也方便数据的管理和更新。通过实现该接口,可以将数据的获取和数据的展示分为两个部分,提高代码的可读性和可维护性。在 MainActivity 实现该接口,用于展示 选中效果

10.最后 MainActivity 代码实现

 主要是读取本地数据添加到数组,以及 popupWindow 的创建 跟点击交互

public class MainActivity extends AppCompatActivity {

    private LinearLayout ll_list_default;
    private TextView ll_list_default_txt;
    private ImageView ll_list_default_icon;

    private LinearLayout ll_list_brand;
    private TextView list_brand_txt;
    private ImageView ll_list_brand_icon;

    private LinearLayout list_list_type;
    private TextView list_list_type_txt;
    private ImageView list_list_type_icon;

    private RecyclerView recyclerView;
    private GeneAdapter<String> popAdapter, popAdapter2;
    private List<String> popList, popList1, popList2;
    private PopupWindow popupWindow;
    private String currentBrand, currentType;
    private MyScrollView ui_sl_container;
    private RecyclerView assRecyclerView;
    private String jsonData;
    private AcolumnAdapter acolumnAdapter;
    private BcolumnAdapter bcolumnAdapter;
    private List<JsonBean.DataBean.ResultBean> resultList;
    private List<JsonBean.DataBean.ResultBean.ListBean> result1List;

    private int flag = 0;

    private boolean clickFlag = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        InitView();


        String fromAssets = ToolsUtils.getFromAssets(this, "JsonData.json");
        JsonBean jsonBean = new Gson().fromJson(fromAssets, JsonBean.class);
        resultList = jsonBean.getData().getResult();

        String fromAssets1 = ToolsUtils.getFromAssets(this, "JsonData.json");
        JsonBean jsonBean1 = new Gson().fromJson(fromAssets1, JsonBean.class);
        result1List = jsonBean1.getData().getResult().get(0).getList();


        ll_list_default = findViewById(R.id.ll_list_default);
        ll_list_default_txt = findViewById(R.id.ll_list_default_txt);
        ll_list_default_icon = findViewById(R.id.ll_list_default_icon);

        ll_list_brand = findViewById(R.id.ll_list_brand);
        list_brand_txt = findViewById(R.id.list_brand_txt);
        ll_list_brand_icon = findViewById(R.id.ll_list_brand_icon);

        list_list_type = findViewById(R.id.list_list_type);
        list_list_type_txt = findViewById(R.id.list_list_type_txt);
        list_list_type_icon = findViewById(R.id.list_list_type_icon);


        View contentView = getLayoutInflater().inflate(R.layout.popwin_supplier_list, null);
        ui_sl_container = contentView.findViewById(R.id.pop_common_sl_container);
        ui_sl_container.setMaxHeight(860);
        //二级列表
        assRecyclerView = contentView.findViewById(R.id.supplier_list_lv);
        //一级列表
        recyclerView = contentView.findViewById(R.id.popwin_supplier_list_lv);

        popupWindow = new PopupWindow(contentView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, false);
        popupWindow.setOutsideTouchable(true);
        popupWindow.setBackgroundDrawable(new BitmapDrawable());
        popupWindow.setFocusable(true);
        popupWindow.setAnimationStyle(R.style.popwin_anim_style);
        //监听popupWindow关闭事件
        popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                ll_list_default_txt.setTextColor(Color.parseColor("#333333"));
                ll_list_default_icon.setImageResource(R.mipmap.screen_icon_normal);
                list_brand_txt.setTextColor(Color.parseColor("#333333"));
                ll_list_brand_icon.setImageResource(R.mipmap.screen_icon_normal);
                list_list_type_txt.setTextColor(Color.parseColor("#333333"));
                list_list_type_icon.setImageResource(R.mipmap.screen_icon_normal);
                clickFlag = true;
            }
        });
        ll_list_default.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (clickFlag) {
                    ll_list_default_txt.setTextColor(Color.parseColor("#00d8a0"));
                    ll_list_default_icon.setImageResource(R.mipmap.screen_icon_selected);
                    clickFlag = false;
                } else {
                    ll_list_default_txt.setTextColor(Color.parseColor("#333333"));
                    ll_list_default_icon.setImageResource(R.mipmap.screen_icon_normal);
                    clickFlag = true;
                }
                assRecyclerView.setVisibility(View.GONE);
                showPopupWindow0(v);
            }
        });

        ll_list_brand.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (clickFlag) {
                    list_brand_txt.setTextColor(Color.parseColor("#00d8a0"));
                    ll_list_brand_icon.setImageResource(R.mipmap.screen_icon_selected);
                    clickFlag = false;
                } else {
                    list_brand_txt.setTextColor(Color.parseColor("#333333"));
                    ll_list_brand_icon.setImageResource(R.mipmap.screen_icon_normal);
                    clickFlag = true;
                }

                assRecyclerView.setVisibility(View.VISIBLE);
                showPopupWindow1(v);
            }
        });

        list_list_type.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (clickFlag) {
                    list_list_type_txt.setTextColor(Color.parseColor("#00d8a0"));
                    list_list_type_icon.setImageResource(R.mipmap.screen_icon_selected);
                    clickFlag = false;
                } else {
                    list_list_type_txt.setTextColor(Color.parseColor("#333333"));
                    list_list_type_icon.setImageResource(R.mipmap.screen_icon_normal);
                    clickFlag = true;
                }

                assRecyclerView.setVisibility(View.GONE);
                showPopupWindow2(v);
            }
        });
    }


    private void showPopupWindow0(View v) {
        popupWindow.showAsDropDown(v);
        popAdapter = new GeneAdapter<>(R.layout.item_listview_popwin, popList);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(popAdapter);

        popAdapter.setOnCallBackData(new GeneAdapter.OnCallBackData<String>() {
            @Override
            public void convertView(BaseViewHolder holder, String item) {
                ((TextView) holder.getView(R.id.listview_popwind_tv)).setText(item);
                String list_default_trim = ll_list_default_txt.getText().toString().trim();
                if (list_default_trim.equals(item)) {
                    ((TextView) holder.getView(R.id.listview_popwind_tv)).setTextColor(Color.parseColor("#00d8a0"));
                    holder.getView(R.id.iv_select_icon).setVisibility(View.VISIBLE);
                } else {
                    ((TextView) holder.getView(R.id.listview_popwind_tv)).setTextColor(Color.parseColor("#333333"));
                    holder.getView(R.id.iv_select_icon).setVisibility(View.GONE);
                }
            }
        });

        popAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
             
                popupWindow.dismiss();
                currentBrand = popList.get(position);
                ll_list_default_txt.setText(currentBrand);
                ll_list_default_txt.setTextColor(Color.parseColor("#333333"));
                ll_list_default_icon.setImageResource(R.mipmap.screen_icon_normal);
                clickFlag = true;
            }
        });

    }

    private void showPopupWindow1(View v) {
        popupWindow.showAsDropDown(v);
        acolumnAdapter = new AcolumnAdapter(R.layout.a_column_layout, resultList);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(acolumnAdapter);
        //设置默认的选取状态
        acolumnAdapter.setSelection(flag);


        bcolumnAdapter = new BcolumnAdapter(R.layout.b_column_layout, result1List);
        assRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        assRecyclerView.setAdapter(bcolumnAdapter);

        result1List.clear();
        result1List.addAll(resultList.get(flag).getList());
        bcolumnAdapter.notifyDataSetChanged();


        bcolumnAdapter.setOnCallBackData(new BcolumnAdapter.OnCallBackData<JsonBean.DataBean.ResultBean.ListBean>() {
            @Override
            public void convertView(BaseViewHolder holder, JsonBean.DataBean.ResultBean.ListBean item) {
                ((TextView) holder.getView(R.id.tv_name)).setText(item.getName());
                String list_brand_trim = list_brand_txt.getText().toString().trim();
                if (list_brand_trim.equals(item.getName())) {
                    ((TextView) holder.getView(R.id.tv_name)).setTextColor(Color.parseColor("#00d8a0"));
                    holder.getView(R.id.iv_select_icon).setVisibility(View.VISIBLE);
                } else {
                    ((TextView) holder.getView(R.id.tv_name)).setTextColor(Color.parseColor("#333333"));
                    holder.getView(R.id.iv_select_icon).setVisibility(View.GONE);
                }
            }
        });

        //左侧列表的事件处理
        acolumnAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                acolumnAdapter.setSelection(position);
                flag = position;
                result1List.clear();
                result1List.addAll(resultList.get(position).getList());
                bcolumnAdapter.notifyDataSetChanged();
            }
        });
        //右侧列表的事件处理
        bcolumnAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
                String name = result1List.get(position).getName();
                list_brand_txt.setText(name);
                acolumnAdapter.setSelection(flag);
                list_brand_txt.setTextColor(Color.parseColor("#333333"));
                ll_list_brand_icon.setImageResource(R.mipmap.screen_icon_normal);
                clickFlag = true;
                result1List.clear();
                popupWindow.dismiss();
            }
        });

    }

    private void showPopupWindow2(View v) {
        popupWindow.showAsDropDown(v);
        popAdapter2 = new GeneAdapter<>(R.layout.item_listview_popwin, popList2);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(popAdapter2);
        popAdapter2.setOnCallBackData(new GeneAdapter.OnCallBackData<String>() {
            @Override
            public void convertView(BaseViewHolder holder, String item) {
                ((TextView) holder.getView(R.id.listview_popwind_tv)).setText(item);
                String list_list_trim = list_list_type_txt.getText().toString().trim();
                if (list_list_trim.equals(item)) {
                    ((TextView) holder.getView(R.id.listview_popwind_tv)).setTextColor(Color.parseColor("#00d8a0"));
                    holder.getView(R.id.iv_select_icon).setVisibility(View.VISIBLE);
                } else {
                    ((TextView) holder.getView(R.id.listview_popwind_tv)).setTextColor(Color.parseColor("#333333"));
                    holder.getView(R.id.iv_select_icon).setVisibility(View.GONE);
                }
            }
        });

        popAdapter2.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
               
                popupWindow.dismiss();
                currentType = popList2.get(position);
                list_list_type_txt.setText(currentType);
                list_list_type_txt.setTextColor(Color.parseColor("#333333"));
                list_list_type_icon.setImageResource(R.mipmap.screen_icon_normal);
                clickFlag = true;
            }
        });

    }

    private void InitView() {
        popList = new ArrayList<>();
        popList.add("综合排序");
        popList.add("距离优先");
        popList.add("人气优先");

        jsonData = JSON.toJSONString(popList);
        Log.e("tag", jsonData);

        popList1 = new ArrayList<>();
        popList1.add("全部分类");
        popList1.add("景点");
        popList1.add("餐饮");
        popList1.add("购物地");
        popList1.add("休闲娱乐");
        popList1.add("酒店");

        jsonData = JSON.toJSONString(popList1);
        Log.e("tag", jsonData);

        popList2 = new ArrayList<>();
        popList2.add("全部商区");
        popList2.add("热门商区");
        popList2.add("朝阳区");
        popList2.add("东城区");
        popList2.add("海淀区");
        popList2.add("西城区");
        popList2.add("丰台区");
        popList2.add("延庆区");
        popList2.add("顺义区");
        popList2.add("昌平区");
        popList2.add("密云区");
        popList2.add("怀柔区");
        popList2.add("石景山区");
        popList2.add("房山区");
        popList2.add("大兴区");
        popList2.add("通州区");

        jsonData = JSON.toJSONString(popList2);
        Log.e("tag", jsonData);

    }
}

总结

以上就是全部代码,利用 PopupWindow + RecyclerView 实现筛选二级联动功能,代码很简单,需要注意一下 PopupWindow  关闭事件 跟 控件点击事件 之间的焦点冲突问题,

如果对你有所帮助的话,不妨 Star 或 Fork,青山不改,绿水长流 有缘江湖再见 ~

源码地址:PopLinkage文章来源地址https://www.toymoban.com/news/detail-540967.html

到了这里,关于Android PopupWindow+RecyclerView 实现二级联动筛选的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 无限循环RecyclerView的完美实现方案

    方案1 对Adapter进行修改 网上大部分博客的解决方案都是这种方案,对Adapter做修改。具体如下 首先,让 Adapter 的 getItemCount() 方法返回 Integer.MAX_VALUE,使得position数据达到很大很大; 其次,在 onBindViewHolder() 方法里对position参数取余运算,拿到position对应的真实数据索引,然后对

    2024年01月23日
    浏览(46)
  • Android studio 之 弹窗PopupWindow

    参数一 ,用在弹窗中的View(注意不是布局资源id,所以要根据布局资源id转换成view) 布局文件(.xml文件)定义了UI元素的结构和外观,而View对象则代表了布局中的一个具体的UI元素。 通过使用LayoutInflater类,我们可以将布局文件解析成一个View对象,然后将布局文件转换为实际可见的

    2024年01月22日
    浏览(75)
  • Android 实现 RecyclerView下拉刷新,SwipeRefreshLayout上拉加载

    上拉、下拉的效果图如下: 使用步骤 1、在清单文件中添加依赖 implementation ‘com.android.support:recyclerview-v7:27.1.1’ implementation “androidx.swiperefreshlayout:swiperefreshlayout:1.0.0” 2、main布局 item.xml footview.xml(底部提示) 2、MyAdapter 3、MainActivity实现

    2024年02月13日
    浏览(44)
  • Android的RecyclerView实现列表拖动(移动顺序)交换数据位置

    1.先看效果图 这是拖动前的图片 这是拖动列表改变位置后的图片 这里放上视频演示 RecyclerView实现列表拖动交换数据位置 2.主活动MainActivity2类代码如下

    2024年02月12日
    浏览(49)
  • 如何在 Android 应用中使用 RecyclerView 实现一个列表显示,并实现点击事件?

    首先,需要在项目的 build.gradle 文件中添加 RecyclerView 的依赖: 接下来,在布局文件中添加 RecyclerView: 接着,需要创建一个 Adapter 类,用于将数据绑定到 RecyclerView 上,如下所示: 在 onBindViewHolder() 方法中,我们可以将数据绑定到 ViewHolder 中的视图上。 需要注意的是,在 V

    2024年02月05日
    浏览(48)
  • Android RecyclerView实现购物车功能(完善详解篇-保姆级教程)

    购物车实现图片: 首先新建model 随便一个名字 ,例如ShoppingCart 功能一: RecyclerView布局的实现 ①创建MainActivity ②在MainActivity布局中添加RecyclerView组件 ◼ 布局位置在layout中如图位置: recyclerview如图中间部分: (注:其他布局可自己通过拖动组件实现) ◼ activity_main.xml的布局

    2024年02月04日
    浏览(110)
  • android——spinner下拉弹窗、popupwindow下拉弹窗列表

    效果图如下: adapter的代码: xml代码: MainActivity代码 具体的代码下载地址为:https://download.csdn.net/download/wy313622821/88274359 效果图为:     代码下载地址为: https://download.csdn.net/download/wy313622821/88275750

    2024年02月09日
    浏览(47)
  • 【Android】RecyclerView实现列表中的Item之间设置间距的一种方式

    RecyclerView 的 Item 默认没有间距是因为 RecyclerView 是一个高度自定义的控件,它的目标是提供一个高效灵活的列表展示,并且适应各种不同的布局需求。 为了让开发者能够充分自定义列表项的布局和样式,RecyclerView 没有默认设置项来添加 item 之间的间距。这样设计的好处是,

    2024年02月13日
    浏览(50)
  • Android kotlin 实现仿淘宝RecyclerView和对应下的指示器功能

    指示器样式 , 第二个gif是用模拟器的,gif有小问题,第三个截图没问题 在 app 的 build.gradle 在添加以下代码 1、 implementation \\\'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6\\\' ,这个里面带的适配器,直接调用就即可 这依赖包还需要得到要添加,在 Project 的 build.gradle 在添加以下代码

    2024年02月09日
    浏览(39)
  • Android入门第64天-MVVM下瀑布流界面的完美实现-使用RecyclerView

            网上充满着不完善的基于RecyclerView的瀑布流实现, 要么 根本是错的、 要么 就是只知其一不知其二、 要么 就是一充诉了一堆无用代码、要么用的是古老的MVC设计模式。         一个真正的、用户体验类似于淘宝、抖音的瀑布流怎么实现目前基本为无解。因为本

    2024年02月02日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包