Android 中RecyclerView多種item布局的寫法(頭布局+腳布局)
RecyclerView多個item布局的寫法(頭布局+腳布局)
上圖
下載源碼
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); // 使用默認(rèn)的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)生負(fù)數(shù),導(dǎo)致越界異常 if (!(position - getHeadCount() < 0)) { // ★★★★ 防止角標(biāo)越界異常,要減去頭布局?jǐn)?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ù)大家的!
- Android RecyclerView滑動刪除和拖動排序
- Android RecyclerView item選中放大被遮擋問題詳解
- Android RecyclerView實現(xiàn)多種item布局的方法
- Android使用CardView作為RecyclerView的Item并實現(xiàn)拖拽和左滑刪除
- Android中RecyclerView實現(xiàn)Item添加和刪除的代碼示例
- Android中RecyclerView的item寬高問題詳解
- Android RecyclerView顯示Item布局不一致解決辦法
- Android RecyclerView的Item點擊事件實現(xiàn)整理
- Android RecyclerView自由拖動item的實現(xiàn)代碼
相關(guān)文章
Android RecyclerView打造懸浮效果的實現(xiàn)代碼
本篇文章主要介紹了Android RecyclerView打造懸浮效果的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10Kotlin數(shù)據(jù)存儲方式全面總結(jié)講解
在開發(fā)過程中,數(shù)據(jù)存取是較為頻繁的,今天我們來了解下android幾種常見的數(shù)據(jù)存取方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-12-12Android ViewPager實現(xiàn)動畫切換效果
這篇文章主要為大家詳細(xì)介紹了Android ViewPager實現(xiàn)動畫切換效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01Android多功能時鐘開發(fā)案例(基礎(chǔ)篇)
這篇文章主要為大家詳細(xì)介紹了Android多功能時鐘開發(fā)案例的基礎(chǔ)知識,為開發(fā)Android時鐘打下基礎(chǔ),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05Android自定義view實現(xiàn)雪花特效實例代碼
實現(xiàn)雪花的效果其實也可以通過自定義View的方式來實現(xiàn)的,而且操作上也相對簡單一些,下面這篇文章主要給大家介紹了關(guān)于Android自定義view實現(xiàn)雪花特效的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12