RecyclerView已经出来了一段时间了,应该很多开发者也已经使用过,至于更多的关于RecyclerView的百度吧。
在使用RecyclerView时,它的adapter是RecyclerView.Adapter,在我开始使用中,每次都会写很多重复的东西,仔细看看,其实也是可以抽出一个BaseAdapter,这样开发更快捷,同时也提供短按和长按接口,代码如下:
BaseRecyclerViewAdapter.java
package com.hmy
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
/**
* Created by HMY on 2015/12/25.
*/
public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> {
protected Context mContext;
protected List<T> mList;
protected RecyclerView mRecyclerView;
private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
public BaseRecyclerViewAdapter(Context context) {
mContext = context;
}
@Override
abstract public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup, int i);
@Override
public void onBindViewHolder(BaseViewHolder baseViewHolder, int i) {
baseViewHolder.setOnItemClickListener(new BaseViewHolder.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(view, position);
}
}
});
baseViewHolder.setOnItemLongClickListener(new BaseViewHolder.OnItemLongClickListener() {
@Override
public void onItemLongClick(View view, int position) {
if (mOnItemLongClickListener != null) {
mOnItemLongClickListener.onItemLongClick(view, position);
}
}
});
}
@Override
public int getItemCount() {
return mList == null ? 0 : mList.size();
}
public int getItemViewHeight() {
return 0;
}
public void setList(List<T> list) {
this.mList = list;
}
public List<T> getList() {
return mList;
}
public void setList(T[] list) {
ArrayList<T> arrayList = new ArrayList<T>(list.length);
for (T t : list) {
arrayList.add(t);
}
setList(arrayList);
}
public RecyclerView getRecyclerView() {
return mRecyclerView;
}
public void setRecyclerView(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
}
public void setOnItemClickListener(OnItemClickListener l) {
mOnItemClickListener = l;
}
public void setOnItemLongClickListener(OnItemLongClickListener l) {
mOnItemLongClickListener = l;
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
public interface OnItemLongClickListener {
void onItemLongClick(View view, int position);
}
}
BaseViewHolder.java
由于RecyclerView规范了ViewHolder的使用,所以BaseViewHolder也是需要的。
package com.hmy;
import android.support.v7.widget.RecyclerView;
import android.view.View;
/**
* Created by HMY on 2015/12/25.
*/
public class BaseViewHolder extends RecyclerView.ViewHolder {
private OnItemClickListener mOnItemClickListener;
private OnItemLongClickListener mOnItemLongClickListener;
public BaseViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(new OnClickLis());
itemView.setOnLongClickListener(new OnLongClickLis());
}
private class OnClickLis implements View.OnClickListener {
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(v, getPosition());
}
}
}
private class OnLongClickLis implements View.OnLongClickListener {
@Override
public boolean onLongClick(View v) {
if (mOnItemLongClickListener != null) {
mOnItemLongClickListener.onItemLongClick(v, getPosition());
return true;
}
return false;
}
}
public void setOnItemClickListener(OnItemClickListener l) {
mOnItemClickListener = l;
}
public void setOnItemLongClickListener(OnItemLongClickListener l) {
mOnItemLongClickListener = l;
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
public interface OnItemLongClickListener {
void onItemLongClick(View view, int position);
}
}
下面是一个TestAdapter
package com.hmy;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.hmy.R;
import com.hmy.TestModel;
/**
* Created by HMY on 2015/12/25.
*/
public class RecyclerViewTestAdapter extends BaseRecyclerViewAdapter<TestModel> {
public RecyclerViewTestAdapter(Context context) {
super(context);
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(mContext).inflate(R.layout.item_layout,
viewGroup, false);
TestViewHolder viewHolder = new TestViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(BaseViewHolder baseViewHolder, int i) {
super.onBindViewHolder(baseViewHolder, i);
TestViewHolder holder = (TestViewHolder) baseViewHolder;//这里需要强转,与onCreateViewHolder中的ViewHolder一致
holder.textTv.setText(mList.get(i).text);
}
private class TestViewHolder extends BaseViewHolder {
public TextView textTv;
public TestViewHolder(View itemView) {
super(itemView);
textTv = (TextView) itemView.findViewById(R.id.tv_text);
}
}
}
package com.hmy;
import java.io.Serializable;
/**
* Created by HMY on 2015/12/25.
*/
public class TestModel implements Serializable {
public String text = "";
}