擬京東分類ページRecyclerView+ExpandableListView
48459 ワード
分類ページレイアウト
分類の左側のエントリレイアウト
分類右側の2次リストレイアウトの親
分類右側の2次リストレイアウトサブエントリ
サブエントリにネストされたRecyclerViewエントリ
viewインタフェース
model
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/classify_left"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="match_parent">
android:id="@+id/classify_right"
android:layout_width="0dp"
android:layout_weight="8"
android:layout_height="match_parent">
分類の左側のエントリレイアウト
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:id="@+id/left_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:padding="10dp"
android:text="xxxx"
android:textSize="20dp" />
分類右側の2次リストレイアウトの親
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff">
android:id="@+id/classify_group_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"
android:padding="20dp"/>
分類右側の2次リストレイアウトサブエントリ
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
android:id="@+id/classify_child_rlv"
android:layout_width="match_parent"
android:background="#ffffff"
android:layout_marginBottom="10dp"
android:padding="10dp"
android:layout_height="wrap_content">
サブエントリにネストされたRecyclerViewエントリ
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
android:id="@+id/classify_child_rlv"
android:layout_width="match_parent"
android:background="#ffffff"
android:layout_marginBottom="10dp"
android:padding="10dp"
android:layout_height="wrap_content">
viewインタフェース
public interface IClassifyView extends IBaseView {
void successLift(Fenglei fenglei);
void successRigth(List groupList, List> childList);
}
model
public class ClassifyModel extends BaseModel {
private RetrofitUtils retrofitUtils;
public void getFenglei(final IFenglei iFenglei) {
retrofitUtils = RetrofitUtils.getInstance();
retrofitUtils.getApi().fengLei()
.subscribeOn(io.reactivex.schedulers.Schedulers.io())
.observeOn(io.reactivex.android.schedulers.AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.e("onSubscribe", d + "");
}
@Override
public void onNext(Fenglei fenglei) {
iFenglei.success(fenglei);
}
@Override
public void onError(Throwable e) {
Log.e("onErrer", e + "");
}
@Override
public void onComplete() {
}
});
}
public void getZifenglei(String cid, final IFenglei iFenglei){
retrofitUtils=RetrofitUtils.getInstance();
HashMap,String> params=new HashMap<>();
params.put("cid",cid);
retrofitUtils.getApi().zifenglei(params)
.subscribeOn(io.reactivex.schedulers.Schedulers.io())
.observeOn(io.reactivex.android.schedulers.AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.e("zonSubscribe", d + "");
}
@Override
public void onNext(Zifenglei zifenglei) {
iFenglei.successRigth(zifenglei);
}
@Override
public void onError(Throwable e) {
Log.e("zonErrer", e + "");
}
@Override
public void onComplete() {
}
});
}
public interface IFenglei {
void success(Fenglei fenglei);
void successRigth(Zifenglei zifenglei);
}
}
presenter
public class ClassifyPresenter extends BasePresenter
,IClassifyView>{ public void leftData(){ model.getFenglei(new ClassifyModel.IFenglei() { @Override public void success(Fenglei fenglei) { view.successLift(fenglei); } @Override public void successRigth(Zifenglei zifenglei) { } }); } public void rightData(String cid){ model.getZifenglei(cid,new ClassifyModel.IFenglei(){ @Override public void success(Fenglei fenglei) { } @Override public void successRigth(Zifenglei zifenglei) { List data = zifenglei.getData(); ArrayList > childList = new ArrayList<>(); for(int i=0;i
;i++){ List list = data.get(i).getList(); childList.add(list); } view.successRigth(data,childList); } }); } } activity
public class Classify extends BaseFragment
implements IClassifyView { private ExpandableListView right; private RecyclerView left; @Override protected void initData() { presenter.leftData(); presenter.rightData("1"); } @Override protected BaseModel initModel() { return new ClassifyModel(); } @Override protected ClassifyPresenter initPresenter() { return new ClassifyPresenter(); } @Override protected void initView(View view) { right = view.findViewById(R.id.classify_right); left=view.findViewById(R.id.classify_left); } @Override protected int bindLayoutId() { return R.layout.fragment_classify; } @Override public void showLoading() { } @Override public void hideLoading() { } @Override public void serverFail(String msg) { } @Override public void successLift(Fenglei fenglei) { LiftAdapter liftAdapter = new LiftAdapter(fenglei.getData(), getContext()); left.setLayoutManager(new GridLayoutManager(getContext(),1, LinearLayoutManager.VERTICAL,false)); left.setAdapter(liftAdapter); liftAdapter.setOnItemClickListener(new LiftAdapter.OnItemClickListener() { @Override public void onClick(View view, String cid) { Toast.makeText(getContext(), ""+cid, Toast.LENGTH_SHORT).show(); presenter.rightData(cid); } }); } @Override public void successRigth(List groupList, List > childList) { RightAdapter rightAdapter = new RightAdapter(groupList,childList,getActivity()); right.setAdapter(rightAdapter); right.setGroupIndicator(null); // for(int i=0;i
;i++){ right.expandGroup(i); } } } adatpter
左侧条目
public class LiftAdapter extends RecyclerView.Adapter
{ private List list; private Context context; OnItemClickListener onItemClickListener; public LiftAdapter(List list, Context context) { this.list = list; this.context = context; } @NonNull @Override public MyHolderView onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view= LayoutInflater.from(context).inflate(R.layout.item_left,parent,false); return new MyHolderView(view); } @Override public void onBindViewHolder(@NonNull final MyHolderView holder, int position) { if(list!=null){ holder.name.setText(list.get(position).getName()); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int pos = holder.getAdapterPosition(); int cid = list.get(pos).getCid(); onItemClickListener.onClick(v,cid+""); } }); } } public interface OnItemClickListener{ void onClick(View view,String cid); } public void setOnItemClickListener(OnItemClickListener onItemClickListener){ this.onItemClickListener=onItemClickListener; } @Override public int getItemCount() { return list.size(); } public class MyHolderView extends RecyclerView.ViewHolder{ private final TextView name; public MyHolderView(View itemView) { super(itemView); name = itemView.findViewById(R.id.left_name); } } } 右侧条目
public class RightAdapter extends BaseExpandableListAdapter{ private List
shangList; private List > childList; private Context context; public RightAdapter(List
shangList, List > childList, Context context) { this.shangList = shangList; this.childList = childList; this.context = context; } @Override public int getGroupCount() { return shangList.size(); } @Override public int getChildrenCount(int groupPosition) { return 1; } @Override public Object getGroup(int groupPosition) { return shangList.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { return childList.get(groupPosition).get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupViewHolder holder; if(convertView==null){ holder=new GroupViewHolder(); convertView= LayoutInflater.from(context).inflate(R.layout.item_classify_grooup,null); holder.classify_group_tv=convertView.findViewById(R.id.classify_group_tv); convertView.setTag(holder); }else{ holder=(GroupViewHolder)convertView.getTag(); } holder.classify_group_tv.setText(shangList.get(groupPosition).getName()); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildViewHolder holder; if(convertView==null){ holder= new ChildViewHolder(); convertView=LayoutInflater.from(context).inflate(R.layout.item_classify_child,null); holder.classify_child_rlv=convertView.findViewById(R.id.classify_child_rlv); convertView.setTag(holder); }else{ holder=(ChildViewHolder)convertView.getTag(); } ClassifyChildViewAdapter classifyChildViewAdapter = new ClassifyChildViewAdapter(childList.get(groupPosition), context); holder.classify_child_rlv.setLayoutManager(new GridLayoutManager(context,3, LinearLayoutManager.VERTICAL,false)); holder.classify_child_rlv.setAdapter(classifyChildViewAdapter); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return false; } class GroupViewHolder{ TextView classify_group_tv; } class ChildViewHolder{ RecyclerView classify_child_rlv; } }
右侧子条目
public class ClassifyChildViewAdapter extends RecyclerView.Adapter
{ private List list; private Context context; public ClassifyChildViewAdapter(List list, Context context) { this.list = list; this.context = context; } @NonNull @Override public MyViweHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view= LayoutInflater.from(context).inflate(R.layout.item_classify_child_rlv,parent,false); return new MyViweHolder(view); } @Override public void onBindViewHolder(@NonNull MyViweHolder holder, int position) { holder.sdv.setImageURI(list.get(position).getIcon()); holder.tv.setText(list.get(position).getName()); } @Override public int getItemCount() { return list.size(); } public class MyViweHolder extends RecyclerView.ViewHolder { private final SimpleDraweeView sdv; private final TextView tv; public MyViweHolder(View itemView) { super(itemView); sdv = itemView.findViewById(R.id.sdv); tv = itemView.findViewById(R.id.tv); } } }
Baseクラスは別の文章の中で、必要なのはmvpライブラリを探してもいいです.