RecyclerView重新整理和多佈局
阿新 • • 發佈:2018-11-12
本章主要講述RecyclerView的上拉重新整理下拉載入已經多佈局等,下面請看效果圖和程式碼:
1.item_view1.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:background="#00ff00"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center"> <TextView android:id="@+id/name"android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:text="名字" android:textColor="#000000"/> <TextView android:id="@+id/sex" android:layout_width="wrap_content"android:layout_height="wrap_content" android:text="性別" android:textColor="#000000"/> </LinearLayout> </RelativeLayout>
2.item_view2.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00ff00" android:orientation="horizontal"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="horizontal"> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:text="名字" android:textColor="#000000" /> <ImageView android:id="@+id/sex" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </RelativeLayout>
3.footview.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:id="@+id/linear_load_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center"> <ProgressBar android:layout_width="30dp" android:layout_height="30dp" android:indeterminate="true" android:layout_marginRight="20dp" style="?android:attr/progressBarStyle" android:layout_centerVertical="true"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/red" android:text="正在載入..." android:singleLine="true"/> </LinearLayout> <LinearLayout android:id="@+id/linear_nothing_no_load" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="到底了" android:textColor="@color/red"/> </LinearLayout> </RelativeLayout>
4.activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.testing.recyclerviewdemo.MainActivity"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefreshLayout" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView> </android.support.v4.widget.SwipeRefreshLayout> </android.support.constraint.ConstraintLayout>
5.Myadapter:
package com.example.testing.recyclerviewdemo; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ private Context mContext; private ArrayList<UserInfo> mList; private static final int ITEM_TYPE1 = 1; private static final int ITEM_TYPE2 = 2; private static final int ITEM_TYPE3 = 3; private boolean isBottom; public MyAdapter(Context mContext, ArrayList<UserInfo> list) { this.mContext = mContext; this.mList = list; } public void setmList(ArrayList<UserInfo> list) { this.mList = list; notifyDataSetChanged(); } public void setIsBottom(boolean bottom) { isBottom = bottom; notifyDataSetChanged(); } @Override public int getItemViewType(int position) { if (position == mList.size()){ return ITEM_TYPE3; }else if (mList.get(position).getSex() == 1){//男 return ITEM_TYPE1; }else {//女 return ITEM_TYPE2; } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == ITEM_TYPE1){ View view = View.inflate(mContext,R.layout.item_view1,null); MyHolder1 holder1 =new MyHolder1(view); return holder1; }else if (viewType == ITEM_TYPE2){ View view = View.inflate(mContext,R.layout.item_view2,null); MyHolder2 holder2 =new MyHolder2(view); return holder2; }else { View view = View.inflate(mContext,R.layout.footview,null); MyHolder3 holder3 =new MyHolder3(view); return holder3; } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof MyHolder1){ ((MyHolder1)holder).name.setText(mList.get(position).getName()); ((MyHolder1)holder).sex.setText("男"); }else if (holder instanceof MyHolder2){ ((MyHolder2)holder).name.setText(mList.get(position).getName()); ((MyHolder2)holder).sex.setImageResource(R.mipmap.ic_launcher); }else if (holder instanceof MyHolder3){ if (isBottom){ ((MyHolder3) holder).linear_nothing_no_load.setVisibility(View.VISIBLE); ((MyHolder3) holder).linear_load_data.setVisibility(View.GONE); }else { ((MyHolder3) holder).linear_load_data.setVisibility(View.VISIBLE); ((MyHolder3) holder).linear_nothing_no_load.setVisibility(View.GONE); } } } @Override public int getItemCount() { return mList.size()+1; } private class MyHolder1 extends RecyclerView.ViewHolder{ private TextView name; private TextView sex; public MyHolder1(View itemView) { super(itemView); name = itemView.findViewById(R.id.name); sex = itemView.findViewById(R.id.sex); } } private class MyHolder2 extends RecyclerView.ViewHolder{ private TextView name; private ImageView sex; public MyHolder2(View itemView) { super(itemView); name = itemView.findViewById(R.id.name); sex = itemView.findViewById(R.id.sex); } } private class MyHolder3 extends RecyclerView.ViewHolder{ private LinearLayout linear_load_data; private LinearLayout linear_nothing_no_load; public MyHolder3(View itemView) { super(itemView); linear_load_data = (LinearLayout) itemView.findViewById(R.id.linear_load_data); linear_nothing_no_load = (LinearLayout) itemView.findViewById(R.id.linear_nothing_no_load); } } }
6.Activity:
package com.example.testing.recyclerviewdemo; import android.graphics.Rect; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.LinearLayout; import java.util.ArrayList; public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener{ private ArrayList<UserInfo> list; private RecyclerView mRecyclerView; private SwipeRefreshLayout mSwipeRefreshLayout; private MyAdapter myAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView =findViewById(R.id.recyclerView); mSwipeRefreshLayout =findViewById(R.id.swipeRefreshLayout); list =new ArrayList<>(); //重新整理圓圈的顏色 mSwipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.red)); mSwipeRefreshLayout.setOnRefreshListener(this); //設定item間隔 mRecyclerView.addItemDecoration(new RecyclerView.ItemDecoration() { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); outRect.top =30; } }); //垂直佈局 LinearLayoutManager layoutManager =new LinearLayoutManager(getApplicationContext()); layoutManager.setOrientation(LinearLayout.VERTICAL); mRecyclerView.setLayoutManager(layoutManager); //滾動監聽 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); // 在newState為滑到底部時 if (newState == RecyclerView.SCROLL_STATE_IDLE) { // 如果沒有隱藏footView,那麼最後一個條目的位置就比我們的getItemCount少1,自己可以算一下 RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); if (layoutManager instanceof LinearLayoutManager) { LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager; if (linearManager.findLastVisibleItemPosition()+1== myAdapter.getItemCount()) { mRecyclerView.postDelayed(new Runnable() { @Override public void run() { int size = myAdapter.getItemCount(); if (size >= 100){//到底了 myAdapter.setIsBottom(true); }else {//載入更多 for (int i=size; i<size+20; i++){ UserInfo userInfo =new UserInfo(); userInfo.setName("zhang "+i); if (i%2==0){ userInfo.setSex(1); }else { userInfo.setSex(2); } list.add(userInfo); } myAdapter.setmList(list); } } }, 500); } } } } }); for (int i=0; i<20; i++){ UserInfo userInfo =new UserInfo(); userInfo.setName("zhang "+i); if (i%2==0){ userInfo.setSex(1); }else { userInfo.setSex(2); } list.add(userInfo); } myAdapter = new MyAdapter(getApplicationContext(),list); mRecyclerView.setAdapter(myAdapter); } @Override public void onRefresh() { //下拉重新整理 mSwipeRefreshLayout.setRefreshing(true); myAdapter.setIsBottom(false); mRecyclerView.postDelayed(new Runnable() { @Override public void run() { list.clear(); for (int i=0; i<20; i++){ UserInfo userInfo =new UserInfo(); userInfo.setName("li "+i); if (i%2==0){ userInfo.setSex(1); }else { userInfo.setSex(2); } list.add(userInfo); } myAdapter.setmList(list); mSwipeRefreshLayout.setRefreshing(false); } },500); } }