编写RecycleView时对adapter进行了一些抽取。
import android.app.Activity;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import com.wjustudio.phoneManager.Common.AppConstants;
import com.wjustudio.phoneManager.utils.CommonUtil;
import java.util.HashMap;
import java.util.List;
/**
* 作者: songwenju on 2016/4/10 10:44.
* 邮箱: songwenju@outlook.com
*/
public abstract class BaseRecycleViewAdapter<T> extends RecyclerView.Adapter {
protected Context mContext;
//屏幕的宽高,主要用于代码适配
protected int mWindowHeight;
protected int mWindowWidth;
protected OnItemClickListener mOnItemClickListener;
protected List<T> mList;
public BaseRecycleViewAdapter(Context context, List<T> list){
mContext = context;
mList = list;
HashMap<String, Integer> windowSize = CommonUtil.getWindowSize((Activity) mContext);
mWindowHeight = windowSize.get(AppConstants.WINDOW_HEIGHT);
mWindowWidth = windowSize.get(AppConstants.WINDOW_WIDTH);
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
mOnItemClickListener = listener;
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
if (mOnItemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickListener.onItemClick(holder.itemView, position);
}
});
}
}
@Override
public int getItemCount() {
return mList == null ? 0 : mList.size();
}
}
其中CommonUtil.getWindowSize(context)如下
**
* 获得宽度和除去通知栏的屏幕的高度
*
* @param activity
* @return
*/
public static HashMap<String, Integer> getWindowSize(Activity activity) {
WindowManager wm = activity.getWindowManager();
DisplayMetrics metrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;
height -= getStatusBarHeight(activity);
HashMap<String, Integer> windowSize = new HashMap<>();
windowSize.put("height", height);
windowSize.put("width", width);
return windowSize;
}
/**
* 获得状态栏的高度
*
* @param activity
* @return
*/
public static int getStatusBarHeight(Activity activity) {
int statusHeight = 0;
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
statusHeight = frame.top;
if (0 == statusHeight) {
Class<?> localClass;
try {
localClass = Class.forName("com.android.internal.R$dimen");
Object localObject = localClass.newInstance();
int i5 = Integer.parseInt(localClass.getField("status_bar_height").
get(localObject).toString());
statusHeight = activity.getResources().getDimensionPixelSize(i5);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
return statusHeight;
}
在使用该基类时的范例:
/**
* 联系人选择的adapter
*/
public class SelectContactAdapter extends BaseRecycleViewAdapter {
public SelectContactAdapter(Context context, List<Contact> contactList) {
super(context,contactList);
}
public class NormalViewHolder extends RecyclerView.ViewHolder {
public NormalViewHolder(View itemView) {
super(itemView);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) xxx.getLayoutParams();
params.width = mWindowWidth - contactName.getWidth();
contactNum.setLayoutParams(params);
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LogUtil.i(this, "onCreateViewHolder");
View view = View.inflate(mContext, R.layout.xxx, null);
return new NormalViewHolder(view);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
<span style="color:#FF0000;"> super.onBindViewHolder(holder,position); //注意要调用父类的</span>
LogUtil.i(this, "onBindViewHolder");
NormalViewHolder normalViewHolder = (NormalViewHolder) holder;
...
}
调用该adapter:
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
//设置垂直滚动,也可以设置横向滚动
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//RecyclerView设置布局管理器
mRecyclerView.setLayoutManager(layoutManager);
//添加分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(
this, DividerItemDecoration.VERTICAL_LIST
));
SelectContactAdapter adapter = new SelectContactAdapter(mContext, mContactList);
mRecyclerView.setAdapter(adapter);
adapter.setOnItemClickListener(new SelectContactAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
...
}
});