SwipeRefreshLayout和RecyclerView的配合使用

第一次写博客,欢迎大家指正错误,好了进入正题吧。
最近公司项目要求一个页面效果,大概就是在ListView展示数据后:在ListView条目中有一个Button,点击该Button进行一系列的逻辑操作,然后根据该逻辑执行的结果更新该Button上的文字,本来使用ListView实现,可是最后发现实现不了,应该是我技术不到位,想着RecyclerView还没用过,就在网上找来RecyclerView的使用方法,配合SwipeRefreshLayout实现下拉刷新和上拉加载。再通过自定义的点击事件接口实现条目中Button的点击事件。其中的大部分代码是复制网上其他大神的,加上了自己的一点东西而已。
不会上传GIF图,等下我研究下,看看在楼下能不能传。
下来先看MainActivity的xml文件:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#eeeeee"
    tools:context="com.example.sunze.selectdemo.MainActivity">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/srl_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

下面是MainActivity的代码:


package com.example.sunze.selectdemo;

import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.RequiresApi;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private List<String> mDatas = new ArrayList<>();
    private ArrayList<Integer> images = new ArrayList<>(Arrays.asList(R.mipmap.pic01,R.mipmap.pic02,R.mipmap.pic03,R.mipmap.pic04,R.mipmap.pic05,R.mipmap.pic06,
            R.mipmap.pic07,R.mipmap.pic08,R.mipmap.pic09,R.mipmap.pic10,R.mipmap.pic11,R.mipmap.pic12,R.mipmap.pic01,R.mipmap.pic02,R.mipmap.pic03,R.mipmap.pic04,R.mipmap.pic05,R.mipmap.pic06,
            R.mipmap.pic07,R.mipmap.pic08,R.mipmap.pic09,R.mipmap.pic10,R.mipmap.pic11,R.mipmap.pic12));
    private SwipeRefreshLayout mSwipeFreshLyout;

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initSwipeRefreshLayout();
        initView();
        initData();

    }

    private void initData() {
        for (int i = 0 ; i < 24 ; i++ ){
            mDatas.add("测试的数据" + i);
        }
    }
    private void initSwipeRefreshLayout() {
        mSwipeFreshLyout = (SwipeRefreshLayout) findViewById(R.id.srl_main);
        mSwipeFreshLyout.setEnabled(false);
        //设置刷新时动画的颜色,可以设置4个
        mSwipeFreshLyout.setColorSchemeResources( android.R.color.holo_orange_light);
        mSwipeFreshLyout.setSize(SwipeRefreshLayout.DEFAULT);//设置下拉刷新的进度圈大小
        mSwipeFreshLyout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {//设置进度圈的监听事件
            @Override
            public void onRefresh() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mSwipeFreshLyout.setRefreshing(false);
                    }
                }, 3000);
            }
        });
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    private void initView() {
        mRecyclerView = (RecyclerView) findViewById(R.id.rv_recyclerview);
        mRecyclerView.setHasFixedSize(true);//布局大小一致

        //grid布局,数字是指定显示几列
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this,2);

        //线性布局,可以指定方向
        final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

        //设置布局管理器
        mRecyclerView.setLayoutManager(gridLayoutManager);
        //设置adapter
        final MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(MainActivity.this,mDatas,images);
        mRecyclerView.setAdapter(adapter);
        //设置Item增加、移除动画
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        //添加分割线
        //mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL_LIST));

        //监听RecyclerView的滑动状态,判断是否滑动到顶部和底部
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                //当前RecyclerView显示出来的最后一个的item的position
                int lastPosition = -1;
                int firstPosition = -1;

                //当前状态为停止滑动状态SCROLL_STATE_IDLE时
                if(newState == RecyclerView.SCROLL_STATE_IDLE){
                    RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
                    if(layoutManager instanceof GridLayoutManager){
                        //通过LayoutManager找到当前显示的最后的item的position
                        lastPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();
                        firstPosition = ((GridLayoutManager) layoutManager).findFirstVisibleItemPosition();
                    }else if(layoutManager instanceof LinearLayoutManager){
                        lastPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
                        firstPosition = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();
                    }else if(layoutManager instanceof StaggeredGridLayoutManager){
                        //因为StaggeredGridLayoutManager的特殊性可能导致最后显示的item存在多个,所以这里取到的是一个数组
                        //得到这个数组后再取到数组中position值最大的那个就是最后显示的position值了
                        int[] lastPositions = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()];
                        ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(lastPositions);
                        lastPosition = findMax(lastPositions);
                    }

                    //时判断界面显示的最后item的position是否等于itemCount总数-1也就是最后一个item的position,
                    // 并且所有的数据大于一个页面展示的数据,要不然会出现bug(在一屏中已显示完所有的数据,这个方法会一直执行)
                    if(lastPosition == recyclerView.getLayoutManager().getItemCount()-1 && images.size() >= recyclerView.getLayoutManager().getItemCount()){
                        Toast.makeText(MainActivity.this, "滑动到底了", Toast.LENGTH_SHORT).show();
                        mSwipeFreshLyout.setEnabled(false);
                    }
                    //如果第一个条目的索引是0就是滑动到顶部了
                    if (firstPosition == 0){
                        mSwipeFreshLyout.setEnabled(true);
                        Toast.makeText(MainActivity.this, "滑动顶了", Toast.LENGTH_SHORT).show();
                    }

                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
            }
        });

        adapter.setItemOnClickListener(new ItemClickListener() {
            @Override
            public void onItemClick(View view, int postion) {
                Toast.makeText(MainActivity.this,"你点击了item。"+ postion,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemLongClick(View view, int postion) {
                Toast.makeText(MainActivity.this,"你长按了item。"+ postion,Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemSubViewClick(View view, int postion) {
                //把数据集合中的数据替换掉,然后刷新adapter
                Collections.replaceAll(images,images.get(postion),R.mipmap.ic_launcher);
                Collections.replaceAll(mDatas,mDatas.get(postion),"替换");
                adapter.notifyDataSetChanged();
                Toast.makeText(MainActivity.this,"你点击了图片。" + postion,Toast.LENGTH_SHORT).show();
            }
        });

    }

    //找到数组中的最大值
    private int findMax(int[] lastPositions) {
        int max = lastPositions[0];
        for (int value : lastPositions) {
            if (value > max) {
                max = value;
            }
        }
        return max;
    }
}

下面是RecyclerView的适配器:


package com.example.sunze.selectdemo;

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.ImageView;
import android.widget.TextView;

import java.util.List;

/**
 * Created by sunze on 2016/12/15.
 */

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {

    private Context mContext;
    private List<String> mDatas;
    private List<Integer> images;
    private ItemClickListener itemOnClickListener;

    public MyRecyclerViewAdapter(Context mContext, List<String> mDatas , List<Integer> images) {
        this.mContext = mContext;
        this.mDatas = mDatas;
        this.images = images;
    }

    /**
     * 设置item的点击回掉
     * @param itemOnClickListener 自定义的点击事件的接口
     */
    public void setItemOnClickListener(ItemClickListener itemOnClickListener){
        this.itemOnClickListener = itemOnClickListener;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //创建ViewHolder的对象,加载item布局,并返回
        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.recyclerview_image_item,parent,false));
        return holder;
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        //给item布局中的空间填充数据
        holder.imageView.setBackgroundResource(images.get(position));
        holder.textView.setText(mDatas.get(position));
        //为image添加监听回掉:这里可以为你想要的任何条目中的控件设置点击监听回掉
        holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (itemOnClickListener != null){
                    itemOnClickListener.onItemSubViewClick(holder.imageView,position);
                }
            }
        });
    }


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

    public class MyViewHolder extends RecyclerView.ViewHolder {
        private final ImageView imageView;
        private final TextView textView;

        public MyViewHolder(final View itemView) {
            super(itemView);
            imageView = (ImageView) itemView.findViewById(R.id.iv_image);
            textView = (TextView) itemView.findViewById(R.id.tv_textview);
            //为item添加普通点击回掉
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (itemOnClickListener != null){
                        itemOnClickListener.onItemClick(itemView,getPosition());
                    }
                }
            });
            //为item添加长按回掉
            itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    if (itemOnClickListener != null){
                        itemOnClickListener.onItemLongClick(itemView,getPosition());
                    }
                    return true;
                }
            });
        }
    }
}

最后是自定义的条目点击事件的接口:


package com.example.sunze.selectdemo;

import android.view.View;

/**
 * Created by sunze on 2016/12/15.
 */

public interface ItemClickListener {
    /**
     * Item 普通点击
     */
    public void onItemClick(View view, int postion);

    /**
     * Item 长按
     */
    public void onItemLongClick(View view, int postion);

    /**
     * Item 内部View点击
     */
    public void onItemSubViewClick(View view, int postion);
}

最后附上代码地址:点我下载

发布了6 篇原创文章 · 获赞 1 · 访问量 445

猜你喜欢

转载自blog.csdn.net/qq_35809004/article/details/53728217