先看布局文件
<?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);
});