本以为是个很简单的东西,写了之后才发现坑不断,特此纪念下。(里面用的都是假数据,如需请求网络数据不止如何修改的可以联系我qq:2872960735) 代码有点长,麻烦看官慢慢看,接下来让我们开心的撸码吧!
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
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适配器写了。
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);
}
}
}
主要的代码都在这了,如果还有不懂劳烦下载源码,注释写的很清楚,再不懂的也可以来骚扰我。
https://download.csdn.net/download/qq_38363506/11445305