导依赖包
implementation 'com.jcodecraeer:xrecyclerview:1.5.9'
//glide图片框架
implementation 'com.github.bumptech.glide:glide:3.7.0'
项目build的Android里加上
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '28.0.0'//根据你的底下appcompat-v7版本
}
}
}
}
adapter
package com.bawei.pulltorefreshrecyclerview;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import java.util.List;
/**
* 集成需要需要改成RecyclerView.ViewHolder,而不是adapter中的内部类
*/
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<User> list;
/**
* 分类
*/
private static final int TYPE_RED = 0;
private static final int TYPE_GREEN = TYPE_RED + 1;
public interface OnItemClickListener {
void onItemClick(View itemView, int position);
}
public interface OnLongItemClickListener {
void onItemLongClick(View itemView, int position);
}
private OnItemClickListener clickListener;
private OnLongItemClickListener longItemClickListener;
public void setOnItemClickListener(OnItemClickListener clickListener) {
this.clickListener = clickListener;
}
public void setOnLongItemClickListener(OnLongItemClickListener longItemClickListener) {
this.longItemClickListener = longItemClickListener;
}
public RecyclerAdapter(Context context, List<User> list) {
this.context = context;
this.list = list;
}
/**
* 创建viewHolder
* @param parent
* @param viewType
* @return
*/
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
RecyclerView.ViewHolder holder = null;
//根据类型的不同,加载不同的布局,返回不同的holder
if (viewType == TYPE_RED) {
View v = View.inflate(context, R.layout.item_recycle_linear_red, null);
holder = new ViewHolderRed(v);
} else {
View v = View.inflate(context, R.layout.item_recycle_linear_green, null);
holder = new ViewHolderGreen(v);
}
return holder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
//根据角标,调用getItemViewType方法,取出类型
int type = getItemViewType(position);
switch (type) {
case TYPE_RED:
ViewHolderRed holderRed = (ViewHolderRed) holder;
Glide.with(context).load(R.mipmap.ic_launcher).into(holderRed.img);
holderRed.textView.setText(list.get(position).getName());
break;
case TYPE_GREEN:
ViewHolderGreen holderGreen = (ViewHolderGreen) holder;
Glide.with(context).load(R.mipmap.ic_launcher).into(holderGreen.img);
holderGreen.textView.setText(list.get(position).getName());
break;
default:
break;
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clickListener != null) {
clickListener.onItemClick(v, position);
}
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (longItemClickListener != null) {
longItemClickListener.onItemLongClick(v, position);
}
return true;
}
});
}
@Override
public int getItemCount() {
return list.size();
}
/**
* 根据角标,由我们自己判断每一条的类型
* 返回的int 就是onCreateViewHolder中的viewType
* @param position
* @return
*/
@Override
public int getItemViewType(int position) {
User user = list.get(position);
if (user.getType() == TYPE_RED) {
return TYPE_RED;
} else {
return TYPE_GREEN;
}
}
/**
* 有几个条目,写几个viewHolder,继承RecyclerView.ViewHolder
*/
class ViewHolderRed extends RecyclerView.ViewHolder {
private ImageView img;
private TextView textView;
public ViewHolderRed(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv_recycle_linear);
img = itemView.findViewById(R.id.iv_recycle_linear);
}
}
class ViewHolderGreen extends RecyclerView.ViewHolder {
private ImageView img;
private TextView textView;
public ViewHolderGreen(View itemView) {
super(itemView);
// 类似于BaseAdapter中的holder.txtTitle = convertView.findViewById()
textView = itemView.findViewById(R.id.tv_recycle_linear);
img = itemView.findViewById(R.id.iv_recycle_linear);
}
}
}
mainactivity
package com.bawei.pulltorefreshrecyclerview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.util.Log;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
int mIndex = 0;
RecyclerAdapter mAdapter;
XRecyclerView mXRecyclerView;
List<User> userList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
mXRecyclerView = findViewById(R.id.xRecyclerView);
//管理器不变
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mXRecyclerView.setLayoutManager(layoutManager);
addFakeData();
//adapter一样用
mAdapter = new RecyclerAdapter(this, userList);
mXRecyclerView.setAdapter(mAdapter);
//是否开启下拉刷新功能
mXRecyclerView.setPullRefreshEnabled(true);
//是否开启上拉加载功能
mXRecyclerView.setLoadingMoreEnabled(true);
//设置刷新回调
mXRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {
Log.i("dj", "onRefresh");
userList.clear();
mIndex = 0;
addFakeData();
//刷新完毕执行
mXRecyclerView.refreshComplete();
}
@Override
public void onLoadMore() {
Log.i("dj", "onLoadMore");
addFakeData();
//加载完毕执行
mXRecyclerView.loadMoreComplete();
}
});
}
/**
* 自己写的假数据
*/
private void addFakeData(){
for (int j = mIndex ; mIndex < j + 20; mIndex++){
User user = new User();
user.setType(mIndex%2);
user.setName("name " + mIndex);
userList.add(user);
}
}
}
xml
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:id="@+id/xRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>