内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

AndroidRecyclerView如何實(shí)現(xiàn)多種item布局

這篇文章主要介紹Android RecyclerView如何實(shí)現(xiàn)多種item布局,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

站在用戶的角度思考問題,與客戶深入溝通,找到達(dá)孜網(wǎng)站設(shè)計(jì)與達(dá)孜網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋達(dá)孜地區(qū)。

在項(xiàng)目中列表是基本都會用到的,然而在顯示列表時,我們需要的數(shù)據(jù)可能需要不止一種item顯示,對于復(fù)雜的數(shù)據(jù)就需要多種item,以不同的樣式顯示出來,這樣效果是很棒的,我們先看一下效果

Android RecyclerView如何實(shí)現(xiàn)多種item布局

Android RecyclerView如何實(shí)現(xiàn)多種item布局

我們可以看到,這個RecyclerView中有多種item顯示出來,那么具體怎么實(shí)現(xiàn)呢,其實(shí)在RecyclerView中,我們可以重寫方法getItemViewType(),這個方法會傳進(jìn)一個參數(shù)position表示當(dāng)前是第幾個Item,然后我們可以通過position拿到當(dāng)前的Item對象,然后判斷這個item對象需要那種視圖,返回一個int類型的視圖標(biāo)志,然后在onCreatViewHolder方法中給引入布局,這樣就能夠?qū)崿F(xiàn)多種item顯示了,講了這么多我們看一下具體的例子

@Override 
public int getItemViewType(int position) { 
  if(list.size() == 0){ 
    return EMPTY_VIEW; 
  } else if(list.get(position) == null){ 
    return PROGRESS_VIEW; 
  } else if(list.get(position).getType().equals(News.IMAGE_NEWS)){ 
    return IMAGE_VIEW; 
  } else { 
    return super.getItemViewType(position); 
  } 
}

首先我們重寫了getItemViewType這個方法,在這個方法中根據(jù)position對item對象做了一些判斷,如果存儲item對象的集合大小為空,返回空view標(biāo)識(這里為1),如果item對象為null,返回進(jìn)度條標(biāo)識,這個主要是用于實(shí)現(xiàn)下拉加載更多,如果item對象類型屬于圖片類型,就返回圖片類型對應(yīng)的Item,這個就是效果圖中的第一個Item類型,否則就是其它類型,也就是效果圖中的另一種item布局,然后我們在onCreatViewHolder中具體的為每一種類型引入其布局

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
  View view; 
  if(viewType == PROGRESS_VIEW){ 
    view = LayoutInflater.from(parent.getContext()).inflate(R.layout.progressbar_item, parent, false); 
    return new ProgressViewHolder(view); 
  } else if(viewType == EMPTY_VIEW){ 
    return null; 
  } else if(viewType == IMAGE_VIEW){ 
    view = LayoutInflater.from(parent.getContext()).inflate(R.layout.image_news_item, parent, false); 
    return new ImageViewHolder(view); 
  } else { 
    view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item, parent, false); 
    return new NewsViewHolder(view); 
  } 
}

上面的代碼就是具體為每種viewType引入其對應(yīng)的布局,這樣就基本實(shí)現(xiàn)了多種item布局,但是僅僅是這些還不夠,因?yàn)槲覀冞€要對每種item設(shè)置數(shù)據(jù),所以還要對每種item寫一個VIewHolder來為item顯示數(shù)據(jù)

class NewsViewHolder extends RecyclerView.ViewHolder{  
  @BindView(R.id.news_title)TextView title; 
  @BindView(R.id.news_digest)TextView digest; 
  @BindView(R.id.news_time)TextView time; 
  @BindView(R.id.news_src)ImageView image;  
  public NewsViewHolder(View itemView) { 
    super(itemView); 
    ButterKnife.bind(this, itemView); 
  } 
} 
 
class ImageViewHolder extends RecyclerView.ViewHolder{  
  @BindView(R.id.news_title) TextView title; 
  @BindView(R.id.image_left) ImageView imageLeft; 
  @BindView(R.id.image_right) ImageView imageRight; 
  @BindView(R.id.image_middle) ImageView imageMiddle; 
  @BindView(R.id.news_time) TextView time;  
  public ImageViewHolder(View itemView) { 
    super(itemView); 
    ButterKnife.bind(this, itemView); 
  } 
} 
 
class ProgressViewHolder extends RecyclerView.ViewHolder {  
  @BindView(R.id.progressBar) ProgressBar progressBar; 
  @BindView(R.id.textView) TextView textView;  
  public ProgressViewHolder(View itemView) { 
    super(itemView); 
    ButterKnife.bind(this, itemView); 
  } 
}

上面就是item對應(yīng)的幾個ViewHolder,判斷viewHolder屬于那種對象,然后在onBindViewHolder中根據(jù)對應(yīng)的ViewHolder對其控件設(shè)置數(shù)據(jù)并顯示

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
  holder.itemView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
      clickListener.onItemClick(v, position); 
    } 
  }); 
  if(holder instanceof NewsViewHolder){ 
    NewsViewHolder viewHolder = (NewsViewHolder)holder; 
    viewHolder.title.setText(list.get(position).getTitle()); 
    viewHolder.time.setText(list.get(position).getTime()); 
    /** 
     * Glide加載圖片 
     */ 
    Glide.with(context).load(list.get(position).getImageUrl().get(0)) 
        .override(dpToPx(72), dpToPx(72)).centerCrop().into(viewHolder.image); 
    if(list.get(position).getType().equals(News.TEXT_NEWS)){ 
      viewHolder.digest.setText(list.get(position).getDigest()); 
    } else { 
      viewHolder.digest.setText(""); 
    } 
  } else if(holder instanceof ImageViewHolder){ 
    ImageViewHolder viewHolder = (ImageViewHolder)holder; 
    viewHolder.title.setText(list.get(position).getTitle()); 
    viewHolder.time.setText(list.get(position).getTime()); 
    setItemImage(viewHolder, list, position); 
  } else if(holder instanceof ProgressViewHolder){ 
    ProgressViewHolder viewHolder = (ProgressViewHolder)holder; 
    viewHolder.progressBar.setIndeterminate(true); 
 
  } 
}

整個過程基本就是這樣,這種方式在項(xiàng)目中經(jīng)常會用到,我們就可以這樣去處理,下拉加載更多就可以這樣實(shí)現(xiàn),在加載完數(shù)據(jù)后再往對象集合中傳入null,然后判斷如果出現(xiàn)null就加載progressBar布局,再加上Google官方的SwipeRefreshLayout,下拉刷新,上拉加載就搞定了,其實(shí)很容易,而且也有點(diǎn)Material Design 的感覺~~~~~~

看下Adapter的全部代碼

package com.zmt.e_read.Adapter;  
import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.util.DisplayMetrics; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView;  
import com.bumptech.glide.Glide; 
import com.zmt.e_read.Module.News; 
import com.zmt.e_read.Module.OnItemClickListener; 
import com.zmt.e_read.R; 
import com.zmt.e_read.Utils.ProgressViewHolder; 
import java.util.Collection; 
import java.util.Collections; 
import java.util.List; 
import butterknife.BindView; 
import butterknife.ButterKnife;  
/** 
 * Created by Dangelo on 2016/9/27. 
 */ 
public class NewsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
  private final int EMPTY_VIEW = 1; 
  private final int PROGRESS_VIEW = 2; 
  private final int IMAGE_VIEW = 3; 
  private Context context; 
  private List<News> list; 
  private OnItemClickListener clickListener; 
 
  public NewsAdapter(Context context, List<News> list, OnItemClickListener clickListener) { 
    this.context = context; 
    this.list = list; 
    this.clickListener = clickListener; 
  } 
 
  public void addOnItemClickListener(OnItemClickListener clickListener){ 
    this.clickListener = clickListener; 
  } 
 
  @Override 
  public int getItemViewType(int position) { 
    if(list.size() == 0){ 
      return EMPTY_VIEW; 
    } else if(list.get(position) == null){ 
      return PROGRESS_VIEW; 
    } else if(list.get(position).getType().equals(News.IMAGE_NEWS)){ 
      return IMAGE_VIEW; 
    } else { 
      return super.getItemViewType(position); 
    } 
  } 
 
  @Override 
  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view; 
    if(viewType == PROGRESS_VIEW){ 
      view = LayoutInflater.from(parent.getContext()).inflate(R.layout.progressbar_item, parent, false); 
      return new ProgressViewHolder(view); 
    } else if(viewType == EMPTY_VIEW){ 
      return null; 
    } else if(viewType == IMAGE_VIEW){ 
      view = LayoutInflater.from(parent.getContext()).inflate(R.layout.image_news_item, parent, false); 
      return new ImageViewHolder(view); 
    } else { 
      view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item, parent, false); 
      return new NewsViewHolder(view); 
    } 
  } 
 
  @Override 
  public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
    holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        clickListener.onItemClick(v, position); 
      } 
    }); 
    if(holder instanceof NewsViewHolder){ 
      NewsViewHolder viewHolder = (NewsViewHolder)holder; 
      viewHolder.title.setText(list.get(position).getTitle()); 
      viewHolder.time.setText(list.get(position).getTime()); 
      /** 
       * Glide加載圖片 
       */ 
      Glide.with(context).load(list.get(position).getImageUrl().get(0)) 
          .override(dpToPx(72), dpToPx(72)).centerCrop().into(viewHolder.image); 
      if(list.get(position).getType().equals(News.TEXT_NEWS)){ 
        viewHolder.digest.setText(list.get(position).getDigest()); 
      } else { 
        viewHolder.digest.setText(""); 
      } 
    } else if(holder instanceof ImageViewHolder){ 
      ImageViewHolder viewHolder = (ImageViewHolder)holder; 
      viewHolder.title.setText(list.get(position).getTitle()); 
      viewHolder.time.setText(list.get(position).getTime()); 
      setItemImage(viewHolder, list, position); 
    } else if(holder instanceof ProgressViewHolder){ 
      ProgressViewHolder viewHolder = (ProgressViewHolder)holder; 
      viewHolder.progressBar.setIndeterminate(true); 
 
    } 
  } 
 
  public void setItemImage(ImageViewHolder viewHolder, List<News> list, int position){ 
    viewHolder.imageMiddle.setVisibility(View.VISIBLE); 
    viewHolder.imageRight.setVisibility(View.VISIBLE); 
    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); 
    if(list.get(position).getImageUrl().size() == 1){ 
      Glide.with(context).load(list.get(position).getImageUrl().get(0)) 
          .override(displayMetrics.widthPixels - dpToPx(10), dpToPx(90)) 
          .centerCrop().into(viewHolder.imageLeft); 
      viewHolder.imageMiddle.setVisibility(View.GONE); 
      viewHolder.imageRight.setVisibility(View.GONE); 
    } else if(list.get(position).getImageUrl().size() == 2){ 
      int imageWidth = (displayMetrics.widthPixels - dpToPx(20)) / 2; 
      Glide.with(context).load(list.get(position).getImageUrl().get(0)) 
          .override(imageWidth, dpToPx(90)) 
          .centerCrop().into(viewHolder.imageLeft); 
      Glide.with(context).load(list.get(position).getImageUrl().get(1)) 
          .override(imageWidth, dpToPx(90)) 
          .centerCrop().into(viewHolder.imageMiddle); 
      viewHolder.imageRight.setVisibility(View.GONE); 
    } else if(list.get(position).getImageUrl().size() >= 3){ 
      int imageWidth = (displayMetrics.widthPixels - dpToPx(30)) / 3; 
      Glide.with(context).load(list.get(position).getImageUrl().get(0)) 
          .override(imageWidth, dpToPx(90)) 
          .centerCrop().into(viewHolder.imageLeft); 
      Glide.with(context).load(list.get(position).getImageUrl().get(1)) 
          .override(imageWidth, dpToPx(90)) 
          .centerCrop().into(viewHolder.imageMiddle); 
      Glide.with(context).load(list.get(position).getImageUrl().get(2)) 
          .override(imageWidth, dpToPx(90)) 
          .centerCrop().into(viewHolder.imageRight); 
    } 
  } 
 
  @Override 
  public int getItemCount() { 
    return list.size(); 
  } 
 
  public int dpToPx(float dp){ 
    float px = context.getResources().getDisplayMetrics().density; 
    return (int)(dp * px + 0.5f); 
  } 
 
  class NewsViewHolder extends RecyclerView.ViewHolder{ 
    @BindView(R.id.news_title)TextView title; 
    @BindView(R.id.news_digest)TextView digest; 
    @BindView(R.id.news_time)TextView time; 
    @BindView(R.id.news_src)ImageView image;  
    public NewsViewHolder(View itemView) { 
      super(itemView); 
      ButterKnife.bind(this, itemView); 
    } 
  } 
 
  class ImageViewHolder extends RecyclerView.ViewHolder{ 
     @BindView(R.id.news_title) TextView title; 
    @BindView(R.id.image_left) ImageView imageLeft; 
    @BindView(R.id.image_right) ImageView imageRight; 
    @BindView(R.id.image_middle) ImageView imageMiddle; 
    @BindView(R.id.news_time) TextView time;  
    public ImageViewHolder(View itemView) { 
      super(itemView); 
      ButterKnife.bind(this, itemView); 
    } 
  } 
     
  class ProgressViewHolder extends RecyclerView.ViewHolder { 
    @BindView(R.id.progressBar) ProgressBar progressBar; 
    @BindView(R.id.textView) TextView textView;  
    public ProgressViewHolder(View itemView) { 
      super(itemView); 
      ButterKnife.bind(this, itemView); 
    } 
  } 
}

最后說一下為什么為什么用RecyclerView取代ListView。

用過ListView的都知道,在ListView中若要復(fù)用視圖緩存,就要在getView()方法中手動判斷convertView是否為空,若不為空則復(fù)用視圖緩存,若為空則重新加載視圖,而RecyclerView相當(dāng)于對ListView的Adapter進(jìn)行了再次封裝,把ListView手動判斷是否有緩存的代碼封裝到RecyclerView內(nèi)部,使這部分邏輯不可見,我們只需要通過getItemCount()方法告訴RecyclerView有多少項(xiàng)數(shù)據(jù),然后在onCreateViewHolder()中加載item布局實(shí)例化ViewHolder,然后在onBindViewHolder()中完成數(shù)據(jù)的綁定即可。

以上是“Android RecyclerView如何實(shí)現(xiàn)多種item布局”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章名稱:AndroidRecyclerView如何實(shí)現(xiàn)多種item布局
分享路徑:http://www.rwnh.cn/article18/jdjigp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)域名注冊、ChatGPT、商城網(wǎng)站、網(wǎng)站維護(hù)、微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
湛江市| 汉阴县| 太康县| 镇平县| 桂东县| 仪陇县| 永丰县| 隆子县| 丽江市| 波密县| 额济纳旗| 苏州市| 富顺县| 丰都县| 泗洪县| 鄢陵县| 大关县| 冕宁县| 乃东县| 崇左市| 崇明县| 新乐市| 广汉市| 岑巩县| 锡林浩特市| 兴宁市| 奉贤区| 鹤山市| 洛隆县| 宁德市| 蓬溪县| 禄丰县| 门头沟区| 芦溪县| 丹东市| 广元市| 昂仁县| 遂川县| 甘谷县| 深州市| 长顺县|