依赖
implementation 'com.jcodecraeer:xrecyclerview:1.5.9'
implementation 'com.android.support:recyclerview-v7:28.0.0'
图片加载依赖
implementation 'com.github.bumptech.glide:glide:4.8.0'
Activity
public class ShoppingActivity extends AppCompatActivity implements
XRecyclerView.LoadingListener, DataCall<List<Goods>>{
private XRecyclerView xRecyclerView;
private GoodsListAdapter goodsListAdapter;
private GoodsListPresenter goodsListPresenter = new GoodsListPresenter(this);
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shopping);
//获取控件
xRecyclerView = findViewById(R.id.rv);
xRecyclerView.setLoadingListener(this);
//创建StaggeredGridLayoutManager
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
xRecyclerView.setLayoutManager(staggeredGridLayoutManager);
//创建适配器
goodsListAdapter = new GoodsListAdapter(ShoppingActivity.this);
xRecyclerView.setAdapter(goodsListAdapter);
//加载数据
xRecyclerView.refresh();
}
@Override
public void onRefresh() {
goodsListPresenter.request(true);
}
@Override
public void onLoadMore() {
goodsListPresenter.request(false);
}
@Override
public void success(List<Goods> data) {
xRecyclerView.refreshComplete();
xRecyclerView.loadMoreComplete();
if (goodsListPresenter.isResresh()) {
goodsListAdapter.clearList();
}
goodsListAdapter.addAll(data);
goodsListAdapter.notifyDataSetChanged();
}
@Override
public void fail(User user) {
Toast.makeText(ShoppingActivity.this, user.getCode() + " " + user.getMsg(),
Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
goodsListPresenter.unBindCall();//防止内存泄漏
}
}
Presenter(P层)
public class GoodsListPresenter extends BasePresenter {
private int page = 1;
private boolean isRefresh = true;
public GoodsListPresenter(DataCall dataCall) {
super(dataCall);
}
@Override
protected User getData(Object... args) {
isRefresh = (boolean) args[0];//是否需要刷新
if (isRefresh) {
page = 1;
}else {
page++;
}
User user = GoodsListModel.goodsList(page+"");
return user;
}
public boolean isResresh() {
return isRefresh;
}
}
抽象类
public abstract class BasePresenter {
DataCall dataCall;
public BasePresenter(DataCall dataCall) {
this.dataCall = dataCall;
}
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
User user = (User)msg.obj;
if (user.getCode().equals("0")) {
dataCall.success(user.getData());
} else {
dataCall.fail(user);
}
}
};
/**
* activity或者fragment只需关心request方法
* request调用抽象方法useModel()方法
*/
public void request(final Object... args) {
new Thread(new Runnable() {
@Override
public void run() {
Message message = mHandler.obtainMessage();
message.obj = getData(args);
mHandler.sendMessage(message);
}
}).start();
}
protected abstract Object getData(Object...args);
public void unBindCall(){
this.dataCall = null;
}
}
Model(M层)
public class GoodsListModel {
public static User goodsList(String page) {
String resultString = Utils.postForm("http://www.zhaoapi.cn/product/getProducts",
new String[]{"pscid","page"},new String[]{"1",page});
Gson gson = new Gson();
Type type = new TypeToken<User<List<Goods>>>(){}.getType();
User user = gson.fromJson(resultString, type);
return user;
}
}
View (V层)
import com.zhao.demo.bean.User;
public interface DataCall<T> {
void success(T data);
void fail(User user);
}
Adapter(适配器)
public class GoodsListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
public static final int TYPE_RIGHT_IMAGE =0;
public static final int TYPE_THREE_IMAGE = 1;
private List<Goods> mList = new ArrayList<>();
private Context context;
public GoodsListAdapter(Context context) {
this.context = context;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
//判断条目类型
if (i == TYPE_RIGHT_IMAGE) {
View view = View.inflate(context, R.layout.activity_shopping_item_image, null);
return new GoodHolderView_image(view);
}else {
View view = View.inflate(context, R.layout.activity_shopping_item_text,null);
return new GoodHolderView_Text(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int i) {
if (holder instanceof GoodHolderView_image) {
//由于我们的数据图片提供的不标准,所以我们需要切割得到图片
String imageurl = "https"+mList.get(i).getImages().split("https")[1];
Log.i("dt","imageUrl: "+imageurl);
imageurl = imageurl.substring(0,imageurl.lastIndexOf(".jpg")+".jpg".length());
Glide.with(context).load(imageurl).into(((GoodHolderView_image) holder).imageView);//加载图片
}
if (holder instanceof GoodHolderView_Text) {
((GoodHolderView_Text) holder).textView.setText(mList.get(i).getTitle());
String imageurl = "https"+mList.get(i).getImages().split("https")[1];
imageurl = imageurl.substring(0,imageurl.lastIndexOf(".jpg")+".jpg".length());
Glide.with(context).load(imageurl).into(((GoodHolderView_Text) holder).imageView);
}
}
public int getItemCount() {
return mList.size();
}
@Override
public int getItemViewType(int position) {
Goods goods = mList.get(position);
//返回条目类型,可以根据需要返回条目类型,我这就随意返回了两种,
return goods.getPid()% 2;
}
public void clearList() {
mList.clear();
}
public void addAll(List<Goods> data) {
//添加数据
mList.addAll(data);
}
class GoodHolderView_image extends RecyclerView.ViewHolder {
ImageView imageView;
public GoodHolderView_image(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.image_item);
}
}
class GoodHolderView_Text extends RecyclerView.ViewHolder {
ImageView imageView;
TextView textView;
public GoodHolderView_Text(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
imageView = itemView.findViewById(R.id.images);
}
}
}