框架整理系列十三(RecycleView萬能適配器[替代十])

(大神:https://github.com/GitLqr/LQRAdapterLibrary)

引用

compile 'com.lqr.adapter:library:1.0.2'

使用

一、LQRAdapterForAbsListView

1、創(chuàng)建適配器

LQRAdapterForAbsListView<數(shù)據(jù)類型>(上下文,數(shù)據(jù)集合,item的布局引用)

2、在convert方法中對item進(jìn)行數(shù)據(jù)設(shè)置

3、例子:

private List<String> mData = new ArrayList<>();
for (int i = 0; i < 100; i++) {
    mData.add("item " + i);
}

//ListView
mLv.setAdapter(new LQRAdapterForAbsListView<String>(this, mData, R.layout.item_tv_list) {
    @Override
    public void convert(LQRViewHolderForAbsListView helper, String item, int position) {
        helper.setText(R.id.tv, item);
    }

});

//GridView
mGv = (GridView) findViewById(R.id.gv);
mGv.setAdapter(new LQRAdapterForAbsListView<String>(this, mData, R.layout.item_tv_list) {
    @Override
    public void convert(LQRViewHolderForAbsListView helper, String item, int position) {
        helper.setText(R.id.tv, item);
    }

});

4、helper的使用

LQRViewHolderForAbsListView中提供了許多常規(guī)用的控件操作,如設(shè)置文字、文字顏色、背景、顯隱等,同時每個方法都是返回this,這意味著可以鏈?zhǔn)讲僮鳎奖憧焖匍_發(fā)。

二、LQRAdapterForRecyclerView

1、創(chuàng)建適配器

LQRAdapterForRecyclerView<數(shù)據(jù)類型>(上下文,數(shù)據(jù)集合,item的布局引用)

2、在convert方法中對item進(jìn)行數(shù)據(jù)設(shè)置

3、例子:

//RecyclerView
mRv.setAdapter(new LQRAdapterForRecyclerView<String>(this, mData, R.layout.item_tv_list) {
    @Override
    public void convert(LQRViewHolderForRecyclerView helper, String item, int position) {
        helper.setText(R.id.tv, item);
    }
});

4、helper的使用

LQRViewHolderForRecyclerView中提供了許多常規(guī)用的控件操作,如設(shè)置文字、文字顏色、背景、顯隱等,同時每個方法都是返回this,這意味著可以鏈?zhǔn)讲僮鳎奖憧焖匍_發(fā)。

5、添加頭部、尾部

LQRAdapterForRecyclerView<String>  mAdapter = new LQRAdapterForRecyclerView(...);
//必須使用HeaderAndFooterAdapter作為RecyclerView的適配器
mRv.setAdapter(mAdapter.getHeaderAndFooterAdapter());

//添加頭部
private void testAddHeaderView() {
    TextView tv = new TextView(this);
    ...
    tv.setText("heaer");
    mAdapter.addHeaderView(tv);
}

//添加尾部
private void testAddFooterView() {
    TextView tv = new TextView(this);
    ...
    tv.setText("footer");
    mAdapter.addFooterView(tv);
}
image

6、多視圖類型支持(viewType)

若項(xiàng)目中需要用到多種條目視圖類型,則需要重新getItemViewType方法,其返回值是不同類型對應(yīng)的視圖布局資源id,如:

private static final int NOTIFICATION = R.layout.item_notification;
private static final int SEND_TEXT = R.layout.item_text_send;
private static final int RECEIVE_TEXT = R.layout.item_text_receive;
private static final int SEND_STICKER = R.layout.item_sticker_send;
private static final int RECEIVE_STICKER = R.layout.item_sticker_receive;
private static final int SEND_IMAGE = R.layout.item_image_send;
private static final int RECEIVE_IMAGE = R.layout.item_image_receive;
private static final int SEND_VIDEO = R.layout.item_video_send;
private static final int RECEIVE_VIDEO = R.layout.item_video_receive;
private static final int SEND_LOCATION = R.layout.item_location_send;
private static final int RECEIVE_LOCATION = R.layout.item_location_receive;

@Override
public int getItemViewType(int position) {
    IMMessage msg = getData().get(position);
    MsgTypeEnum msgType = msg.getMsgType();
    if (msgType == MsgTypeEnum.notification) {
        return NOTIFICATION;
    }
    if (msgType == MsgTypeEnum.text) {
        if (msg.getDirect() == MsgDirectionEnum.Out) {
            return SEND_TEXT;
        } else {
            return RECEIVE_TEXT;
        }
    }
    if (msgType == MsgTypeEnum.custom) {
        if (msg.getDirect() == MsgDirectionEnum.Out) {
            return SEND_STICKER;
        } else {
            return RECEIVE_STICKER;
        }
    }
    if (msgType == MsgTypeEnum.image) {
        if (msg.getDirect() == MsgDirectionEnum.Out) {
            return SEND_IMAGE;
        } else {
            return RECEIVE_IMAGE;
        }
    }
    if (msgType == MsgTypeEnum.video) {
        if (msg.getDirect() == MsgDirectionEnum.Out) {
            return SEND_VIDEO;
        } else {
            return RECEIVE_VIDEO;
        }
    }
    if (msgType == MsgTypeEnum.location) {
        if (msg.getDirect() == MsgDirectionEnum.Out) {
            return SEND_LOCATION;
        } else {
            return RECEIVE_LOCATION;
        }
    }
    return super.getItemViewType(position);
}

以上是本人項(xiàng)目中用到的代碼,以此作為參考。

7、其他

建議與LQRRecyclerView一起使用,不需要考慮LayoutManager和分割線的情況,開發(fā)效率大大提高。

三、事件控制

不管是LQRAdapterForAbsListView還是LQRAdapterForRecyclerView,都可以通過使用適配器對item進(jìn)行事件監(jiān)聽,代碼如下:

mAdapter.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(LQRViewHolder helper, ViewGroup parent, View itemView, int position) {
        helper.setText(R.id.tv, "我被點(diǎn)擊了");
    }
});
mAdapter.setOnItemLongClickListener(new OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(LQRViewHolder helper, ViewGroup parent, View itemView, int position) {
        helper.setText(R.id.tv, "我被長按了");
        return false;
    }
});
mAdapter.setOnItemTouchListener(new OnItemTouchListener() {
    @Override
    public boolean onItemTouch(LQRViewHolder helper, View childView, MotionEvent event, int position) {
        helper.setText(R.id.tv, "我被觸摸了");
        return false;
    }
});

福利


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 前言 主要聲明三點(diǎn) 第一:關(guān)于本文的BaseRecyclerViewAdapterHelper用法,自然是轉(zhuǎn)載的官...
    _猜火車_閱讀 156,829評論 81 166
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,814評論 25 708
  • 我的野蠻婆婆,看著她和黃宗澤演的不留名或者說寧茂春,跌跌撞撞著終于走到一起。 野蠻婆婆Ⅱ里,周麗敏和Kyle說出離...
    栗唯閱讀 508評論 0 0
  • 目前來看,漢堡王全球的市場價值和認(rèn)可度,與在中國市場目前的價值和認(rèn)可度,并不對等。 當(dāng)漢堡王進(jìn)入中國這個廣闊的市場...
    善待有緣人閱讀 167評論 0 0