对RecycleView的adapter的抽取

编写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.
 * 邮箱: [email protected]
 */
public abstract class BaseRecycleViewAdapter extends RecyclerView.Adapter {
    protected Context mContext;
    //屏幕的宽高,主要用于代码适配
    protected int mWindowHeight;
    protected int mWindowWidth;
    protected OnItemClickListener mOnItemClickListener;
    protected List mList;

    public BaseRecycleViewAdapter(Context context, List list){
        mContext = context;
        mList = list;
        HashMap 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 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 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 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) {
        super.onBindViewHolder(holder,position); //注意要调用父类的
        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) {
               ...
            }
        });




你可能感兴趣的:(Android,RecycleView)