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
- android控件使用---recycleview自定义上拉加载,和加载多个布局及加入动画
- Android RecycleView上拉加载
- 自定义下拉刷新和上拉加载的recycleview
- android自定义下拉刷新和上拉加载控件
- Android RecycleView上拉加载BaseAdapter(二)
- RecycleView上拉加载和下拉刷新
- RecycleView 布局布局管理器 上拉加载 下拉刷新
- Android ListView 下拉刷新,上拉加载更多,带动画 自定义控件
- 【实训】自定义上拉加载下拉刷新的RecycleView
- RecycleView控件的使用(三) 实现上拉加载更多下拉刷新功能
- 自定义下拉刷新上拉加载动画
- 自定义控件-下拉刷新和上拉加载的listView
- 自定义控件实现ListView下拉刷新和上拉加载
- 使用SwipeRefreshLayout实现recycleview下拉刷新上拉加载
- RecycleView上拉加载和下拉刷新二
- SwipeRefreshLayout +RecycleView实现上拉加载更多和下拉刷新
- android ListView下拉刷新及上拉加载 (自定义ListView,可直接使用)
- 【Android实战】使用帧动画实现自定义loading加载布局
- 每日小记2017.2.22
- iOS第三方库GData的使用
- 【LeetCode 17】 Letter Combinations of a Phone Number
- Ext.js性能优化漫谈
- 布隆过滤器(BloomFilter)的实现
- android控件使用---recycleview自定义上拉加载,和加载多个布局及加入动画
- LintCode【合并区间】
- poj 2299 Ultra-QuickSort
- R资源大全
- 37. Sudoku Solver
- POJ 3215 Median of Lines 英文少
- C和C++动态分配内存
- web中的普通Java程序如何读取资源文件
- LeetCode