标签:
一直使用ListView,也没觉得有什么问题,可能还是自己太菜了。
官方突然出了个RecyclerView,据说是专门替代ListView的,也没觉得好用多少,还是因为自己太菜了。
不管怎么说,要紧跟时代的潮流,尽管不喜欢,也要去学习,说不定学着学着就爱上了呢~
废话不多说,坚持自己一贯的风格,尽量把代码写的最简单。一上效果图,二上代码,注释都在代码中。
效果图是个美女,莫怪,代码写着写着总会意淫一下,,,
compile ‘com.android.support:design:23.3.0‘
这里布局就只有一个RecyclerView。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/background"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>
这里也是只有一个TextView。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="1dp" android:background="#80000000" android:orientation="vertical" android:padding="10dp"> <TextView android:id="@+id/tv_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#FFFFFF" android:textSize="22sp" tools:text="这是一个测试"/> </LinearLayout>
平时养成了坏习惯,看到不爽的东西,麻烦的东西,总是喜欢把它封装起来,为我所用,所以封装之后提供的接口也是按照我的习惯乱来的。
其中 DATA 为数据实体,比如:String、User什么的。
VH 为ViewHolder。
谷歌官方并没有给RecyclerView添加setOnItemClickListener接口,这个常用吧,但是没有,所以这里封装了一下。
package com.audienl.recyclerviewdemo.adapters; import android.content.Context; import android.support.annotation.LayoutRes; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; /** * @author AudienL(591928179@qq.com) on 2016/4/22 */ public abstract class SuperRVAdapter<DATA, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> { protected Context context; protected List<DATA> items = new ArrayList<>(); public SuperRVAdapter(Context context) { this.context = context; } public SuperRVAdapter(Context context, List<DATA> items) { this.context = context; this.items = items; } /** * 设置数据源 */ public void setItems(List<DATA> items) { if (items != null) { this.items = items; } } /** * 添加一个数据集 */ public void addItems(List<DATA> items) { if (items != null) { this.items.addAll(items); } } /** * 添加一条数据 */ public void addItem(DATA item) { if (item != null) { this.items.add(item); } } /** * 获取一条数据 */ public DATA getItem(int position) { return items.get(position); } /** * 清空数据 */ public void clear() { items.clear(); } @Override public int getItemCount() { return items.size(); } @Override public VH onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(getLayoutResId(), parent, false); return onCreateViewHolder(view); } @Override public void onBindViewHolder(final VH holder, final int position) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClick(v, holder.getAdapterPosition()); if (mOnItemClickListener != null) { mOnItemClickListener.onItemClick(v, holder.getAdapterPosition()); } } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { onItemLongClick(v, holder.getAdapterPosition()); if (mOnItemLongClickListener != null) { mOnItemLongClickListener.onItemLongClick(v, holder.getAdapterPosition()); } return true; } }); onBindViewHolder(holder, items.get(position), position); } public abstract VH onCreateViewHolder(View view); /** * @param item 为当前 item 对应的数据 */ public abstract void onBindViewHolder(VH holder, DATA item, int position); @LayoutRes public abstract int getLayoutResId(); /** * 会先调用此方法,再调用 OnItemClickListener 中的 onItemClick。 */ protected void onItemClick(View view, int position) { } /** * 会先调用此方法,再调用 setOnItemLongClickListener 中的 onItemLongClick。 */ protected void onItemLongClick(View view, int position) { } // ========================================================= // Listeners // ========================================================= protected OnItemClickListener mOnItemClickListener; protected OnItemLongClickListener mOnItemLongClickListener; public void setOnItemClickListener(OnItemClickListener listener) { mOnItemClickListener = listener; } public void setOnItemLongClickListener(OnItemLongClickListener listener) { mOnItemLongClickListener = listener; } public interface OnItemClickListener { void onItemClick(View view, int position); } public interface OnItemLongClickListener { void onItemLongClick(View view, int position); } }
这里直接继承上面封装好的Adapter就行。
onCreateViewHolder(View view)返回的是ViewHolder对象。ViewHolder类是必须有的,而且要继承RecyclerView.ViewHolder
onBindViewHolder(ViewHolder holder, String item, int position)就是把数据和view绑定起来,其中item就是item具体的数据了。
getLayoutResId()返回的就是这个item的布局了。
package com.audienl.recyclerviewdemo.adapters; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.TextView; import com.audienl.recyclerviewdemo.R; import butterknife.Bind; import butterknife.ButterKnife; /** * @author AudienL(591928179@qq.com) on 2016/4/22 */ public class RVAdapter extends SuperRVAdapter<String, RVAdapter.ViewHolder> { public RVAdapter(Context context) { super(context); } @Override public ViewHolder onCreateViewHolder(View view) { return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, String item, int position) { holder.mTvText.setText(item); } @Override public int getLayoutResId() { return R.layout.item_recycler_view; } class ViewHolder extends RecyclerView.ViewHolder { @Bind(R.id.tv_text) TextView mTvText; public ViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } } }
package com.audienl.recyclerviewdemo; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import com.audienl.recyclerviewdemo.adapters.RVAdapter; import com.audienl.recyclerviewdemo.adapters.SuperRVAdapter; import butterknife.Bind; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Bind(R.id.recycler_view) RecyclerView mRecyclerView; private RVAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); // 数据源 mAdapter = new RVAdapter(this); for (int i = 0; i < 20; i++) { mAdapter.addItem("AudienL -> " + i); } // 设置布局 mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); // 设置Adapter mRecyclerView.setAdapter(mAdapter); // 设置单击事件 mAdapter.setOnItemClickListener(new SuperRVAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Log.i(TAG, "onItemClick: position=" + position); } }); // 设置长按事件 mAdapter.setOnItemLongClickListener(new SuperRVAdapter.OnItemLongClickListener() { @Override public void onItemLongClick(View view, int position) { Log.i(TAG, "onItemLongClick: position=" + position); } }); } }
整个使用DEMO大概就是酱紫。哪里写错了留个言我改下。
源代码: https://github.com/AudienL/RecyclerViewDemo (源代码会不断更新,可能和博客的代码不同步)
标签:
原文地址:http://www.cnblogs.com/audienl/p/5435927.html