廢話不多說,堅持自己一貫的風格,儘量把代碼寫的最簡單。一上效果圖,二上代碼,註釋都在代碼中。 效果圖是個美女,莫怪,代碼寫著寫著總會意淫一下,,, 一、引入相關包 二、整體佈局 這裡佈局就只有一個RecyclerView。 三、item佈局 這裡也是只有一個TextView。 四、封裝Adapter ...
一直使用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>
三、item佈局
這裡也是只有一個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>
四、封裝Adapter-不用鳥它,直接使用就行
平時養成了壞習慣,看到不爽的東西,麻煩的東西,總是喜歡把它封裝起來,為我所用,所以封裝之後提供的介面也是按照我的習慣亂來的。
其中 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([email protected]) 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
這裡直接繼承上面封裝好的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([email protected]) 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); } } }
六、Activity
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 (源代碼會不斷更新,可能和博客的代碼不同步)