android控件使用---recycleview自定义上拉加载,和加载多个布局及加入动画

这里我们都会遇到刷新加载的问题,我今天就遇到了,而且需要加载多个布局,和载入动画所以用recycleview。这里recycleview的下拉刷新没什么说的用SwipeRefreshLayout,我之前写过这个SwipeRefreshLayout 你们直接看那篇文章就好了,今天我们主要说下我们要实现的加载,多个布局,以及动画效果。
首先说下多个布局

  //这里返回不同时候的xml的类型
    @Override
    public int getItemViewType(int position) {

        if (position == 0) {
            return TYPE_FIRST;
        }
        if (position == getItemCount() - 1) {
            return TYPE_FOOT;
        } else {
            return TYPE_LIST;
        }
    }

    @Override
    public int getItemCount() {
        return list.size() + 2;
    }

这里来判断是什么时候用什么布局因为public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)这个type就是根据你的getItemViewType(int position)方法来的
然后我们做的就是写多个viewholder然后在onBindViewHolder里面进行判断

 @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        if (holder instanceof Item1ViewHolder) {
        } else if (holder instanceof Item2ViewHolder) {
            ((Item2ViewHolder) holder).mTextView.setText(list.get(position - 1));
        } else if (holder instanceof FootViewHolder) {
            FootViewHolder footViewHolder = (FootViewHolder) holder;
            switch (load_more_status) {
                case LOADING_MORE:
                    footViewHolder.foot_view_item_tv.setText("Loading...");
                    break;
                case NO_DATA:
                    footViewHolder.foot_view_item_tv.setText("没有可加载数据...");
                    footViewHolder.progressbar.setVisibility(View.GONE);
                    break;
            }
        }
        //这些是控制布局的,因为recycleview不提供
        ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
        layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
        holder.itemView.setLayoutParams(layoutParams);

        runEnterAnimatin(holder.itemView);
    }

好了下面说加载了首先在适配器里面做准备,我们需要加入底部,这个很简单了上面都有
主要是加载数据的方法

  public void addMoreItem(List<String> newDatas) {
        list.addAll(newDatas);
        notifyDataSetChanged();
    }

还有改变底部导航的样式

  public void changeMoreStatus(int status) {
        load_more_status = status;
    }

上面代码是传状态 根据状态来改变样式

好了下面说下监听部分我们需要继承RecyclerView.OnScrollListener

 myrecycle.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (xianzhi<2){
                    List<String> newDatas = new ArrayList<String>();
                    for (int i = 0; i< 5; i++) {
                        int index = i +1;
                        newDatas.add("more item" + index);
                    }
                    recyclerViewAdapter.addMoreItem(newDatas);
                    recyclerViewAdapter.changeMoreStatus(RecyclerViewAdapter.LOADING_MORE);
                    xianzhi++;
                }else {
                    recyclerViewAdapter.changeMoreStatus(RecyclerViewAdapter.NO_DATA);
                    recyclerViewAdapter.notifyDataSetChanged();
                }

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

下面给出activity代码

package com.example.admin.wheelview.recycleview;

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;

import com.example.admin.wheelview.R;

import java.util.ArrayList;
import java.util.List;



public  class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener{
    RecyclerViewAdapter recyclerViewAdapter;
    RecyclerView myrecycle;
    private LinearLayoutManager linearLayoutManager;
    int lastVisibleItem;
    int xianzhi=0;
    List<String> list;
    private SwipeRefreshLayout mSwipeLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        list=new ArrayList<String>();
        getDate();
        myrecycle= (RecyclerView) findViewById(R.id.myrecycle);

        //设置适配
        linearLayoutManager=new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(OrientationHelper.VERTICAL);
        myrecycle.setLayoutManager(linearLayoutManager);
        recyclerViewAdapter=new RecyclerViewAdapter(this,list);
//        final RefreshFootAdapter adapter=new RefreshFootAdapter(this);
        myrecycle.setAdapter(recyclerViewAdapter);

        //添加加载监听
//        myrecycle.setOnScrollListener(new RecyclerViewListener(recyclerViewAdapter,linearLayoutManager));
        myrecycle.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (xianzhi<2){
                    List<String> newDatas = new ArrayList<String>();
                    for (int i = 0; i< 5; i++) {
                        int index = i +1;
                        newDatas.add("more item" + index);
                    }
                    recyclerViewAdapter.addMoreItem(newDatas);
                    recyclerViewAdapter.changeMoreStatus(RecyclerViewAdapter.LOADING_MORE);
                    xianzhi++;
                }else {
                    recyclerViewAdapter.changeMoreStatus(RecyclerViewAdapter.NO_DATA);
                    recyclerViewAdapter.notifyDataSetChanged();
                }

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

        mSwipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
        mSwipeLayout.setOnRefreshListener(this);
        // 设置下拉圆圈上的颜色,蓝色、绿色、橙色、红色
        mSwipeLayout.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light,
                android.R.color.holo_orange_light, android.R.color.holo_red_light);
        mSwipeLayout.setDistanceToTriggerSync(400);// 设置手指在屏幕下拉多少距离会触发下拉刷新
        mSwipeLayout.setProgressBackgroundColor(R.color.red);
        mSwipeLayout.setSize(SwipeRefreshLayout.LARGE);
    }

    public void getDate(){
        for (int i = 0; i <20 ; i++) {
            list.add("eeeeee"+i);
        }
    }
    @Override
    public void onRefresh() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                xianzhi=0;
                list.removeAll(list);
                getDate();
                recyclerViewAdapter.changeMoreStatus(RecyclerViewAdapter.LOADING_MORE);
                recyclerViewAdapter.notifyDataSetChanged();
                // 停止刷新
                mSwipeLayout.setRefreshing(false);
            }
        }, 2000); // 5秒后发送消息,停止刷新
    }
}

对了下面该介绍载入动画了其实好简单方便的
首先给出动画

  /**
     * 进入动画,从右侧进入到左侧
     */
    private void runEnterAnimatin(View itemView) {

        DisplayMetrics displayMetrics = itemView.getContext().getResources().getDisplayMetrics();

        itemView.setTranslationX(displayMetrics.widthPixels);
        itemView.animate()
                .translationX(0)
                .setStartDelay(100)
                .setInterpolator(new DecelerateInterpolator(3.f))
                .setDuration(1000)
                .start();

    }

这个只需在onBindViewHolder中调用就可以了
你可以加一些规则 就看你们自己需求了( ⊙ o ⊙ )!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值