RecyclerView刷新和多布局

本章主要讲述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);
    }
}


猜你喜欢

转载自blog.csdn.net/qq_14931305/article/details/80421887