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

来源:互联网 发布:什么是软件缺陷 编辑:程序博客网 时间:2024/04/30 21:52

这里我们都会遇到刷新加载的问题,我今天就遇到了,而且需要加载多个布局,和载入动画所以用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 ⊙ )!

0 0
原创粉丝点击