擬京東分類ページRecyclerView+ExpandableListView

48459 ワード

分類ページレイアウト
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ライブラリを探してもいいです.