省市级 三级联动 Recyclerview

128 阅读5分钟

9A85190934E1C5608ECBF166EE3ABDDD.jpg

先看布局文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/yuanjiao_baise"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <LinearLayout
        android:id="@+id/bar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        android:gravity=""
        android:orientation="horizontal">
        <androidx.appcompat.widget.AppCompatTextView
            android:layout_width="0dp"
            android:layout_weight="1"
            android:textSize="@dimen/sp_20"
            android:layout_height="wrap_content"
            android:textColor="@color/black"
            android:layout_marginTop="@dimen/dp_21"
            android:layout_marginLeft="@dimen/dp_24"
            android:text="选择地址"/>
        <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/close"
            android:layout_marginTop="@dimen/dp_21"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="@dimen/dp_15"
            android:paddingRight="@dimen/dp_15"
            android:src="@drawable/icon_close"/>
    </LinearLayout>
    <LinearLayout
        android:layout_marginLeft="@dimen/dp_24"
        android:layout_marginRight="@dimen/dp_24"
        android:layout_marginTop="@dimen/dp_12"
        android:layout_marginBottom="@dimen/dp_12"
        app:layout_constraintTop_toBottomOf="@id/bar"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_180"
        android:orientation="vertical">
        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@color/white_54"/>
        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_36"
            android:background="@drawable/bg_yj_heise_8" />
        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@color/white_54"/>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/ll_rv"
        android:layout_marginLeft="@dimen/dp_24"
        android:layout_marginRight="@dimen/dp_24"
        android:layout_marginTop="@dimen/dp_12"
        android:layout_marginBottom="@dimen/dp_12"
        app:layout_constraintTop_toBottomOf="@id/bar"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_180"
        android:orientation="horizontal">
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_1"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"/>
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_2"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"/>
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_3"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"/>
    </LinearLayout>

    <LinearLayout
        android:layout_marginLeft="@dimen/dp_24"
        android:layout_marginRight="@dimen/dp_24"
        android:layout_marginTop="@dimen/dp_12"
        android:layout_marginBottom="@dimen/dp_12"
        app:layout_constraintTop_toBottomOf="@id/bar"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_180"
        android:orientation="vertical">
        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@color/white_54"/>
        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_36" />
        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@color/white_54"/>
    </LinearLayout>
    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/login"
        app:layout_constraintTop_toBottomOf="@id/ll_rv"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_36"
        android:layout_marginLeft="@dimen/dp_12"
        android:layout_marginTop="@dimen/dp_24"
        android:layout_marginRight="@dimen/dp_12"
        android:background="@drawable/hongse_yj_25"
        android:text="确定"
        android:textColor="@color/white"
        android:textSize="@dimen/sp_18" />
    <View
        app:layout_constraintTop_toBottomOf="@id/login"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_1"
        android:layout_marginTop="@dimen/dp_54"/>
</androidx.constraintlayout.widget.ConstraintLayout>

滚轮类

package com.duomakeji.myapplication.dialog;

import android.app.Dialog;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatDialogFragment;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearSmoothScroller;
import androidx.recyclerview.widget.LinearSnapHelper;
import androidx.recyclerview.widget.RecyclerView;

import com.duomakeji.myapplication.App;
import com.duomakeji.myapplication.Monitor;
import com.duomakeji.myapplication.R;
import com.duomakeji.myapplication.data.AreaList;
import com.duomakeji.myapplication.databinding.DialogCheckTowerBinding;
import com.duomakeji.myapplication.databinding.DialogPhotoAlbumBinding;
import com.duomakeji.myapplication.databinding.ItemCheckTowerBinding;

import java.util.ArrayList;
import java.util.List;

public class CheckTowerDialog extends AppCompatDialogFragment {

    private static final  String TAG="三级滚轮";
    private DialogCheckTowerBinding binding;
    private List<AreaList> AreaList;

    private List<Data> dataList1 = new ArrayList<>();
    private List<Data> dataList3 = new ArrayList<>();
    private CheckTowerAdapter adapter1;
    private CheckTowerAdapter adapter2;
    private CheckTowerAdapter adapter3;
    private List<Data> sheng = new ArrayList<>();
    private List<Data> shi = new ArrayList<>();
    private List<Data> qu = new ArrayList<>();
    List<Data> shenglist=new ArrayList<>();
    List<Data> shilist=new ArrayList<>();
    List<Data> qulist=new ArrayList<>();

    private String region="";
    private String regionCode="";
    public interface CheckTowerListener{
        void checkTower(String region,String regionCode);
    }
    public CheckTowerListener checkTowerListener;
    public CheckTowerDialog(CheckTowerListener checkTowerListener) {
        this.checkTowerListener=checkTowerListener;
        dataList1.add(new Data());
        dataList1.add(new Data());
        dataList1.add(new Data());
        dataList1.add(new Data());
        dataList1.add(new Data());

        dataList3.add(new Data());
        dataList3.add(new Data());
        dataList3.add(new Data());
        dataList3.add(new Data());
        dataList3.add(new Data());

        this.AreaList = App.getApp().getAreaList();
        sheng.addAll(dataList1);
        shi.addAll(dataList1);
        qu.addAll(dataList1);
        for (AreaList areaList: AreaList) {
            shenglist.add(new Data(areaList.getName(),areaList.getCode(),areaList.isChecked()));
            if(areaList.isChecked()){
                for (AreaList.ListDTO listDTO: areaList.getList()) {
                    shilist.add(new Data(listDTO.getName(),listDTO.getCode(),listDTO.isChecked()));
                    if(listDTO.isChecked()){
                        for (AreaList.ListDTO.ListDT1 listDT1: listDTO.getList()) {
                            qulist.add(new Data(listDT1.getName(),listDT1.getCode(),listDT1.isChecked()));
                        }
                    }
                }
            }
        }
        sheng.addAll(shenglist);
        shi.addAll(shilist);
        qu.addAll(qulist
        );
        sheng.addAll(dataList3);
        shi.addAll(dataList3);
        qu.addAll(dataList3);
    }





    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        binding = DialogCheckTowerBinding.inflate(inflater, container, false);
        return binding.getRoot();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        adapter1 = new CheckTowerAdapter(sheng);
        binding.rv1.setLayoutManager(new CenterLayoutManager(requireActivity()));
        binding.rv1.setAdapter(adapter1);
        final LinearSnapHelper linearSnapHelper = new LinearSnapHelper();
        linearSnapHelper.attachToRecyclerView(binding.rv1);
        binding.rv1.getLayoutManager().smoothScrollToPosition(binding.rv1, new RecyclerView.State(), dataList1.size());

        binding.rv1.addOnScrollListener(new RecyclerView.OnScrollListener() {
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    if (recyclerView != null && recyclerView.getChildCount() > 0) {
                        View view = linearSnapHelper.findSnapView(binding.rv1.getLayoutManager());
                        int position =binding.rv1.getLayoutManager().getPosition(view);
                        Log.e(TAG, "--------" + position);
                        if (position < dataList1.size()) {
                            Log.e(TAG, "----空白----");
                            recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, new RecyclerView.State(), dataList1.size());
                        }else if (position > sheng.size() - dataList3.size()-1) {
                            Log.e(TAG, sheng.size()+"----空白----"+(sheng.size() - dataList3.size()-1));
                            recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, new RecyclerView.State(), sheng.size() - dataList3.size()-1);
                        }else if(position >= dataList1.size()
                                && position <= sheng.size() - dataList3.size()-1){
                            for (AreaList areaList: AreaList) {
                                areaList.setChecked(false);
                                for (AreaList.ListDTO listDTO: areaList.getList()) {
                                    listDTO.setChecked(false);
                                    for (AreaList.ListDTO.ListDT1 listDT1:listDTO.getList()) {
                                        listDT1.setChecked(false);
                                    }
                                }
                            }
                            AreaList.get(position - dataList3.size()).setChecked(true);
                            AreaList.get(position - dataList3.size()).getList().get(0).setChecked(true);
                            if(AreaList.get(position - dataList3.size()).getList().get(0).getList().size()!=0) {
                                AreaList.get(position - dataList3.size()).getList().get(0).getList().get(0).setChecked(true);
                            }
                            shi.clear();
                            qu.clear();
                            shi.addAll(dataList1);
                            qu.addAll(dataList1);
                            shilist.clear();
                            qulist.clear();
                            for (AreaList areaList: AreaList) {
                                if(areaList.isChecked()){
                                    for (AreaList.ListDTO listDTO: areaList.getList()) {
                                        shilist.add(new Data(listDTO.getName(),listDTO.getCode(),listDTO.isChecked()));
                                        if(listDTO.isChecked()){
                                            for (AreaList.ListDTO.ListDT1 listDT1: listDTO.getList()) {
                                                qulist.add(new Data(listDT1.getName(),listDT1.getCode(),listDT1.isChecked()));
                                            }
                                        }
                                    }
                                }
                            }
                            shi.addAll(shilist);
                            qu.addAll(qulist);
                            shi.addAll(dataList3);
                            qu.addAll(dataList3);
                            adapter2.notifyDataSetChanged();
                            adapter3.notifyDataSetChanged();
                            binding.rv2.getLayoutManager().smoothScrollToPosition(recyclerView, new RecyclerView.State(), dataList1.size());
                            binding.rv3.getLayoutManager().smoothScrollToPosition(recyclerView, new RecyclerView.State(), dataList1.size());
                        }
                    }
                }
            }
        });


        adapter2 = new CheckTowerAdapter(shi);

        binding.rv2.setLayoutManager(new CenterLayoutManager(requireActivity()));
        binding.rv2.setAdapter(adapter2);
        final LinearSnapHelper linearSnapHelper2 = new LinearSnapHelper();
        linearSnapHelper2.attachToRecyclerView(binding.rv2);
        binding.rv2.getLayoutManager().smoothScrollToPosition(binding.rv2, new RecyclerView.State(), dataList1.size());

        binding.rv2.addOnScrollListener(new RecyclerView.OnScrollListener() {
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    if (recyclerView != null && recyclerView.getChildCount() > 0) {
                        View view = linearSnapHelper.findSnapView(binding.rv2.getLayoutManager());
                        int position =binding.rv2.getLayoutManager().getPosition(view);
                        if (position < dataList1.size()) {
                            Log.e(TAG, "----空白----"+position);
                            recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, new RecyclerView.State(), dataList1.size());
                        }else if (position > shi.size() - dataList3.size()-1) {
                            Log.e(TAG, shi.size()+"----空白----"+(shi.size() - dataList3.size()-1));
                            recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, new RecyclerView.State(), shi.size() - dataList3.size()-1);
                        }else if(position >= dataList1.size()
                                && position <= sheng.size() - dataList3.size()-1){
                            for (AreaList areaList: AreaList) {
                                for (AreaList.ListDTO listDTO: areaList.getList()) {
                                    listDTO.setChecked(false);
                                    for (AreaList.ListDTO.ListDT1 listDT1:listDTO.getList()) {
                                        listDT1.setChecked(false);
                                    }
                                }
                            }
                            for (AreaList areaList: AreaList) {
                                if(areaList.isChecked()){
                                    areaList.getList().get(position - dataList3.size()).setChecked(true);
                                    if(areaList.getList().get(position - dataList3.size()).getList().size()!=0) {
                                        areaList.getList().get(position - dataList3.size()).getList().get(0).setChecked(true);
                                    }
                                }
                            }
                            qu.clear();
                            qu.addAll(dataList1);
                            qulist.clear();
                            for (AreaList areaList: AreaList) {
                                if(areaList.isChecked()){
                                    for (AreaList.ListDTO listDTO: areaList.getList()) {
                                        if(listDTO.isChecked()){
                                            for (AreaList.ListDTO.ListDT1 listDT1: listDTO.getList()) {
                                                qulist.add(new Data(listDT1.getName(),listDT1.getCode(),listDT1.isChecked()));
                                            }
                                        }
                                    }
                                }
                            }
                            qu.addAll(qulist);
                            qu.addAll(dataList3);
                            adapter3.notifyDataSetChanged();
                            binding.rv3.getLayoutManager().smoothScrollToPosition(recyclerView, new RecyclerView.State(), dataList1.size());
                        }

                    }
                }
            }
        });



        adapter3 = new CheckTowerAdapter(qu);

        binding.rv3.setLayoutManager(new CenterLayoutManager(requireActivity()));
        binding.rv3.setAdapter(adapter3);
        final LinearSnapHelper linearSnapHelper3 = new LinearSnapHelper();
        linearSnapHelper3.attachToRecyclerView(binding.rv3);
        binding.rv3.getLayoutManager().smoothScrollToPosition(binding.rv3, new RecyclerView.State(), dataList1.size());

        binding.rv3.addOnScrollListener(new RecyclerView.OnScrollListener() {
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    if (recyclerView != null && recyclerView.getChildCount() > 0) {
                        View view = linearSnapHelper.findSnapView(binding.rv3.getLayoutManager());
                        int position =binding.rv3.getLayoutManager().getPosition(view);
                        Log.e(TAG, "--------" + position);
                        if (position < dataList1.size()) {
                            Log.e(TAG, "----空白----");
                            recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, new RecyclerView.State(), dataList1.size());
                        }else if (position > qu.size() - dataList3.size()-1) {
                            Log.e(TAG, qu.size()+"----空白----"+(qu.size() - dataList3.size()-1));
                            recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView, new RecyclerView.State(), qu.size() - dataList3.size()-1);
                        }else if(position >= dataList1.size()
                                && position <= sheng.size() - dataList3.size()-1){
                            for (AreaList areaList: AreaList) {
                                for (AreaList.ListDTO listDTO: areaList.getList()) {
                                    for (AreaList.ListDTO.ListDT1 listDT1:listDTO.getList()) {
                                        listDT1.setChecked(false);
                                    }
                                }
                            }
                            for (AreaList areaList: AreaList) {
                                if(areaList.isChecked()){
                                    for (AreaList.ListDTO listDTO: areaList.getList()) {
                                        if(listDTO.isChecked()&&listDTO.getList().size()!=0){
                                            listDTO.getList().get(position - dataList3.size()).setChecked(true);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        });


        binding.close.setOnClickListener(view1 -> dismiss());
        binding.login.setOnClickListener(view12 -> {
            region="";
            regionCode="";
            for (AreaList areaList: AreaList) {
                if(areaList.isChecked()){
                    region+=areaList.getName()+"-";
                    regionCode+=areaList.getCode()+",";
                    for (AreaList.ListDTO listDTO: areaList.getList()) {
                        if(listDTO.isChecked()&&listDTO.getList().size()!=0){
                            region+=listDTO.getName()+"-";
                            regionCode+=listDTO.getCode()+",";
                            for (AreaList.ListDTO.ListDT1 listDT1: listDTO.getList()) {
                                if(listDT1.isChecked()){
                                    region+=listDT1.getName();
                                    regionCode+=listDT1.getCode();
                                }
                            }
                        }else if(listDTO.isChecked()&&listDTO.getList().size()==0){
                            region+=listDTO.getName();
                            regionCode+=listDTO.getCode();
                        }
                    }
                }
            }
            checkTowerListener.checkTower(region,regionCode);
            dismiss();

        });


    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Window window = getDialog().getWindow();
        window.setGravity(Gravity.BOTTOM);
        // 一定要设置Background,如果不设置,window属性设置无效
        window.setWindowAnimations(R.style.dialogWindowAnim); // 添加动画
        window.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.lucency)));
        window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        getDialog().setCanceledOnTouchOutside(true);//点击屏幕不消失
        Dialog dialog = getDialog();
        if (dialog != null) {
            DisplayMetrics dm = new DisplayMetrics();
            requireActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
            dialog.getWindow().setLayout((int) (dm.widthPixels * 1.0), ViewGroup.LayoutParams.WRAP_CONTENT);
        }
    }


    class CheckTowerAdapter extends RecyclerView.Adapter<CheckTowerAdapter.ViewHolder> {

        public CheckTowerAdapter(List<Data> dataList) {
            this.dataList = dataList;
        }

        private List<Data> dataList ;
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(requireActivity()).inflate(R.layout.item_check_tower, parent, false);
            return new ViewHolder(v);
        }

        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            Data data = dataList.get(position);
            holder.holderBinding.tv.setText(data.getTitle());

        }

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

        class ViewHolder extends RecyclerView.ViewHolder {
            private ItemCheckTowerBinding holderBinding;

            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                holderBinding=ItemCheckTowerBinding.bind(itemView);
            }

        }
    }






    public static class Data {

        String title = "";
        String id = "";

        public boolean isiSChecked() {
            return iSChecked;
        }

        public void setiSChecked(boolean iSChecked) {
            this.iSChecked = iSChecked;
        }

        boolean iSChecked=false;
        public Data() {
        }

        public Data(String title, String id, boolean iSChecked) {
            this.title = title;
            this.id = id;
            this.iSChecked = iSChecked;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getId() {
            return id;
        }

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


    class CenterLayoutManager extends LinearLayoutManager {
        public CenterLayoutManager(Context context) {
            super(context);
        }

        public CenterLayoutManager(Context context, int orientation, boolean reverseLayout) {
            super(context, orientation, reverseLayout);
        }

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

        @Override
        public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
            RecyclerView.SmoothScroller smoothScroller = new CenterSmoothScroller(recyclerView.getContext());
            smoothScroller.setTargetPosition(position);
            startSmoothScroll(smoothScroller);
        }

        class CenterSmoothScroller extends LinearSmoothScroller {

            CenterSmoothScroller(Context context) {
                super(context);
            }

            @Override
            public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) {
                return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2);
            }
        }

    }
    @Override
    public void show(FragmentManager manager, String tag) {

        try {
            //在每个add事务前增加一个remove事务,防止连续的add
            manager.beginTransaction().remove(this).commit();
            super.show(manager, tag);
        } catch (Exception e) {
            e.printStackTrace();
            //同一实例使用不同的tag会异常,这里捕获一下
            Log.e("DialogFragment", "show", e.fillInStackTrace());
        }
    }
}

创建 直接show

checkTowerDialog=new CheckTowerDialog((region, regionCode) -> {
    this.region=region;
    this.regionCode=regionCode;
    binding.districtTv.setText(region);
});