RecyclerView实现ListView和GridView的效果

来源:互联网 发布:曹云金 知乎 编辑:程序博客网 时间:2024/05/17 04:47
关于RecyclerView的详细创建步骤请见:http://blog.csdn.net/lixiang_y/article/details/61937111
在这里我就不过多的赘述了

下面我们要使用RecyclerView实现ListView和GridView的效果,完整代码及Demo

先看一下效果图:


主要逻辑代码:

MainActivity.java

package com.zhiyuan3g.myrecycleview;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.Menu;import android.view.MenuItem;import android.widget.GridLayout;import android.widget.Toast;import com.zhiyuan3g.myrecycleview.adapter.RecyclerViewAdapter;import com.zhiyuan3g.myrecycleview.adapter.RecyclerViewGridAdapter;import com.zhiyuan3g.myrecycleview.bean.DataBean;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {    private RecyclerView recyclerview;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        //下面代码是菜单,方便效果展示,与recyclerView无关        //加载一个菜单的布局    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        //加载布局,使用菜单特有方法getMenInfater,或Inflate对象        //参数:1.菜单显示的布局  2.固定menu        getMenuInflater().inflate(R.menu.menu_main,menu);        return true;    }    //在每个if条件下填充相应的操作代码    @Override    public boolean onOptionsItemSelected(MenuItem item) {        int itemId = item.getItemId();        if (itemId == R.id.action_list_normal) {            //标准显示            loadListData(false,false,"List");             Toast.makeText(getApplicationContext(), "标准显示", Toast.LENGTH_SHORT).show();            return true;        } else if (itemId == R.id.action_list_vertical_reverse) {            //list:垂直反向显示            loadListData(true,false,"List");        } else if (itemId == R.id.action_list_horizontal) {            //水平显示            loadListData(false,true,"List");        } else if (itemId == R.id.action_list_horizontal_reverse) {            //水平反向显示            loadListData(true,true,"List");        } else if (itemId == R.id.gridview_normal) {            //gridview:标准显示            loadListData(false,false,"GridView");        } else if (itemId == R.id.gridview_reverse) {            //垂直反向显示            loadListData(true,false,"GridView");        } else if (itemId == R.id.gridview_horizontal_normal) {            //水平标准显示            loadListData(false,true,"GridView");        } else if (itemId == R.id.gridview_horizontal_reserse) {            //水平反向显示            loadListData(true,true,"GridView");        }        return super.onOptionsItemSelected(item);    }    //封装listview的代码   添加两个参数 1.控制条目执行顺序, 2.控制条目的布局方向    private void loadListData( boolean inversion,boolean oritation,String what) {        //集合对象        ArrayList<DataBean> datas = new ArrayList<>();        //给bean类放数据,最后把封装好的数据的Bean类放到集合里        for (int x=0; x<35 ;x++){            //创建bean对象            DataBean dataBean = new DataBean();            dataBean.icon=R.mipmap.ic_launcher;            dataBean.name="CCTV"+x;            //把bean类放入集合            datas.add(dataBean);        }        if (what.equals("List")) {            //创建适配器adapter            RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(this,datas);            //设置适配器            recyclerview.setAdapter(recyclerViewAdapter);            //布局管理器所需参数,上下文            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);            //设置布局管理器            recyclerview.setLayoutManager(linearLayoutManager);            //通过布局管理器,可以控制条目排列的顺序,  true为反向显示   false为正常显示            linearLayoutManager.setReverseLayout(inversion);            //通过布局管理器设置orientation,可以设置为水平和垂直            //添加三元运算符,当true时执行左边的,false时执行右边的,问题与结果之间是用?连接,            //结果与结果之间是用 :连接            linearLayoutManager.setOrientation(oritation ?LinearLayoutManager.HORIZONTAL:LinearLayoutManager.VERTICAL);        } else if (what.equals("GridView")) {            RecyclerViewGridAdapter recyclerViewGridAdapter = new RecyclerViewGridAdapter(this, datas);            recyclerview.setAdapter(recyclerViewGridAdapter);            //GridLayoutManager参数:1.上下文,  2.显示的列数(column)            GridLayoutManager gridLayoutManager = new GridLayoutManager(this,3);            recyclerview.setLayoutManager(gridLayoutManager);            gridLayoutManager.setReverseLayout(inversion);            gridLayoutManager.setOrientation(oritation? GridLayout.HORIZONTAL:GridLayout.VERTICAL);        }    }    private void initView() {        recyclerview = (RecyclerView) findViewById(R.id.recyclerview);    }}

RecyclerViewAdapter.java

package com.zhiyuan3g.myrecycleview.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import com.zhiyuan3g.myrecycleview.R;import com.zhiyuan3g.myrecycleview.bean.DataBean;import java.util.List;//RecyclerView的适配器,注意要指定泛型,// 一般我们就是类名的ViewHolder继承ViewHolder(内部已经实现了复用优化机制)public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ListViewHolder> {    private Context context;    private List<DataBean> databean;    //构造方法,一般需要接受两个参数,上下文,集合对象(包含我们的数据)    public RecyclerViewAdapter(Context context, List<DataBean> databean) {        this.context = context;        this.databean = databean;    }    //创建ViewHolder(相当于item),并把ViewHolder返回出去。    @Override    public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        //转换一个view布局对象,决定item的样子,参数:1.上下文  2.XML布局资源  3.为null        View view = View.inflate(context, R.layout.item_list, null);        //创建一个ViewHolder对象        ListViewHolder listViewHolder = new ListViewHolder(view);        //把创建出来的ViewHolder对象传出去        return listViewHolder;    }    //当ViewHolder和数据绑定时,回调    @Override    public void onBindViewHolder(ListViewHolder holder, int position) {        //从集合里拿对应item的数据对象        DataBean dataBean = databean.get(position);        //给holder里面的控件对象设置数据        holder.setData(dataBean);    }    //决定RecyclerView有多少条    @Override    public int getItemCount() {        //数据不为null,有几条数据就显示几条数据   ???        if (databean != null&& databean.size()>0) {            return databean.size();        }        return 0;    }    //自动帮我们写的ViewHolder,参数:view对象    public class ListViewHolder extends RecyclerView.ViewHolder {        private final ImageView mIvicon;        private final TextView mTvname;        public ListViewHolder(View itemView) {            super(itemView);            mIvicon = (ImageView)itemView.findViewById(R.id.item_list_iv_icon);            mTvname = (TextView) itemView.findViewById(R.id.item_list_tv_name);        }        public void setData(DataBean dataBean) {            //给imageview设置图片数据            mIvicon.setImageResource(dataBean.icon);            //给TextView设置文本数据            mTvname.setText(dataBean.name);        }    }}

RecyclerViewGridAdapter.java

package com.zhiyuan3g.myrecycleview.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import com.zhiyuan3g.myrecycleview.R;import com.zhiyuan3g.myrecycleview.bean.DataBean;import java.util.ArrayList;//提示:RecyclerViewGridAdapter和RecyclerViewListAdapter代码一样,就是改了一下item加载显示的布局//RecyclerView的适配器,要指定泛型,一般我们就是列类名的ViewHolder继承ViewHolder(内部已经实现了复用机制)public class RecyclerViewGridAdapter extends RecyclerView.Adapter<RecyclerViewGridAdapter.ViewHolder> {    private Context context;    private ArrayList<DataBean> datas;    public RecyclerViewGridAdapter(Context context, ArrayList<DataBean> datas) {        this.context = context;        this.datas = datas;    }    @Override    public RecyclerViewGridAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        //转换一个布局为view对象        View view = View.inflate(context, R.layout.grid_item, null);        //创建ViewHolder对象,传入view对象        ViewHolder viewHolder = new ViewHolder(view);        //返回viewholder对象        return viewHolder;    }    @Override    public void onBindViewHolder(RecyclerViewGridAdapter.ViewHolder holder, int position) {        DataBean dataBean = datas.get(position);        holder.setData(dataBean);    }    @Override    public int getItemCount() {        return datas.size();    }    public class ViewHolder extends RecyclerView.ViewHolder {        private final ImageView mIcon;        private final TextView mDescribe;        public ViewHolder(View itemView) {            super(itemView);            mIcon = (ImageView) itemView.findViewById(R.id.icon_img);            mDescribe = (TextView) itemView.findViewById(R.id.describe_tv);        }        public void setData(DataBean dataBean) {            mIcon.setImageResource(dataBean.icon);            mDescribe.setText(dataBean.name);        }    }}

DataBean.java

package com.zhiyuan3g.myrecycleview.bean;/** * * Author: * Function: Bean类的下的变量类型是根据需要哪些数据来决定 */public class DataBean {    public int icon;    public String name;}


完整Demo代码下载:http://pan.baidu.com/s/1gfMcQKN









0 0
原创粉丝点击