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

Android 中RecyclerView多種item布局的寫法(頭布局+腳布局)

 更新時間:2017年01月08日 11:05:39   作者:Android_Study_OK  
這篇文章主要介紹了Android 中RecyclerView多種item布局的寫法(頭布局+腳布局)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

RecyclerView多個item布局的寫法(頭布局+腳布局)

上圖

圖1

圖2

github

下載源碼

Initial commit第一次提交的代碼,為本文內(nèi)容

以下的為主要代碼,看注釋即可,比較簡單

MainActivity

含上拉加載更多

package com.anew.recyclerviewall;

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
  private RecyclerView mRecyclerView;
  private List<String> mHeadList;
  private List<String> mBodyList;
  private List<String> mFootList;
  private MyAdapter mAdapter;
  private LinearLayoutManager mLayoutManager;
  Handler mHandler = new Handler();
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    mHeadList = new ArrayList<>();
    for (int i = 0; i < 1; i++) {
      mHeadList.add("head" + i);
    }
    mBodyList = new ArrayList<>();
    for (int i = 'A'; i < 'L'; i++) {
      mBodyList.add("" + (char) i);
    }
    mFootList = new ArrayList<>();
    for (int i = 0; i < 1; i++) {
      mFootList.add("foot" + i);
    }
    mRecyclerView = (RecyclerView) findViewById(R.id.rv);
//    使用默認的api繪制分割線
    mRecyclerView.addItemDecoration
        (new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL));
//    設(shè)置增加刪除item的動畫效果
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//    瀑布流
//    mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));
    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);
    mAdapter = new MyAdapter(this, mHeadList, mBodyList, mFootList);
    mRecyclerView.setAdapter(mAdapter);
    // 當(dāng)目前的可見條目是所有數(shù)據(jù)的最后一個時,開始加載新的數(shù)據(jù)
    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
      @Override
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        int lastCompletelyVisibleItemPosition = mLayoutManager.findLastCompletelyVisibleItemPosition();
        if (lastCompletelyVisibleItemPosition + 1 == mAdapter.getItemCount()) {
          mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
              List<String> mMoreList = new ArrayList<>();
              for (int i = 0; i < 3; i++) {
                mMoreList.add("more" + i);
              }
              mBodyList.addAll(mMoreList);
              mAdapter.notifyItemInserted(mAdapter.getItemCount() - 2);
            }
          }, 1500);
          Log.e("qqq", "到底了" + lastCompletelyVisibleItemPosition);
        }
        int firstCompletelyVisibleItemPosition = mLayoutManager.findFirstCompletelyVisibleItemPosition();
        if (firstCompletelyVisibleItemPosition == 0&&dy<0) {
          Log.e("eeeee", "開始刷新呀呀呀");
        }
      }
    });
  }
}

MyAdapter

對外部:頭布局list、身體布局list、腳布局list,所有的list單獨計數(shù)

內(nèi)部:對position進行調(diào)整,這里需要耐心調(diào)整position

package com.anew.recyclerviewall;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
/**
 * Created by a on 2017/1/7.
 */
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
  private Context context;
  private List<String> mHeadList;
  private List<String> mBodyList;
  private List<String> mFootList;
  private static final int HEAD_TYPE = 1;
  private static final int BODY_TYPE = 2;
  private static final int FOOT_TYPE = 3;
  public MyAdapter(Context context, List<String> headList, List<String> bodyList, List<String> footList) {
    this.context = context;
    this.mHeadList = headList;
    this.mBodyList = bodyList;
    this.mFootList = footList;
  }
  //  ★ 1. 定義規(guī)則,什么情況,是哪一種ViewType
  @Override
  public int getItemViewType(int position) {
    int viewType = -1;
    if (position < getHeadCount()) {
      viewType = HEAD_TYPE;
    } else if (position > getHeadCount() + getBodyCount() - 1) {
      //這里最后要減去1,慢慢地去數(shù)
      viewType = FOOT_TYPE;
    } else {
      viewType = BODY_TYPE;
    }
    return viewType;
  }
  @Override
  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View view = null;
    //  ★ 2. 根據(jù)viewType來確定加載那個布局,返回哪一個ViewHolder
    switch (viewType) {
      case HEAD_TYPE:
        view = inflater.inflate(R.layout.item_head, parent, false);
        return new HeadHolder(view);
      case BODY_TYPE:
        view = inflater.inflate(R.layout.item_body, parent, false);
        return new BodyHolder(view);
      case FOOT_TYPE:
        view = inflater.inflate(R.layout.item_foot, parent, false);
        return new FootHolder(view);
    }
    return null;
  }
  @Override
  public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
// ★ 3. 根據(jù)holder是哪一個ViewHolder的實例,來確定操作哪一個布局的UI
    if (holder instanceof HeadHolder) {
      HeadHolder headHolder = (HeadHolder) holder;
      headHolder.mTvHead.setText(mHeadList.get(position) + "");
      headHolder.mTvHead.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          addData();
        }
      });
    }
    if (holder instanceof BodyHolder) {
      final BodyHolder bodyHolder = (BodyHolder) holder;
      bodyHolder.mTvBody.setText(mBodyList.get(position - getHeadCount()) + "");
      bodyHolder.mTvBody.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          removeData(bodyHolder.getAdapterPosition());
        }
      });
    }
    if (holder instanceof FootHolder) {
      final FootHolder footHolder = (FootHolder) holder;
      footHolder.mTvFoot.setText(mFootList.get(position - getHeadCount() - getBodyCount()) + "");
      footHolder.mTvFoot.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          Toast.makeText(context, footHolder.getAdapterPosition() + "",
              Toast.LENGTH_SHORT).show();
        }
      });
    }
  }
  @Override
  public int getItemCount() {
    return getHeadCount() + getBodyCount() + getFootCount();
  }
  private int getFootCount() {
    return mFootList.size();
  }
  private int getBodyCount() {
    return mBodyList.size();
  }
  private int getHeadCount() {
    return mHeadList.size();
  }
  public void addData(int position) {
    mBodyList.add(position, "Insert One");
//    ★★★★ 使用notifyItemInserted去更新數(shù)據(jù),否則沒有動畫效果
    notifyItemInserted(position);
  }
  /**
   * 增加bodyList條目
   */
  public void addData() {
    mBodyList.add("1");
    mBodyList.add("2");
    mBodyList.add("3");
//    ★★★★ 使用notifyItemInserted去更新數(shù)據(jù),否則沒有動畫效果
    notifyItemRangeInserted(0, 3);
  }
  /**
   * 刪除bodyList條目
   */
  public void removeData(int position) {
//    經(jīng)測試瘋狂點擊刪除條目,會產(chǎn)生負數(shù),導(dǎo)致越界異常
    if (!(position - getHeadCount() < 0)) {
//    ★★★★ 防止角標(biāo)越界異常,要減去頭布局數(shù)量,總之去數(shù)數(shù)吧
      mBodyList.remove(position - getHeadCount());
      notifyItemRemoved(position);
    }
  }
  /**
   * 頭布局Holder
   */
  static class HeadHolder extends RecyclerView.ViewHolder {
    private TextView mTvHead;
    public HeadHolder(View itemView) {
      super(itemView);
      mTvHead = (TextView) itemView.findViewById(R.id.tv_head);
    }
  }
  /**
   * 身體布局Holder
   */
  static class BodyHolder extends RecyclerView.ViewHolder {
    private TextView mTvBody;
    public BodyHolder(View itemView) {
      super(itemView);
      mTvBody = (TextView) itemView.findViewById(R.id.tv_body);
    }
  }
  /**
   * 腳布局Holder
   */
  static class FootHolder extends RecyclerView.ViewHolder {
    private TextView mTvFoot;
    public FootHolder(View itemView) {
      super(itemView);
      mTvFoot = (TextView) itemView.findViewById(R.id.tv_foot);
    }
  }
}

item_body

item_head和item_foot類似就不粘貼了

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/ll"
       android:layout_width="match_parent"
       android:layout_height="40dp"
       android:layout_marginRight="11px"
       android:layout_marginBottom="11px"
       android:background="@color/colorPrimary"
       android:orientation="vertical">
  <TextView
    android:id="@+id/tv_body"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:textSize="17sp"
    android:layout_gravity="center"
    android:text="Hello World!"/>
</LinearLayout>

以上所述是小編給大家介紹的Android 中RecyclerView多種item布局的寫法(頭布局+腳布局),希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!

相關(guān)文章

  • 獲取Android系統(tǒng)唯一識別碼的方法

    獲取Android系統(tǒng)唯一識別碼的方法

    這篇文章主要介紹了獲取Android系統(tǒng)唯一識別碼的方法,涉及通過編程獲取Android系統(tǒng)硬件設(shè)備標(biāo)識的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Android自定義鬧鐘功能

    Android自定義鬧鐘功能

    這篇文章主要為大家詳細介紹了Android自定義鬧鐘功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android12四大組件之Activity生命周期變化詳解

    Android12四大組件之Activity生命周期變化詳解

    雖然說我們天天都在使用Activity,但是你真的對Activity的生命機制完全了解了嗎?Activity的生命周期方法只有七個,但是其實那只是默認的情況。也就是說在其他情況下,Activity的生命周期可能不會是按照我們以前所知道的流程,本章著重講解Activity的生命周期變化
    2022-07-07
  • android socket聊天室功能實現(xiàn)

    android socket聊天室功能實現(xiàn)

    這篇文章主要為大家詳細介紹了android socket聊天室功能實現(xiàn)方法,不單純是聊天室,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android 讀取文件內(nèi)容實現(xiàn)方法總結(jié)

    Android 讀取文件內(nèi)容實現(xiàn)方法總結(jié)

    這篇文章主要介紹了Android 讀取文件內(nèi)容實現(xiàn)方法的相關(guān)資料,這里提供了幾種方法,大家可以選擇使用,需要的朋友可以參考下
    2016-10-10
  • Android下拉刷新與輪播圖滑動沖突解決方案

    Android下拉刷新與輪播圖滑動沖突解決方案

    這篇文章主要介紹了Android實現(xiàn)下拉刷新與輪播圖沖突解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下。隨小編過來看看吧
    2017-02-02
  • Android TV開發(fā):使用RecycleView實現(xiàn)橫向的Listview并響應(yīng)點擊事件的代碼

    Android TV開發(fā):使用RecycleView實現(xiàn)橫向的Listview并響應(yīng)點擊事件的代碼

    這篇文章主要介紹了Android TV開發(fā):使用RecycleView實現(xiàn)橫向的Listview并響應(yīng)點擊事件的代碼,具有很好的參考價值,希望對大家有所幫助,一起跟隨小編過來看看吧
    2018-05-05
  • Android登錄的簡單處理

    Android登錄的簡單處理

    這篇文章主要介紹了Android登錄的簡單處理,一個簡易的Demo模擬登錄情況和未登錄情況下的界面跳轉(zhuǎn)處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android 畫一個太極圖實例代碼

    Android 畫一個太極圖實例代碼

    這篇文章主要介紹了Android 畫一個太極圖實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Android顏色處理SweepGradient掃描及梯度渲染示例

    Android顏色處理SweepGradient掃描及梯度渲染示例

    這篇文章主要為大家介紹了Android顏色處理SweepGradient掃描渲染及梯度渲染示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論

黄浦区| 西和县| 咸阳市| 安福县| 游戏| 呼伦贝尔市| 万源市| 军事| 定陶县| 贞丰县| 乳山市| 武城县| 大足县| 汝阳县| 建瓯市| 修武县| 元朗区| 滨海县| 行唐县| 磴口县| 黎平县| 阳泉市| 宁海县| 武胜县| 耿马| 永平县| 达尔| 民权县| 洞口县| 苗栗县| 积石山| 赤城县| 宝应县| 民和| 安乡县| 额敏县| 巴塘县| 合阳县| 密云县| 南投市| 苏尼特右旗|