android RecycleView

使用LayoutManager來確定每一個(gè)item的排列方式舞丛。
為增加和刪除項(xiàng)目提供默認(rèn)的動(dòng)畫效果扩所。
你也可以定義你自己的LayoutManager和添加刪除動(dòng)畫菊值,RecyclerView項(xiàng)目結(jié)構(gòu)如下:


image.png

Adapter:使用RecyclerView之前抄淑,你需要一個(gè)繼承自RecyclerView.Adapter的適配器,作用是將數(shù)據(jù)與每一個(gè)item的界面進(jìn)行綁定馋记。
LayoutManager:用來確定每一個(gè)item如何進(jìn)行排列擺放号坡,何時(shí)展示和隱藏√菪眩回收或重用一個(gè)View的時(shí)候宽堆,LayoutManager會(huì)向適配器請(qǐng)求新的數(shù)據(jù)來替換舊的數(shù)據(jù),這種機(jī)制避免了創(chuàng)建過多的View和頻繁的調(diào)用findViewById方法(與ListView原理類似)茸习。

目前SDK中提供了三種自帶的LayoutManager:

LinearLayoutManager
GridLayoutManager
StaggeredGridLayoutManager

RecyclerView 最重要的是實(shí)現(xiàn)Adapter畜隶,adapter中必須實(shí)現(xiàn)的三個(gè)方法:
①onCreateViewHolder()
這個(gè)方法主要生成為每個(gè)Item inflater出一個(gè)View,但是該方法返回的是一個(gè)ViewHolder号胚。該方法把View直接封裝在ViewHolder中籽慢,然后我們面向的是ViewHolder這個(gè)實(shí)例,當(dāng)然這個(gè)ViewHolder需要我們自己去編寫猫胁。直接省去了當(dāng)初的convertView.setTag(holder)和convertView.getTag()這些繁瑣的步驟箱亿。

②onBindViewHolder()
這個(gè)方法主要用于適配渲染數(shù)據(jù)到View中。方法提供給你了一個(gè)viewHolder弃秆,而不是原來的convertView届惋。

③getItemCount()
這個(gè)方法就類似于BaseAdapter的getCount方法了,即總共有多少個(gè)條目菠赚。

———————————————————————————————
簡(jiǎn)單的RecyclerView使用方法

1盼樟、添加依賴

compile 'com.android.support:recyclerview-v7:24.2.1'

2、使用RecyclerView

 <android.support.v7.widget.RecyclerView
    android:id="@+id/rv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
 />

3锈至、創(chuàng)建適配器Adapter

 private class MyAdapter extends  RecyclerView.Adapter<MyHolder>{
    private final List<String> list;
    public MyAdapter(){
        list =  new ArrayList<String>();
        for (int i = 0; i < 30; i++) {
            list.add("商品記錄" + i)}

}
      //OnCreateViewHolder用來給rv創(chuàng)建緩存的

 public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //參數(shù)3:判斷條件 true  1.是打氣 2.添加到parent
        View view = LayoutInflater.from(getContext()).inflate(R.layout.main_recyclerview_item,parent,false);
        MyHolder holder = new MyHolder(view);
        return holder;
    }
    //給緩存控件設(shè)置數(shù)據(jù)
    public void onBindViewHolder(MyHolder holder, int position) {

        String item = list.get(position);
        holder.textView.setText(item);
        holder.icon.setImageResource(R.drawable.ic_default);
    }
    //獲取記錄數(shù)

  public int getItemCount() {
        return list.size();
  }

4、創(chuàng)建HolderView

  public class MyHolder extends RecyclerView.ViewHolder {
public ImageView icon;
public TextView textView;
//實(shí)現(xiàn)的方法
public MyHolder(View itemView) {
    super(itemView);
    icon= (ImageView) itemView.findViewById(R.id.item_iv_icon);
    textView= (TextView) itemView.findViewById(R.id.item_tv_title);
}
}  

5译秦、設(shè)置adpater和LayoutManager給Recycleview

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(linearLayoutManager);

    initData();

    MyHomeAdapter adapter = new MyHomeAdapter(list);
    recyclerView.setAdapter(adapter);

    private List<String> list = new ArrayList <String>();
    // 初始化數(shù)據(jù)
public void initData(){
    for (int i = 0; i < 30 ; i++) {
        list.add("數(shù)據(jù)"+i);
    }
}
  • 封裝RecyclerView通用適配器
    好處:1.數(shù)量動(dòng)態(tài) 2.類型不限 Map<Integer峡捡,View>
    作用:封裝了Adapter編寫的冗余代碼击碗,提供簡(jiǎn)潔的基類

①封裝了BaseHolder

   //抽取BaseHolder繼承RecyclerView.ViewHolder
public class BaseHolder extends RecyclerView.ViewHolder {
//不寫死控件變量,而采用Map方式
private HashMap<Integer, View> mViews = new HashMap<>();
public BaseHolder(View itemView) {
    super(itemView);
}
/**
 *獲取控件的方法
 */
public<T> T getView(Integer viewId){
    //根據(jù)保存變量的類型 強(qiáng)轉(zhuǎn)為該類型
    View view = mViews.get(viewId);
    if(view==null){
       view= itemView.findViewById(viewId);
        //緩存
        mViews.put(viewId,view);
    }
    return (T)view;
}
/**
 *傳入文本控件id和設(shè)置的文本值们拙,設(shè)置文本
 */
public BaseHolder setText(Integer viewId, String value){
    TextView textView = getView(viewId);
    if (textView != null) {
        textView.setText(value);
    }
    return this;
}
/**
 * 傳入圖片控件id和資源id稍途,設(shè)置圖片
 */
public BaseHolder setImageResource(Integer viewId, Integer resId) {
    ImageView imageView = getView(viewId);
    if (imageView != null) {
        imageView.setImageResource(resId);
    }
    return this;
}
//...還可以擴(kuò)展出各種控件。
//Fluent API 鏈?zhǔn)絘pi  obj.setxxx().setyyy()....
}

②Holder封裝好之后砚婆,再封裝BaseAdapter

 封裝的時(shí)候械拍,部分參數(shù)可以選擇由外部的構(gòu)造函數(shù)或者set方法
public class BaseAdapter<T> extends RecyclerView.Adapter<BaseHolder> {
    private List<T> mList = new ArrayList<>();
    private int layoutId;
    public BaseAdapter(int layoutId,List<T> list){
        this.layoutId=layoutId;
        this. mList=list;
    }
    //onCreateViewHolder用來給rv創(chuàng)建緩存
    @Override
    public BaseHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       //參數(shù)3 判斷條件 true  1.打氣 2.添加到paraent
        // false 1.打氣 (參考parent的寬度)
        View view =   LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
        BaseHolder holder = new BaseHolder(view);
        return holder;
    }
   //onBindViewHolder給緩存控件設(shè)置數(shù)據(jù)
    @Override
    public void onBindViewHolder(BaseHolder holder, int position) {
        T item = mList.get(position);
        convert(holder,item);
    }
protected void convert(BaseHolder holder, T item) {
    //什么都沒有做
}
    //獲取記錄數(shù)據(jù)
    @Override
    public int getItemCount() {
        return mList.size();
    }
}

③封裝之后,繼承實(shí)現(xiàn)

 **
 *1.extends  把父類的代碼繼承過來装盯。  可以少寫很多代碼坷虑。
*2.因?yàn)槭侨磕脕淼拇a,所以不是所有的代碼都適合當(dāng)前埂奈。對(duì)于不適合當(dāng)前的代碼(方法)
* 我們可選擇@Override 覆蓋|重寫
*/
public class MyHomeAdapter extends BaseAdapter<String> {
   public MyHomeAdapter(List<String> list) {
      super(R.layout.main_recyclerview_item, list);
 }
 @Override
protected void convert(BaseHolder holder, String item) {
      holder.setText(R.id.item_tv_title,item).setImageResource(R.id.image,R.drawable.ic_ default);
   }
}

④封裝之后迄损,代碼實(shí)現(xiàn)

public class MainActivity extends AppCompatActivity {
private List<String> list = new ArrayList <String>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycle_view);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(linearLayoutManager);

    initData();

    MyHomeAdapter adapter = new MyHomeAdapter(list);
    recyclerView.setAdapter(adapter);
}


// 初始化數(shù)據(jù)
public void initData(){
    for (int i = 0; i < 30 ; i++) {
        list.add("數(shù)據(jù)"+i);
    }
}
}

https://blog.csdn.net/qq_37293612/article/details/54915250

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市账磺,隨后出現(xiàn)的幾起案子芹敌,更是在濱河造成了極大的恐慌,老刑警劉巖垮抗,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氏捞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡冒版,警方通過查閱死者的電腦和手機(jī)液茎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壤玫,“玉大人豁护,你說我怎么就攤上這事∮洌” “怎么了楚里?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)猎贴。 經(jīng)常有香客問我班缎,道長(zhǎng),這世上最難降的妖魔是什么她渴? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任达址,我火速辦了婚禮,結(jié)果婚禮上趁耗,老公的妹妹穿的比我還像新娘沉唠。我一直安慰自己,他們只是感情好苛败,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布满葛。 她就那樣靜靜地躺著径簿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘀韧。 梳的紋絲不亂的頭發(fā)上篇亭,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音锄贷,去河邊找鬼译蒂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谊却,可吹牛的內(nèi)容都是我干的柔昼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼因惭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼岳锁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蹦魔,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤激率,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后勿决,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乒躺,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年低缩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘉冒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咆繁,死狀恐怖讳推,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玩般,我是刑警寧澤银觅,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站坏为,受9級(jí)特大地震影響究驴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匀伏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一洒忧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧够颠,春花似錦熙侍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牢硅。三九已至,卻和暖如春芝雪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背综苔。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工惩系, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人如筛。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓堡牡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親杨刨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晤柄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • 【Android 控件 RecyclerView】 概述 RecyclerView是什么 從Android 5.0...
    Rtia閱讀 307,522評(píng)論 27 439
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評(píng)論 25 707
  • 甜蜜又微微苦澀,隱隱約約又有一絲辛辣妖胀,這或許就是暗戀的味道芥颈。 前幾天圣誕節(jié)和朋友一起玩桌游,雜七雜八的聊著忽然就說...
    階上蘭亭閱讀 372評(píng)論 2 3
  • 今年是與好友蓓相識(shí)的第15個(gè)年頭赚抡。初認(rèn)識(shí)蓓的時(shí)候爬坑,她還是一副鄰家乖乖女的形象,濃密的大眼睛涂臣、白綻的皮膚盾计、烏黑的頭發(fā)...
    青竹風(fēng)吟閱讀 470評(píng)論 2 1
  • 靜止署辉,這個(gè)世界就在那一刻,懷抱我的年華嘿岩四,女人你是否開始幽傷 突然想哭尝,這個(gè)冬天早該下一場(chǎng)大雪如絮如被,包裹起歲月里...
    想會(huì)飛的豬閱讀 279評(píng)論 0 5