RecyclerView初级
来源:互联网 发布:免费网络空间 编辑:程序博客网 时间:2024/05/17 04:00
RecyclerView目前基本上已经代替了ListView和GridView,其灵活性以及扩展性受到了众多程序员的青睐。(还不是因为客户各种操蛋的要求),没办法,硬着头皮也得满足客户。首先来谈谈RecyclerView的实现原理:
1.和ListView一样,同样是通过少数的View来展示大量数据的组件。
2.Google强制性要求使用ViewHolder来提高性能。
3.实现的步骤基本上和ListView没什么区别。
接下来就跟着我一步步来实现RecyclerView的基本使用:
一、新建一个工程,在工程中添加RecyclerView的依赖包
点击“确定”即可。
二、在activity_main.xml中添加RecyclerView
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:background="#d6d2d2" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.lzw.rv.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical"/></RelativeLayout>
三、其次编写list_item.xml数据项
这里只做简单的效果演示
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="1dp"> <TextView android:text="TextView" android:textSize="50sp" android:background="#ffffff" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tv_item" android:gravity="center"/></LinearLayout>
四、然后编写Adapter
package com.lzw.rv;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import java.util.List;/** * Created by 李志伟 on 2016/9/28. * */public class MyRecyclerViewAdapter extends RecyclerView.Adapter { private List<String> mData = null; public MyRecyclerViewAdapter(List<String> mData) { this.mData = mData; } /** * 创建一个ViewHolder * @param parent 父容器 * @param viewType 子视图类型 * @return viewHolder */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); MyHolder myHolder = new MyHolder(mView); return myHolder; } /** * 数据与item进行绑定、绑定的同时,给view设置点击事件 * @param holder 绑定的holder * @param position item位置 */ @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { ((MyHolder)holder).tv.setText(mData.get(position)); //绑定每个View的同时,给其添加点击事件 if (mOnItemClickListener != null) { ((MyHolder)holder).tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mOnItemClickListener.onShortItemClick(holder.itemView, holder.getAdapterPosition()); } }); ((MyHolder)holder).tv.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { mOnItemClickListener.onLongItemClick(holder.itemView, holder.getAdapterPosition()); //返回true 这样触发了onLongClick后便不会再触发onClick了 return true; } }); } } /** * 获取item数目 * @return item数目 */ @Override public int getItemCount() { return mData.size(); } /** * 将自定义MyViewHolder定义为内部类 */ private static class MyHolder extends RecyclerView.ViewHolder{ TextView tv; public MyHolder(View itemView) { super(itemView); tv = (TextView) itemView.findViewById(R.id.tv_item); } } /** * 定义item长按、短按的回调 */ public interface OnRecyclerViewItemClickListener{ void onShortItemClick(View view, int position); void onLongItemClick(View view, int position); } private OnRecyclerViewItemClickListener mOnItemClickListener = null; /** * 设置点击事件 * @param listener 监听 */ public void setmOnItemClickListener(OnRecyclerViewItemClickListener listener){ this.mOnItemClickListener = listener; } /** * 添加数据 * @param position 在指定位置添加数据 */ public void addData(int position){ mData.add(position, "Insert one"); notifyItemInserted(position); //在指定位置插入数据 } /** * 删除数据 * @param position 在指定位置删除数据 */ public void deleteData(int position){ mData.remove(position); //在指定位置删除数据,删除某一项之后显示的item不会调用onBindViewHolder来进行页面的刷新 notifyItemRemoved(position); //该方法很重要,通知适配器数据发生改变。并且调用onBindViewHolder来进行刷新。否则下标会出现异常 notifyItemChanged(position, mData.size()); }}
五、在MainActivity中添加Adapter以及RecyclerView
package com.lzw.rv;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.support.v7.widget.StaggeredGridLayoutManager;import android.view.View;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { //卡片布局的列数 private static final int SPANCOUNT = 3; RecyclerView mRecyclerView; MyRecyclerViewAdapter adapter; List<String> mData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initOnClick(); } /** * item点击事件 */ private void initOnClick() { adapter.setmOnItemClickListener(new MyRecyclerViewAdapter.OnRecyclerViewItemClickListener() { @Override public void onShortItemClick(View view, int position) { Toast.makeText(MainActivity.this, position + "pressed", Toast.LENGTH_SHORT).show(); } @Override public void onLongItemClick(View view, int position) { Toast.makeText(MainActivity.this, position + "Long_pressed", Toast.LENGTH_SHORT).show(); adapter.deleteData(position); } }); } /** * 初始化布局界面 */ private void initView() { mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); //设置为线性布局 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); //设置横向的布局。 默认是垂直 //linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); mRecyclerView.setLayoutManager(linearLayoutManager); /*//设置为卡片布局 GridLayoutManager gridLayoutManager = new GridLayoutManager(this, SPANCOUNT); mRecyclerView.setLayoutManager(gridLayoutManager);*/ /*//设置为瀑布流布局 StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(SPANCOUNT, StaggeredGridLayoutManager.VERTICAL); mRecyclerView.setLayoutManager(staggeredGridLayoutManager);*/ initData(); adapter = new MyRecyclerViewAdapter(mData); mRecyclerView.setAdapter(adapter); } /** * 填充数据 */ private void initData() { mData = new ArrayList<>(); for (int i = 0; i < 20; i++) { mData.add("item" + i); } }}
最后看一下效果图:
对于代码的详细内容我就不做过多的解释,在源码内已经做了很清楚的介绍了。这里我使用的是RecyclerView默认的动画效果,下一遍文章我将给大家带来
RecyclerView的自定义动画效果。显示的效果还不错,并且没有任何的卡顿现象。
文章若有不足之处,还望大家帮忙指正纠错,在此先行谢过!
1 0
- RecyclerView初级
- RecyclerView初级
- RecyclerView初级使用
- RecyclerView初级操作
- RecyclerView的初级入门
- android 5.0新特性 RecyclerView使用初级
- Android布局之RecyclerView初级入门介绍及相关教程
- 初级
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- RecyclerView
- spring aop execution表达式
- Unity3D自学笔记——Transform
- 带多行下划线的EditText
- Linux 下使用openSSL 生成RSA密钥对
- 指针
- RecyclerView初级
- Server Tomcat v7.0 Server at localhost failed to start.
- 理解js中的new操作符。
- Android 自定义dialog位置和大小
- java递归,非递归遍历二叉树
- spirng mvc配置文件
- Apache配置
- C#开发学习笔记:利用XML配置文件连接数据库
- OC传值之-通知,NSNotificationCenter