快速实现实现RecycleView的二级菜单,简单易懂

我们一起来对我这个RecyclerView的二级菜单的实现做个分析,相信各位看完也会有觉的很轻松就实现了,并没有多么的困难!

首先说一下思路,RecyclerView的item你可以当成是一级菜单,这样实现我们很轻松就实现了,并不会有什么困难,至于二级菜单我的想法是把它看成是item底下的一个延伸,这个延伸是一个自定义Linearlayout布局,只不过是收缩了两遍的边距,我们可以用boolean类型来控制它的显示时机,这样就能做到二级菜单样子了,至于Linearlayout的布局格式大家可以自己按照自己的需求进行修改了。

第一步肯定是集成RecyclerView了,添加依赖

compile 'com.android.support:recyclerview-v7:25.3.0'
第二步实现Recyclerview,你得首先保证第一层数据能正常显示出来吧!哈哈,然后我们就可以按照上述的思路往里面添加二级数据了,先开一下MainActivity中的代码
package com.aykj.recylerview_test;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;

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

public class MainActivity extends AppCompatActivity {
    private RecyclerView twoMenuRecyclerView;//最外层的recylerview
    private List list=null;
    private TwoMenuAdapter  adapter;//外层recylerview需要的适配器用来显示数据
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
    }

    private void initView() {
        twoMenuRecyclerView= (RecyclerView) findViewById(R.id.twoMenuRecyclerView);
        twoMenuRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));//必须写,不写recyclerview就不会显示出来
        list=new ArrayList<>();
        adapter=new TwoMenuAdapter(list,MainActivity.this);
        twoMenuRecyclerView.setAdapter(adapter);
    }

    private void initData() {
        MenuBean  menuBean=null;
        for(int i=0;i<5;i++){
            menuBean =new MenuBean();
            menuBean.setText("");
            list.add(menuBean);
        }
        if (list != null && list.size() > 0) {
            list.get(0).setOpen(true);
        }
        adapter.notifyDataSetChanged();
        adapter.setCallBack(new TwoMenuAdapter.TwoCallBack() {
            @Override
            public void callBackMenu(MenuBean menuBean,int position) {
                //这里相当于Item点击方法了你可以在这里做出对应的操作
                //这里使用的是接口回调的方法,你也可以在适配器里面直接对item添加点击事件
                Toast.makeText(MainActivity.this,"你点击了第"+position+"item",Toast.LENGTH_SHORT).show();
            }
        });
    }
}
然后是适配器中的代码,显示数据嘛!

package com.aykj.recylerview_test;

import android.content.Context;
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 java.util.List;

/**一级Recylerview的适配器
 * Created by Administrator on 2017/9/21.
 */

public class TwoMenuAdapter extends RecyclerView.Adapter {
    private LayoutInflater inflater;
    private List list;
    private Context context;
    private TwoCallBack  callBack;
    public TwoMenuAdapter(List list,Context context){
        this.list=list;
        this.context=context;
        inflater=LayoutInflater.from(context);
    }
    public  interface  TwoCallBack{
        void callBackMenu(MenuBean  menuBean,int position);
    }
    @Override
    public MyHodler onCreateViewHolder(ViewGroup parent, int viewType) {
        MyHodler holder = new MyHodler(inflater.inflate(R.layout.twomenu_item_layout, parent, false));
        return holder;
    }

    @Override
    public void onBindViewHolder(final MyHodler holder, final int position) {
         final MenuBean  menuBean=list.get(position);
         if(menuBean.isOpen()){
             holder.imageView.setRotation(270);//这个是设置图标的方向转换
             holder.twoLinearLayoyt.setVisibility(View.VISIBLE);
         }else{
             holder.imageView.setRotation(90);
             holder.twoLinearLayoyt.setVisibility(View.GONE);;
         }
        holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击打开或者关闭用boolean来控制
                    if(menuBean.isOpen()){
                        holder.imageView.setRotation(90);
                        holder.twoLinearLayoyt.setVisibility(View.GONE);
                        menuBean.setOpen(false);
                    }else{
                        holder.imageView.setRotation(270);
                        holder.twoLinearLayoyt.setVisibility(View.VISIBLE);
                        menuBean.setOpen(true);
                    }
            }
        });
         holder.textitem.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 if (callBack != null) {
                     callBack.callBackMenu(menuBean,position);
                 }
             }
         });
    }

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

    public void setCallBack(TwoCallBack  callBack){
                this.callBack=callBack;
    }
    class MyHodler extends RecyclerView.ViewHolder{
        TextView   textitem;
        ImageView imageView;
        TwoLinearLayoyt twoLinearLayoyt;
        public MyHodler(View itemView) {
            super(itemView);
            textitem= (TextView) itemView.findViewById(R.id.text_one);
            imageView=(ImageView) itemView.findViewById(R.id.image_icon);
            twoLinearLayoyt=(TwoLinearLayoyt) itemView.findViewById(R.id.twoLinearLayoyt);
        }
    }
}
然后是activity的XML布局

然后是item中的自定义LinearLayout
package com.aykj.recylerview_test;

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

/**这个自定义linearlayout里面你可以去实现任何布局 包括Recylerview的多层的嵌套Recylerview,你按照这个思路,不管他几层都是可以实现
 * Created by Administrator on 2017/9/21.
 */

public class TwoLinearLayoyt extends LinearLayout {
    public  Context context;
    public  ImageView andyLau_image;
    public TwoLinearLayoyt(Context context) {
        super(context);
        //如果TwoLinearLayoyt是通过代码实现的,那么它就会这个一参的构造方法,当然初始化就得在这里了;
    }

    public TwoLinearLayoyt(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.context=context;
        initView();

        //如果TwoLinearLayoyt是通过布局实现的,那么它就会调用二参的构造方法,当然初始化就得在这里了;我是布局调用的
    }



    private void initView() {
        //在这里可以扩展自己想要的东西
        View  view= LayoutInflater.from(context).inflate(R.layout.linearlayout_item,null,false);
        andyLau_image= (ImageView) view.findViewById(R.id.andylau_image);
        LayoutParams   params=new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        this.addView(view,params);
        initData();
    }
    private void initData() {
        andyLau_image.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context,"刘德华,我的偶像!",Toast.LENGTH_SHORT).show();
            }
        });
    }
}
自定义LinearLayout里面就一个图片,布局就不贴了,我们发挥想象自己创造;
然后呢?就没有然后了,你会发现实现了,哈哈!

快速实现实现RecycleView的二级菜单,简单易懂_第1张图片

Demo送上

你可能感兴趣的:(android)