RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框(文末附源码)

                                                    无图无真相,一言不合就上图:

RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框(文末附源码)_第1张图片  

  • RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框(文末附源码)_第2张图片

      功能简介:下拉显示时间列表,点击时间弹出自定义的IOS对话框,然后选择对应的车牌号,跳转到第二个界面。

        本以为是个很简单的东西,写了之后才发现坑不断,特此纪念下。(里面用的都是假数据,如需请求网络数据不止如何修改的可以联系我qq:2872960735)    代码有点长,麻烦看官慢慢看,接下来让我们开心的撸码吧!                  

RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框(文末附源码)_第3张图片

1、好了,因为这个东西还是比较大的,所以这边就不贴出全部布局,需要的可以去下载我的源码,首先我们先编写IOSDialog.class:

package com.lenz.arouter.recyclerviewtesttwo.dialog;
import android.app.Dialog;
import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.lenz.arouter.recyclerviewtesttwo.R;
import com.lenz.arouter.recyclerviewtesttwo.adapter.DialogAdapter;
import java.util.ArrayList;
import java.util.List;

/**
 * Author: LJW
 * Date: 2019-07-18 9:42
 * Description: 自定义仿iOS对话框
 */
public class IosDialog {
    private Context context;
    private Dialog dialog;
    private LinearLayout lLayout_bg;
    private TextView txt_title;
    private TextView btn_neg;
    private TextView btn_pos;
    private View img_line;
    private Display display;
    private boolean showTitle = false;
    private boolean showPosBtn = false;
    private boolean showNegBtn = false;
    private RecyclerView mRecyclerView;
    public IosDialog(Context context) {
        this.context = context;
        WindowManager windowManager = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        display = windowManager.getDefaultDisplay();
    }

    public IosDialog builder() {
        View view = LayoutInflater.from(context).inflate(
                R.layout.dialog_check_main, null);
        lLayout_bg = (LinearLayout) view.findViewById(R.id.lLayout_bg);//整个布局
        txt_title = (TextView) view.findViewById(R.id.txt_title);//标题
        txt_title.setVisibility(View.GONE);
        btn_neg = (TextView) view.findViewById(R.id.btn_neg);//取消按钮
        btn_neg.setVisibility(View.GONE);
        btn_pos = (TextView) view.findViewById(R.id.btn_pos);//确定按钮
        btn_pos.setVisibility(View.GONE);
        img_line = (View) view.findViewById(R.id.img_line);
        img_line.setVisibility(View.GONE);
        mRecyclerView = view.findViewById(R.id.rlv_car_number);
        dialog = new Dialog(context, R.style.AlertDialogStyle);
        dialog.setContentView(view);

        lLayout_bg.setLayoutParams(new FrameLayout.LayoutParams((int) (display
                .getWidth() * 0.80), ViewGroup.LayoutParams.WRAP_CONTENT));

        return this;
    }

    public IosDialog setRecyclerView(List tripsBeans) {
        List list = new ArrayList<>();
        DialogAdapter checkMainInsideAdapter = new DialogAdapter(tripsBeans, context);
        mRecyclerView.setLayoutManager(new GridLayoutManager(context, 2));
        mRecyclerView.setAdapter(checkMainInsideAdapter);
        return this;
    }

    public IosDialog setTitle(String title) {
        showTitle = true;
        if ("".equals(title)) {
            txt_title.setText("请选择车牌号");
        } else {
            txt_title.setText(title);
        }
        return this;
    }


    public IosDialog setCancelable(boolean cancel) {
        dialog.setCancelable(cancel);
        return this;
    }

    public IosDialog setPositiveButton(String text,
                                       final View.OnClickListener listener) {
        showPosBtn = true;
        if ("".equals(text)) {
            btn_pos.setText("确定");
        } else {
            btn_pos.setText(text);
        }
        btn_pos.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onClick(v);
                dialog.dismiss();
            }
        });
        return this;
    }

    public IosDialog setNegativeButton(String text,
                                       final View.OnClickListener listener) {
        showNegBtn = true;
        if ("".equals(text)) {
            btn_neg.setText("取消");
        } else {
            btn_neg.setText(text);
        }
        btn_neg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onClick(v);
                dialog.dismiss();
            }
        });
        return this;
    }

    //控制要显示啥
    private void setLayout() {
        if (showTitle) {
            txt_title.setVisibility(View.VISIBLE);
        }
        if (!showPosBtn && !showNegBtn) {
            btn_pos.setText("确定");
            btn_pos.setVisibility(View.VISIBLE);
            btn_pos.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
        }

        if (showPosBtn && showNegBtn) {
            btn_pos.setVisibility(View.VISIBLE);
            btn_neg.setVisibility(View.VISIBLE);
            img_line.setVisibility(View.VISIBLE);
        }

        if (showPosBtn && !showNegBtn) {
            btn_pos.setVisibility(View.VISIBLE);
        }

        if (!showPosBtn && showNegBtn) {
            btn_neg.setVisibility(View.VISIBLE);
        }
    }

    public void show() {
        setLayout();
        dialog.show();
    }
}

2、编写IosDialog的布局文件dialog_check_main.xml:




    

    

    

    

        

        

        
    


3、编写IosDialog适配器DialogAdapter.class:

package com.lenz.arouter.recyclerviewtesttwo.adapter;

import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.lenz.arouter.recyclerviewtesttwo.R;
import com.lenz.arouter.recyclerviewtesttwo.SpUtils;

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

/**
 * Author: LJW
 * Date: 2019-07-17 14:24
 * Description: 自定义dialog里面的列表适配器
 */
public class DialogAdapter extends RecyclerView.Adapter {
    private List cards;
    private Context mContext;
    private List isClicks;//控件是否被点击,默认为false,如果被点击,改变值,控件根据值改变自身颜色

    public DialogAdapter(List beans, Context context) {
        cards = beans;
        mContext = context;
        isClicks =new ArrayList<>();
        for (int i = 0; i 

4、编写styles.xml


    
    
     
    

到这里我们自定义的IOS对话框就好了,让我们继续往下写:

RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框(文末附源码)_第4张图片

5、编写MainActivity.class类:

package com.lenz.arouter.recyclerviewtesttwo;

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.lenz.arouter.recyclerviewtesttwo.adapter.OutAdapter;
import com.lenz.arouter.recyclerviewtesttwo.bean.InBean;
import com.lenz.arouter.recyclerviewtesttwo.bean.OutBean;
import com.lenz.arouter.recyclerviewtesttwo.dialog.IosDialog;

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

public class MainActivity extends AppCompatActivity {
    private RecyclerView mRecyclerView;
    private List mList;
    private OutAdapter mAdapter;
    private Context mContext;
    OutBean outBean;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
        mRecyclerView = findViewById(R.id.rlv_outside);
        //外部recyclerview假数据
        mList = new ArrayList<>();
        for (int i = 0; i < 12; i++) {
            outBean = new OutBean("厦门——广东线路:" + i, R.drawable.down, true);
            mList.add(outBean);
        }
        //dialog假数据
        final List dialogList = new ArrayList<>(); //用来测试车牌号只能单选的数据
        dialogList.add("闽D1537");
        dialogList.add("闽D3453");
        dialogList.add("闽D6785");
        dialogList.add("闽D2345");
        dialogList.add("闽D7898");
        mAdapter = new OutAdapter(mList, mContext);
        mAdapter.setOnItemClickListener(new OutAdapter.OnInItemClickListener() {
            @Override
            public void onExcuteCheck(final InBean inBean, final TextView tv) {
                new IosDialog(mContext).builder().setTitle("请选择车牌号").
                        setRecyclerView(dialogList).setPositiveButton("确定", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //跳转到第二界面的同时,把原来的时间背景和字体颜色变回来
                        tv.setBackground(getResources().getDrawable(R.drawable.shape_radius5_light_gray));
                        tv.setTextColor(Color.BLACK);
                        String time =inBean.getRouteTime();
                        String carNumber =SpUtils.getString(mContext,"carNumber","");
                        Intent  intent =new Intent(mContext,Main2Activity.class);
                        intent.putExtra("time",time);
                        intent.putExtra("carNumber",carNumber);
                        startActivity(intent);
                    }
                }).setNegativeButton("取消", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //点击取消时,把原先选择的时间变回原色
                        tv.setBackground(getResources().getDrawable(R.drawable.shape_radius5_light_gray));
                        tv.setTextColor(Color.BLACK);
                    }
                }).setCancelable(false).show();//setCancelable属性:点击对话框以为区域无效
            }
        });
        //使用这个属性让布局填满
        LinearLayoutManager layoutManager = new LinearLayoutManager(this) {
            @Override
            public RecyclerView.LayoutParams generateDefaultLayoutParams() {

                return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            }
        };
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setAdapter(mAdapter);
    }
}

6、activity的布局文件activity_main.xml:




  

到这里我们已经把Activity写好了,离胜利 又近了一步,接下来我们要憋足了气,把内部和外部的recyclerview适配器写了。

RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框(文末附源码)_第5张图片

RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框(文末附源码)_第6张图片

7、编写外层recyclerview的布局out_item.xml:




    

        

            

            
        

        
        
    

8、编写外层recyclerview的适配器OutAdapter.class:

package com.lenz.arouter.recyclerviewtesttwo.adapter;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.lenz.arouter.recyclerviewtesttwo.R;
import com.lenz.arouter.recyclerviewtesttwo.bean.InBean;
import com.lenz.arouter.recyclerviewtesttwo.bean.OutBean;

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

/**
 * Author: LJW
 * Date: 2019-07-17 10:12
 * Description: 外部recyclerview适配器
 */
public class OutAdapter extends RecyclerView.Adapter implements InAdapter.OnItemClickListener{
    private List mList;
    private Context mContext;
    private List positions = new ArrayList<>();

    public OutAdapter(List list, Context context) {
        mList = list;
        mContext = context;
    }

    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup group, int i) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.out_item, null);
        MyHolder myHolder = new MyHolder(view);
        return myHolder;
    }

    @Override
    public void onBindViewHolder(final MyHolder holder, final int i) {
        final OutBean outBean = mList.get(i);
        holder.mView.setTag(outBean);
        holder.title.setText(outBean.getTitle());
        holder.img.setBackgroundResource(outBean.getImg());
        List inBeans = new ArrayList<>();
        for (int j = 0; j < 10; j++) {
            InBean inBean = new InBean("时间" + j);
            inBeans.add(inBean);
        }
        InAdapter inAdapter = new InAdapter(inBeans, mContext);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(mContext, 3);
        holder.mRecyclerView.setLayoutManager(gridLayoutManager);
        inAdapter.setOnItemClickListener(OutAdapter.this);//记得在这里监听内部adapter
        holder.mRecyclerView.setAdapter(inAdapter);
        holder.mRecyclerView.setVisibility(View.GONE);//里面的recyclerview是先隐藏的
        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (holder.mRecyclerView.getVisibility() == View.VISIBLE) {
                    holder.img.setBackgroundResource(R.drawable.down);
                    holder.mRecyclerView.setVisibility(View.GONE);
                    holder.mDivider.setVisibility(View.GONE);
                }else {
                    //第一次点击的时候,因为最开始里面的recyclerview是隐藏,所以会走这里
                    holder.img.setBackgroundResource(R.drawable.up);
                    holder.mDivider.setVisibility(View.VISIBLE);
                    holder.mRecyclerView.setVisibility(View.VISIBLE);
                }

            }
        });


    }
    //实现内部Recyclerview适配器的接口
    @Override
    public void onClickItem(InBean inBean,TextView tv) {
        if (mOnItemClickListener!=null){
            mOnItemClickListener.onExcuteCheck(inBean,tv);//通过接口回调返回到Activity处理逻辑
        }
    }
    @Override
    public int getItemCount() {
        return mList.size();
    }

    public static class MyHolder extends RecyclerView.ViewHolder {
        private TextView title;
        private ImageView img;
        private RecyclerView mRecyclerView;
        private View mDivider;
        private View mView;

        public MyHolder(@NonNull View itemView) {
            super(itemView);
            mView = itemView;
            title = itemView.findViewById(R.id.tv_title);
            img = itemView.findViewById(R.id.iv_show);
            mDivider = itemView.findViewById(R.id.view_divider);
            mRecyclerView = itemView.findViewById(R.id.rlv_inside);
        }
    }
    private OnInItemClickListener mOnItemClickListener;
    public interface OnInItemClickListener {
        void onExcuteCheck(InBean inBean,TextView tv);
    }
    public void setOnItemClickListener(OnInItemClickListener onItemClickListener){
        this.mOnItemClickListener =onItemClickListener;
    }

}

9、编写内层recyclerview的布局文件in_item.xml:




    

10、编写内层recyclerview的适配器InAdapter.class:

package com.lenz.arouter.recyclerviewtesttwo.adapter;

import android.content.Context;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.lenz.arouter.recyclerviewtesttwo.R;
import com.lenz.arouter.recyclerviewtesttwo.bean.InBean;

import java.util.List;

/**
 * Author: LJW
 * Date: 2019-07-17 10:56
 * Description: 内部recyclerview适配器
 */
public class InAdapter extends RecyclerView.Adapter{
    private List mBeans;
    private Context mContext;

    public InAdapter(List beans, Context context) {
        mBeans = beans;
        mContext = context;
    }

    private OnItemClickListener mOnItemClickListener;

    public interface OnItemClickListener {
        void onClickItem(InBean inBean,TextView tv);
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.mOnItemClickListener = onItemClickListener;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup group, int i) {
        return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.in_item, null));
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
        holder.tv.setText(mBeans.get(position).getRouteTime());
        holder.tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnItemClickListener != null) {
                    //当内部recyclerview的item被点击,就接口回调出去到OutAdapter,再到activity处理业务逻辑
                    mOnItemClickListener.onClickItem(mBeans.get(position),holder.tv);
                    holder.tv.setBackgroundResource(R.drawable.shape_radius10_orange);
                    holder.tv.setTextColor(Color.WHITE);
                }
                //简单的recyclerview点击事件
//                int position =holder.getAdapterPosition();
//                InBean inBean =mBeans.get(position);
//                Toast.makeText(mContext, "这个是"+inBean.getTv(), Toast.LENGTH_SHORT).show();
                //当点击item时就让他背景和字体颜色改变

            }
        });
    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder {
        private TextView tv;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tv = itemView.findViewById(R.id.tv);
        }
    }
}

主要的代码都在这了,如果还有不懂劳烦下载源码,注释写的很清楚,再不懂的也可以来骚扰我。

RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框(文末附源码)_第7张图片

源码地址:

https://download.csdn.net/download/qq_38363506/11445305

 

你可能感兴趣的:(小白探索,Android)