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