最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Android RecyclerView UI的滾動控件示例

 更新時間:2018年02月22日 09:22:46   作者:deniro  
本篇文章主要介紹了淺談Android RecyclerView UI的滾動控件示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

ListView 由于其強(qiáng)大的功能,在過去的 Andorid 開發(fā)中使用非常廣泛。不過 ListView 需要優(yōu)化來提升運(yùn)行效率,就像我們之前所優(yōu)化的那樣,否則性能將很差。還有就是只能夠縱向滾動,如果要想實(shí)現(xiàn)橫向移動,用 ListView 是做不到的。

RecyclerView 可以說是一個增強(qiáng)版的 ListView 。它不僅實(shí)現(xiàn)了和 ListView 同樣的效果,而且還優(yōu)化了 ListView 存在的各種不足。 RecyclerView 現(xiàn)在可是官方推薦使用的滾動控件哦O(∩_∩)O~

1 基本用法

RecyclerView 也是新增的控件,所以必須先在項目的 build.gradle 中添加相應(yīng)的依賴庫才能使用:

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

注意不要拼錯哦O(∩_∩)O~

添加后,記得點(diǎn)擊 Sync Now 鏈接哦。

接著,修改布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

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

這里把寬度和高度都定義為 match_parent,這樣 RecyclerView 就能占滿整個屏幕。因為 RecyclerView 也不是系統(tǒng)內(nèi)置的 SDK,所以這里引用的是完整的包路徑。

然后為 RecyclerView 創(chuàng)建一個適配器(繼承自 RecyclerView.Adapter<CatAdapter.ViewHolder> ):

public class CatAdapter extends RecyclerView.Adapter<CatAdapter.ViewHolder> {

  private List<Cat> cats;

  static class ViewHolder extends RecyclerView.ViewHolder {
    ImageView image;
    TextView name;

    public ViewHolder(View view) {
      super(view);
      image = (ImageView) view.findViewById(R.id.image);
      name = (TextView) view.findViewById(R.id.name);
    }
  }

  public CatAdapter(List<Cat> cats) {
    this.cats = cats;
  }


  @Override
  public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cat_item, parent, false);
    return new ViewHolder(view);
  }

  @Override
  public void onBindViewHolder(ViewHolder holder, int position) {
    Cat cat = cats.get(position);
    holder.image.setImageResource(cat.getImageId());
    holder.name.setText(cat.getName());
  }

  @Override
  public int getItemCount() {
    return cats.size();
  }
}

在代碼中,我們先定義了一個內(nèi)部類 ViewHolder,它繼承自 RecyclerView.ViewHolder。然后在 ViewHolder 的構(gòu)造函數(shù)中傳入一個 View 參數(shù),它是 RecyclerView 子項的最外層布局,所以我們可以通過它來取得布局中的 ImageView 和 TextView 的實(shí)例。

CatAdapter 的構(gòu)造函數(shù)用于把要展示的數(shù)據(jù)源傳遞進(jìn)來,并賦值給一個類變量 cats。

因為 CatAdapter 繼承自 RecyclerView.Adapter,所以必須重寫以下三個方法:

  1. onCreateViewHolder - 創(chuàng)建 ViewHolder 實(shí)例,我們把 cat_item 的布局加載進(jìn)來,創(chuàng)建了一個 ViewHolder 實(shí)例。
  2. onBindViewHolder - 對 RecyclerView 的子項數(shù)據(jù)進(jìn)行賦值,這個方法會在每個子項被滾動到屏幕內(nèi)時進(jìn)行。
  3. getItemCount - 返回 RecyclerView 的子項總數(shù)。

最后,我們在活動類中使用 RecyclerView :

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

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    init();
    RecyclerView recyclerView=(RecyclerView)findViewById(R.id.recycler_view);
    LinearLayoutManager layoutManager=new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
    CatAdapter adapter=new CatAdapter(cats);
    recyclerView.setAdapter(adapter);
  }

  /**
   * 初始化數(shù)據(jù)
   */
  private void init() {
    cats.add(new Cat("暹羅貓", R.drawable.cat1));
    cats.add(new Cat("布偶貓", R.drawable.cat2));
    cats.add(new Cat("蘇格蘭折耳貓", R.drawable.cat3));
    cats.add(new Cat("英國短毛貓", R.drawable.cat4));
    cats.add(new Cat("波斯貓", R.drawable.cat5));
    cats.add(new Cat("俄羅斯藍(lán)貓", R.drawable.cat6));
    cats.add(new Cat("美國短毛貓", R.drawable.cat7));
    cats.add(new Cat("異國短毛貓", R.drawable.cat8));
    cats.add(new Cat("挪威森林貓", R.drawable.cat9));
    cats.add(new Cat("孟買貓", R.drawable.cat10));
    cats.add(new Cat("緬因貓", R.drawable.cat11));
    cats.add(new Cat("埃及貓", R.drawable.cat12));
  }
}

這里創(chuàng)建了 LinearLayoutManager 的線性布局對象,傳遞給了 recyclerView.setLayoutManager() 方法。

recyclerView 示例

我們使用了 recyclerView 創(chuàng)建出了 ListView 的效果,而且代碼邏輯更清晰咯。

2 橫向滾動

現(xiàn)在讓我們把這些貓變?yōu)?“橫向滾動” 吧。

把 cat_item 中的元素變?yōu)榇怪迸帕校?/p>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="110dp"
  android:layout_height="wrap_content"
  android:orientation="vertical"
  >

  <ImageView
    android:id="@+id/image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    />

  <TextView
    android:id="@+id/name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="10dp" />

</LinearLayout>

這里還把 LinearLayout 的寬度設(shè)為 110dp,即固定的值。因為每種貓的文字長度不同,如果用 wrap_content 的話,可能造成子項的長短不一致;而如果用 match_parent 的話,又會導(dǎo)致一個子項就占滿了整個屏幕。

我們把 ImageView 與 TextView 都設(shè)置為水平居中,而且用 android:layout_marginTop,讓文字與圖片保持了一段距離,這樣更美觀。

接下來,修改活動類的代碼:

@Override
protected void onCreate(Bundle savedInstanceState) {
  ...
  layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
  ...
}

把 LinearLayoutManager 的布局改為橫向排列(默認(rèn)是縱向排列)。

橫向排列

我們可以在水平方向上滑動來查看屏幕外的 “貓” 啦。

ListView 的布局排列是由自身來管理的,所以存在一定的局限性;而 RecyclerView 把布局的工作交給了 LayoutManager,LayoutManager 制定了一系列可擴(kuò)展的布局排列接口,所以我們只要按照接口的規(guī)范來實(shí)現(xiàn),就能夠定制出各種不同排列方式的布局啦O(∩_∩)O~

3 瀑布流布局

讓我們使用 StaggeredGridLayoutManager 來實(shí)現(xiàn)酷炫的瀑布流布局吧O(∩_∩)O~

首先修改 cat_item 布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical"
  android:layout_margin="5dp"
  >

  <ImageView
    android:id="@+id/image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    />

  <TextView
    android:id="@+id/name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="left"
    android:layout_marginTop="10dp" />

</LinearLayout>

這里把 LinearLayout 的寬度改為 wrap_content,這樣寬度會根據(jù)實(shí)際的布局列數(shù)自動適配。 還使用 layout_margin 讓子項之間留出一定的間距。最后將 TextView 改為居左對齊,因為下面的說明文件內(nèi)容可能會很長喲O(∩_∩)O~

修改活動類的代碼:

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

  init();

  RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

  StaggeredGridLayoutManager layoutManager=new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);

  recyclerView.setLayoutManager(layoutManager);
  CatAdapter adapter = new CatAdapter(cats);
  recyclerView.setAdapter(adapter);
}

在此,我們創(chuàng)建了 StaggeredGridLayoutManager 的實(shí)例,它的構(gòu)造函數(shù)接受兩個參數(shù),第一個參數(shù)用于指定布局的列數(shù),第二個參數(shù)用于指定布局的排列方向。

瀑布流示例

4 點(diǎn)擊事件

RecyclerView 沒有像 ListView 一樣的 setOnItemClickListener() 事件,所以需要我們自己給子項具體的 View 注冊點(diǎn)擊事件。

ListView 的 setOnItemClickListener() 注冊的是子項的點(diǎn)擊事件,但如果想要注冊點(diǎn)擊的是子項里具體的某個按鈕時,使用 ListView 實(shí)現(xiàn)起來就比較麻煩。所以 RecyclerView 直接擯棄了子項點(diǎn)擊事件的監(jiān)聽器,把所有的點(diǎn)擊事件都交給具體的 View 去注冊實(shí)現(xiàn)咯O(∩_∩)O

修改適配器:

static class ViewHolder extends RecyclerView.ViewHolder {
  View catView;
  ImageView image;
  TextView name;

  public ViewHolder(View view) {
    super(view);
    catView = view;
    image = (ImageView) view.findViewById(R.id.image);
    name = (TextView) view.findViewById(R.id.name);
    Log.d(TAG, "ViewHolder: image:" + image);
    Log.d(TAG, "ViewHolder: name:" + name);
  }
}

public CatAdapter(List<Cat> cats) {
  this.cats = cats;
}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cat_item, parent, false);

  final ViewHolder holder = new ViewHolder(view);
  holder.catView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      int position = holder.getAdapterPosition();
      Cat cat = cats.get(position);
      Toast.makeText(v.getContext(), "你點(diǎn)擊了 View " + cat.getName(), Toast.LENGTH_SHORT).show();
    }
  });

  holder.image.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      int position = holder.getAdapterPosition();
      Log.d(TAG, "onClick: position:" + position);
      Cat cat = cats.get(position);
      Toast.makeText(v.getContext(), "你點(diǎn)擊了圖片 " + cat.getName(), Toast.LENGTH_SHORT).show();
    }
  });
  return holder;
}

我們?yōu)樽钔鈱拥牟季峙c ImageView 都注冊了點(diǎn)擊事件,這就是 RecyclerView 的靈活之處。

觸發(fā) RecyclerView 點(diǎn)擊事件

如果點(diǎn)擊了圖片下方的文字,會觸發(fā) ImageView 的點(diǎn)擊事件,因為事件會向外傳播哦O(∩_∩)O~

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Kotlin中的對象表達(dá)式和對象聲明的具體使用

    Kotlin中的對象表達(dá)式和對象聲明的具體使用

    這篇文章主要介紹了Kotlin中的對象表達(dá)式和對象聲明的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Android個人手機(jī)通訊錄開發(fā)詳解

    Android個人手機(jī)通訊錄開發(fā)詳解

    在本篇文章里小編給大家分享了關(guān)于Android個人手機(jī)通訊錄開發(fā)的步驟和相關(guān)源碼,有需要的朋友們學(xué)習(xí)下。
    2019-02-02
  • Android基礎(chǔ)之隱藏標(biāo)題欄/設(shè)置為全屏/橫豎屏切換

    Android基礎(chǔ)之隱藏標(biāo)題欄/設(shè)置為全屏/橫豎屏切換

    大家好,本篇文章主要講的是Android基礎(chǔ)之隱藏標(biāo)題欄/設(shè)置為全屏/橫豎屏切換,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Android實(shí)現(xiàn)幾種推送方式解決方案

    Android實(shí)現(xiàn)幾種推送方式解決方案

    推送功能在手機(jī)開發(fā)中應(yīng)用的場景是越來起來了,本篇文章主要介紹了Android實(shí)現(xiàn)幾種推送方式解決方案 ,具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12
  • 使用Android studio編寫一個小的jni程序

    使用Android studio編寫一個小的jni程序

    JNI是Java Native Interface的縮寫,它提供了若干的API實(shí)現(xiàn)了Java和其他語言的通信(主要是C&C++)。這篇文章給大家介紹了基于Android studio寫一個小的jni程序的方法,一起看看吧
    2018-03-03
  • ListView-添加item的事件監(jiān)聽實(shí)例

    ListView-添加item的事件監(jiān)聽實(shí)例

    下面小編就為大家?guī)硪黄狶istView-添加item的事件監(jiān)聽實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 一文詳解Android IntentService的開發(fā)技巧

    一文詳解Android IntentService的開發(fā)技巧

    Android應(yīng)用開發(fā)中,執(zhí)行后臺任務(wù)是常見需求之一,其中,IntentService是一種強(qiáng)大的工具,可以輕松管理異步任務(wù),而無需擔(dān)心線程管理和生命周期問題,本文將深入探討 IntentService 的各個方面,需要的朋友可以參考下
    2023-11-11
  • A10_DatePicker的對話框設(shè)置(使用OnDateSetListener監(jiān)聽器)

    A10_DatePicker的對話框設(shè)置(使用OnDateSetListener監(jiān)聽器)

    本文主要彌補(bǔ)A07_TimePicker & DatePicker & AnalogClock & DigitalClock 的設(shè)置,具體實(shí)現(xiàn)代碼如下,感興趣的朋友可以參考下哈
    2013-06-06
  • Android實(shí)現(xiàn)單項、多項選擇操作

    Android實(shí)現(xiàn)單項、多項選擇操作

    這篇文章主要介紹了Android實(shí)現(xiàn)單項、多項選擇操作的相關(guān)資料,單項選擇、多項選擇操作在項目開發(fā)中經(jīng)常應(yīng)用,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Android使用DrawerLayout實(shí)現(xiàn)側(cè)滑菜單效果

    Android使用DrawerLayout實(shí)現(xiàn)側(cè)滑菜單效果

    這篇文章主要為大家詳細(xì)介紹了Android使用DrawerLayout實(shí)現(xiàn)側(cè)滑菜單效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論

五家渠市| 抚宁县| 遂平县| 荣成市| 保靖县| 新河县| 修武县| 广安市| 通化市| 龙川县| 称多县| 抚州市| 喜德县| 温宿县| 金华市| 凭祥市| 咸阳市| 通榆县| 泗洪县| 确山县| 桑植县| 尼玛县| 大名县| 出国| 方山县| 宝应县| 新巴尔虎左旗| 尚义县| 秀山| 合肥市| 临澧县| 云霄县| 郁南县| 枣庄市| 双峰县| 奉贤区| 三江| 锦州市| 旬阳县| 罗山县| 兴化市|