首先我這一塊我用的是MVP模式寫的這個分類,簡單說一下它的佈局,就兩塊,左面一塊就是RecyclerView,右面一塊是二級列表嵌套RecyclerView,請求的時候
我用的Retrofit+Rxjava+OkHttp的結合請求的數據,廢話不多說
直接甩代碼,代碼有點多,慢慢看。
先展示一下效果
首先看一下接口
public interface Inters {
/**
* 左面接口
*/
@GET("product/getCatagory")
Observable<Zean> Zuo();
/**
* 右面接口
*/
@GET("product/getProductCatagory")
Observable<Yean> You(@Query("cid") int cid);
}
Retrofit+Rxjava+OkHttp的結合
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Retrofit+Rxjava+OkHttp封裝,單例
*/
public class RetrofitUnitl {
private Retrofit mRetrofit;
private String baseUrl;
OkHttpClient client;
private static RetrofitUnitl mRetrofitManager;
private RetrofitUnitl(String baseUrl,OkHttpClient client){
this.baseUrl=baseUrl;
this.client=client;
initRetrofit();
}
public static synchronized RetrofitUnitl getInstance(String baseUrl,OkHttpClient client){
if (mRetrofitManager == null){
mRetrofitManager = new RetrofitUnitl(baseUrl,client);
}
return mRetrofitManager;
}
private void initRetrofit() {
mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();
}
public <T> T setCreate(Class<T> reqServer) {
return mRetrofit.create(reqServer);
}
}
分類的佈局
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context="com.xjq.xinjiaqi20171208.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/zrv"
android:layout_width="130dp"
android:layout_height="match_parent" />
<ExpandableListView
android:id="@+id/yev"
android:layout_width="match_parent"
android:layout_height="match_parent"></ExpandableListView>
</LinearLayout>
左側bean包 和右側的bean包我就不寫了。
下面開始MVP,首先是V層
public interface IFenView {
void onZuo(Zean zean);//左側請求成功
void onYou(Yean yean);//右側請求成功
}
M層
public class FenModel {
ScuMod scuMod;
public void setScuMod(ScuMod scuMod) {
this.scuMod = scuMod;
}
//左面請求
public void ZuoChen(){
//OkHttp裏面可以添加攔截器
OkHttpClient ok = new OkHttpClient.Builder()
.build();
//請求數據
RetrofitUnitl.getInstance("https://www.zhaoapi.cn/",ok)
.setCreate(Inters.class)
.Zuo()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<Zean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Zean bean) {
scuMod.Zc(bean);
}
});
}
//右面請求
public void YuoChen(int cont){
//OkHttp裏面可以添加攔截器
OkHttpClient ok = new OkHttpClient.Builder()
.build();
//請求數據
RetrofitUnitl.getInstance("https://www.zhaoapi.cn/",ok)
.setCreate(Inters.class)
.You(cont)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<Yean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Yean bean) {
scuMod.Yc(bean);
}
});
}
//定義一個接口
public interface ScuMod{
void Zc(Zean bean);
void Yc(Yean yean);
}
}
P層
//實現M層的接口
public class FenPresenter implements FenModel.ScuMod {
IFenView view;
FenModel model;
public FenPresenter(IFenView view) {
this.view = view;
model = new FenModel();
model.setScuMod(this);
}
@Override
public void Zc(Zean bean) {
view.onZuo(bean);
}
@Override
public void Yc(Yean yean) {
view.onYou(yean);
}
//左側調用
public void ShowPer(){
model.ZuoChen();
}
// 右側調用
public void FlShowYou(int cont){
model.YuoChen(cont);
}
}
我們在主方法裏面一定要實現V層
public class MainActivity extends AppCompatActivity implements IFenView{
public ExpandableListView yev;
public RecyclerView zrv;
public FenPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//拿到P層
presenter = new FenPresenter(this);
presenter.ShowPer();
//默認展示第一條
presenter.FlShowYou(1);
//找控件
zrv = findViewById(R.id.zrv);
yev = findViewById(R.id.yev);
}
@Override
public void onZuo(final Zean zean) {
//線性佈局
zrv.setLayoutManager(new LinearLayoutManager(MainActivity.this));
//拿到適配器
ZuoAdapter adapter= new ZuoAdapter(MainActivity.this,zean);
zrv.setAdapter(adapter);
//調用點擊事件
adapter.setOnItemClickListener(new ZuoAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
int id = zean.getData().get(position).getCid();
presenter.FlShowYou(id);
}
});
}
@Override
public void onYou(Yean yean) {
//拿到適配器
ErAdapter adapter = new ErAdapter(MainActivity.this,yean);
yev.setAdapter(adapter);
//父級列表默認全部展開
int groupCount = yev.getCount();
for (int i=0; i<groupCount; i++)
{
yev.expandGroup(i);
}
}
}
左面RecyclerView的適配器
/**
* 左面適配器
*/
public class ZuoAdapter extends RecyclerView.Adapter<ZuoAdapter.MyHolder> {
private Context context;
private Zean zean;
private OnItemClickListener mOnItemClickListener;
public ZuoAdapter(Context context, Zean list) {
this.context = context;
this.zean = list;
}
public interface OnItemClickListener{
void onItemClick(View view, int position);
}
public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){
this.mOnItemClickListener = mOnItemClickListener;
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyHolder holder = new MyHolder(LayoutInflater.from(context).inflate(R.layout.zuo_litem, parent, false));
return holder;
}
@Override
public void onBindViewHolder(final MyHolder holder, int position) {
holder.zuo_mz.setText(zean.getData().get(position).getName());
if (mOnItemClickListener != null){
holder.zuo_mz.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = holder.getLayoutPosition(); // 1
mOnItemClickListener.onItemClick(holder.itemView,position); // 2
}
});
}
}
@Override
public int getItemCount() {
return zean.getData().size();
}
class MyHolder extends RecyclerView.ViewHolder {
TextView zuo_mz;
public MyHolder(View itemView) {
super(itemView);
zuo_mz = itemView.findViewById(R.id.zuo_mz);
}
}
}
左面適配器的佈局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:id="@+id/zuo_mz"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="名字"
android:layout_gravity="center"
/>
</LinearLayout>
右面二級列表適配器
/**
* 二級列表適配器
*/
public class ErAdapter extends BaseExpandableListAdapter{
private Context context;
private Yean yean;
public ErAdapter(Context context, Yean yean) {
this.context = context;
this.yean = yean;
}
@Override
public int getGroupCount() {
return yean.getData().size();
}
@Override
public int getChildrenCount(int i) {
return 1;
}
@Override
public Object getGroup(int i) {
return yean.getData().get(i);
}
@Override
public Object getChild(int i, int i1) {
return yean.getData().get(i).getList().get(i);
}
@Override
public long getGroupId(int i) {
return i;
}
@Override
public long getChildId(int i, int i1) {
return i1;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
//父級
View v = View.inflate(context, R.layout.you_litem, null);
TextView expand_tv = v.findViewById(R.id.you_you);
expand_tv.setText(yean.getData().get(i).getName());
return v;
}
@Override
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
//嵌套RecyclerView的佈局
View v = View.inflate(context,R.layout.youhai_litem,null);
RecyclerView expand_recycler = v.findViewById(R.id.rvClass);
//RecyclerView網格格式
GridLayoutManager gridlayout = new GridLayoutManager(context,3);
expand_recycler.setLayoutManager(gridlayout);
//RecyclerView的適配器
setchild_Aapterer chapter = new setchild_Aapterer(context,yean,i,i1);
expand_recycler.setAdapter(chapter);
return v;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return false;
}
}
右面適配器二級列表嵌套的RecyclerView的適配器
/**
* 二級列表嵌套RecyclerView的適配器
*/
public class setchild_Aapterer extends RecyclerView.Adapter<setchild_Aapterer.ViewHodler>{
private Context context;
private Yean yean;
private int i,i1;
private OnItemClickListener mOnItemClickListener;
public setchild_Aapterer(Context context,Yean list,int i,int i1) {
this.context = context;
this.yean = list;
this.i = i;
this.i1 = i1;
}
//點擊事件
public interface OnItemClickListener{
void onItemClick(View view, int position);
}
public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){
this.mOnItemClickListener = mOnItemClickListener;
}
@Override
public setchild_Aapterer.ViewHodler onCreateViewHolder(ViewGroup parent, int viewType) {
View v = View.inflate(context, R.layout.child_item,null);
ViewHodler hodler = new ViewHodler(v);
hodler.img_child = v.findViewById(R.id.img_child);
hodler.tv_child = v.findViewById(R.id.tv_child);
return hodler;
}
@Override
public void onBindViewHolder(final setchild_Aapterer.ViewHodler holder, int position) {
String[] str =yean.getData().get(i).getList().get(position).getIcon().split("\\|");
String s = str[0];
Glide.with(context).load(s).into(holder.img_child);
holder.tv_child.setText(yean.getData().get(i).getList().get(position).getName());
if (mOnItemClickListener != null){
holder.img_child.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position =holder.getLayoutPosition();
mOnItemClickListener.onItemClick(holder.itemView,position); //
}
});
}
}
@Override
public int getItemCount() {
return yean.getData().get(i).getList().size();
}
public class ViewHodler extends RecyclerView.ViewHolder {
private ImageView img_child;
private TextView tv_child;
public ViewHodler(View itemView) {
super(itemView);
}
}
}
child_item
<?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="match_parent"
android:orientation="vertical"
>
<ImageView
android:id="@+id/img_child"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="center"
/>
<TextView
android:id="@+id/tv_child"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="名字"
android:layout_gravity="center"
/>
</LinearLayout>