依赖
implementation 'com.android.support:recyclerview-v7:25.3.1'
implementation('com.jcodecraeer:xrecyclerview:1.5.9') {
exclude group: 'com.android.support'
}
implementation 'com.github.bumptech.glide:glide:4.8.0'
implementation 'com.google.code.gson:gson:2.2.4'
implementation 'com.google.guava:guava:16.0.1'
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
Mainactivity java
public class MainActivity extends AppCompatActivity implements XRecyclerView.LoadingListener,CallBacks<List<Goods>> {
XRecyclerView xRecyclerView;
LinearLayoutManager layoutManager;
ListAdapter adapter;
List<Goods> list=new ArrayList<>();
int page=1;
int sort=0;
String url = "http://www.zhaoapi.cn/product/searchProducts?keywords=手机&page=";
ListPresenter listPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取控件
xRecyclerView=findViewById(R.id.xrecyclerview);
xRecyclerView.setLoadingListener(this);
//把数据加入reclerview
adapter=new ListAdapter(this,list);
xRecyclerView.setAdapter(adapter);
//获取数据
listPresenter=new ListPresenter(this);
//拼接网址
String urls=url+page+"&sort="+sort;
//使用方法添加
listPresenter.add(urls);
//线性布局
layoutManager=new LinearLayoutManager(this);
//添加到布局
xRecyclerView.setLayoutManager(layoutManager);
//添加一下代码实现上拉加载,下拉刷新
address_recyclerview.setLoadingMoreEnabled(true);// 下拉加载更多
address_recyclerview.setLoadingListener(this);
address_recyclerview.setNestedScrollingEnabled(false);
}
//上下刷新
@Override
public void onRefresh() {
//新的从这里开始
//判断单例模式
if (address_precenter.isRunning()) {
//设置刷新以及增加数据
address_recyclerview.refreshComplete();
address_recyclerview.loadMoreComplete();
return;
}
//刷新
address_recyclerview.refreshComplete();
//重新请求网络数据
address_precenter.reqeust(userId,sessionId,true);
//到这里结束
page=1;
String urls=url+page+"&sort="+sort;
list.clear();
listPresenter.add(urls);
}
//上下刷新
@Override
public void onLoadMore() {
page++;
String urls=url+page+"&sort="+sort;
listPresenter.add(urls);
}
//成功的方法
@Override
public void success(List<Goods> data) {
//添加到list中
list.addAll(data);
//刷新
adapter.notifyDataSetChanged();
xRecyclerView.loadMoreComplete();
xRecyclerView.refreshComplete();
//删除
adapter.setOnItmeClickListener(new ListAdapter.ClickListener() {
@Override
public void onItmeClickListener(View view, int position) {
list.remove(position);
adapter.notifyDataSetChanged();
}
});
}
//错误的方法
@Override
public void fail(Result result) {
Toast.makeText(this,"错误",Toast.LENGTH_LONG).show();
}
}
adapter加载进入列表
public class ListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Activity activity;
private List<Goods> list;
private ClickListener clickListener;
public ListAdapter(MainActivity mainActivity,List<Goods> list){
this.activity=mainActivity;
this.list=list;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=View.inflate(activity, R.layout.item_01,null);
return new MyHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
final MyHolder holder1= (MyHolder) holder;
holder1.text1.setText(list.get(position).getTitle());
holder1.text2.setText(list.get(position).getPrice()+"$");
String images=list.get(position).getImages();
String[] sqlit=images.split("\\|");
Glide.with(activity).load(sqlit[0]).into(((MyHolder) holder).image);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(activity,"点击了",Toast.LENGTH_LONG).show();
clickListener.onItmeClickListener(v,position);
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public void setOnItmeClickListener(ClickListener clickListener){
this.clickListener=clickListener;
}
private class MyHolder extends RecyclerView.ViewHolder {
private final ImageView image;
private final TextView text1;
private final TextView text2;
public MyHolder(View view) {
super(view);
image=view.findViewById(R.id.image);
text1=view.findViewById(R.id.text1);
text2=view.findViewById(R.id.text2);
}
}
public interface ClickListener {
void onItmeClickListener(View view,int position);
}
}
model
public class ListModel {
public static Result getGoods(String url){
String s=Okhttp.get(url);
Type type=new TypeToken<Result<List<Goods>>>(){}.getType();
Gson gson=new Gson();
Result result=gson.fromJson(s,type);
return result;
}
}
precenter
public class ListPresenter {
CallBacks callBacks;
public ListPresenter(CallBacks callBacks) {
this.callBacks=callBacks;
}
Handler handler=new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Result result= (Result) msg.obj;
if (result.getCode()==0){
callBacks.success(result.getData());
}else {
callBacks.fail(result);
}
}
};
public void add(final String url){
new Thread(){
@Override
public void run() {
super.run();
Result result=ListModel.getGoods(url);
Message message=handler.obtainMessage();
message.obj=result;
handler.sendMessage(message);
}
}.start();
}
}
okthhp加载数据
public class Okhttp {
public static String get(String url){
OkHttpClient okHttpClient=new OkHttpClient();
Request request=new Request.Builder().url(url).build();
Call call=okHttpClient.newCall(request);
try {
Response execute = call.execute();
return execute.body().string();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
}
item布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:id="@+id/image"
android:adjustViewBounds="true"
android:minHeight="50dp"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"/>
<TextView
android:textColor="#f00"
android:id="@+id/text2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"/>
</LinearLayout>
</LinearLayout>