Android SwipeRefreshLayout和RecyclerView 使用实现刷新数据

  之前写刷新数据的时候都会使用自定义的控件实现,现在Google给我们提供了更加方便的,刚写完,感觉还挺好看的,希望读到这篇文章的你能够喜欢。
SwipeRefreshLayout 
简介
SwipeRefreshLayout组件只接受一个子组件:即需要刷新的那个组件。它使用一个侦听机制来通知拥有该组件的监听器有刷新事件发生,换句话说我们的Activity必须实现通知的接口。该Activity负责处理事件刷新和刷新相应的视图。一旦监听者接收到该事件,就决定了刷新过程中应处理的地方。如果要展示一个“刷新动画”,它必须调用setRefrshing(true),否则取消动画就调用setRefreshing(false)。
RecyclerView
简介
RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集。
废话不多说了,直接上代码:

activity_recycler.xml布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#cccccc"
    android:orientation="vertical">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/srl_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical" />
    </android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>

RecyclerActivity 的主界面

public class RecyclerActivity extends Activity {

    private String TAG = "com.lv";
    private int firstVisibleItem;
    private int totalItemCount;
    private boolean flag = false;
    //屏幕中最后一个可见子项的position
    private int lastVisibleItemPosition;
    //声明 SwipeRefreshLayout
    private SwipeRefreshLayout mSwipeRefreshLayout;
    //声明 RecyclerView
    private RecyclerView mRecyclerview;
    //声明 LinearLayoutManager
    private LinearLayoutManager mLayoutManager;
    //声明 adapter
    private SampleAdapter adapter;
    //假数据
    private List<ItemModel> list;
    //Handler 更新ui
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            for (int k = 0; k < 2; k++) {
                ItemModel mitem = new ItemModel();
                mitem.setTitle("用户服务型软件" + k);
                mitem.setContent("新闻新闻新闻新闻新闻新闻新闻新闻新闻新闻");
                list.add(mitem);
            }
            adapter.notifyDataSetChanged();
            mSwipeRefreshLayout.setRefreshing(false);

        }
    };



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler);
        mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.srl_title);
        mRecyclerview = (RecyclerView) findViewById(R.id.rv_list);
        list = new ArrayList<>();
        mSwipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.color1),
                getResources().getColor(R.color.color2), getResources().getColor(R.color.color3)
                , getResources().getColor(R.color.color4));

        // 这句话是为了,第一次进入页面的时候显示加载进度条
        mSwipeRefreshLayout.setRefreshing(true);

        mRecyclerview.addOnScrollListener(new OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);

                if (newState == RecyclerView.SCROLL_STATE_IDLE
                        && lastVisibleItemPosition == (totalItemCount - 1)) {
                    Log.e(TAG, "1111");
                    mSwipeRefreshLayout.setRefreshing(true);
                    handler.sendEmptyMessageDelayed(0, 1000);
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                lastVisibleItemPosition = mLayoutManager.findLastVisibleItemPosition();
                firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition();
                totalItemCount = adapter.getItemCount();

                if (firstVisibleItem + lastVisibleItemPosition == totalItemCount && !flag) {
                    flag = true;
                } else {
                    flag = false;
                }

            }
        });


        for (int k = 0; k < 3; k++) {
            ItemModel mitem = new ItemModel();
            mitem.setTitle("新闻新闻" + k);
            mitem.setContent("新闻新闻新闻新闻新闻新闻新闻新闻");
            list.add(mitem);
        }

        mRecyclerview.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(this);

        mRecyclerview.setLayoutManager(mLayoutManager);
        mRecyclerview.setItemAnimator(new DefaultItemAnimator());

        adapter = new SampleAdapter(RecyclerActivity.this, list);

        mRecyclerview.setAdapter(adapter);
        handler.sendEmptyMessageDelayed(0, 1000);
    }


}

adapter 的代码
/**
* Created by mac on 16/11/12.
*/

public class SampleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    private List<ItemModel> list;

//    enum Type{
//        TYPE_ITEM ,TYPE_FOOTER
//    }

    private static final int TYPE_ITEM = 0;
    private static final int TYPE_FOOTER = 1;


    public SampleAdapter(Context context, List<ItemModel> list) {
        this.context = context;
        this.list = list;

    }

    /**
     * 创建
     *
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_ITEM) {
            View view = LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.list_item_text, null);
            view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT,
                    RecyclerView.LayoutParams.WRAP_CONTENT));
            return new ItemViewHolder(view);
        } else if (viewType == TYPE_FOOTER) {
            // type == TYPE_FOOTER 返回footerView
            View view = LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.footerview, null);
            view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT,
                    RecyclerView.LayoutParams.WRAP_CONTENT));
            return new FooterViewHolder(view);
        }
        return null;
    }

    /**
     * 绑定Viewholder 数据
     *
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof ItemViewHolder) {

            ((ItemViewHolder) holder).mtitle.setText(String.valueOf(list
                    .get(position).getTitle()));
            ((ItemViewHolder) holder).mcontent.setText(String.valueOf(list
                    .get(position).getContent()));

        }
    }

    /**
     * 每个item的类型
     *
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        // 最后一个item设置为footerView
        if (position + 1 == getItemCount()) {

            return TYPE_FOOTER;
        } else {

            return TYPE_ITEM;
        }
    }

    /**
     * 显示的item的数量
     *
     * @return
     */
    @Override
    public int getItemCount() {
        return list.size() + 1;
    }

    /**
     * 底部布局
     */
    class FooterViewHolder extends RecyclerView.ViewHolder {

        public FooterViewHolder(View view) {
            super(view);
        }
    }

    /**
     * 每个Item 显示的内容
     */
    class ItemViewHolder extends RecyclerView.ViewHolder {
        TextView mtitle, mcontent;

        public ItemViewHolder(View view) {
            super(view);
            mtitle = (TextView) view.findViewById(R.id.tv_title);
            mcontent = (TextView) view.findViewById(R.id.tv_content);
        }
    }
}

list_item_text.xml 每个item的布局

<?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:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:background="@drawable/text_cirl"
        android:orientation="horizontal"
        android:padding="3dp">


        <ImageView
            android:id="@+id/iv_img"
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:padding="2dp"
            android:src="@mipmap/ic_launcher" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:orientation="vertical"
            android:padding="2dp">

            <TextView
                android:id="@+id/tv_title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:ellipsize="end"
                android:lines="1"
                android:textSize="18sp"
                android:textStyle="bold"
                tools:text="新闻的标题部分" />

            <TextView
                android:id="@+id/tv_content"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="3dp"
                android:ellipsize="end"
                android:lines="1"
                android:textSize="15sp"
                android:textStyle="normal"
                tools:text="新闻的主体内容部分新闻的主体内容部分新闻的主体内容部分新闻的主体内容部分" />
        </LinearLayout>
    </LinearLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="#cccc" /> </LinearLayout>

另外我用的是android studio 2.2 所以在使用的时候在gradle中配置下:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.0'
    compile 'com.android.support:recyclerview-v7:23.3.0'
    testCompile 'junit:junit:4.12'
}
以上就是我弄的刷新数据,有兴趣的可以试试,这里面有隐藏的bug,大家可以自己发现,自己改动下吧!感兴趣的同学可以添加下我的微信 13792763023 我的微信号~ 欢迎大家一起讨论,共同成长~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Harry Potter%

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值