activity_recyclerview
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.bwie.test.recyclerviewdemo.RecyclerviewActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </RelativeLayout>
item_recycler
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="100dp"> <ImageView android:id="@+id/image_view" android:layout_width="100dp" android:layout_height="100dp" /> <TextView android:id="@+id/text_title" android:layout_toRightOf="@id/image_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="111"/> <TextView android:id="@+id/text_price" android:layout_toRightOf="@id/image_view" android:layout_centerVertical="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#ff0000" android:text="111"/> </RelativeLayout>
RecyclerviewActivity
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import com.bwie.test.adapter.ReayAdapter; import com.bwie.test.bean.SeekBean; import com.bwie.test.presenter.Presenter; import com.bwie.test.util.ApiUrl; import java.util.HashMap; import java.util.List; import java.util.Map; public class RecyclerviewActivity extends AppCompatActivity implements MyView{ private RecyclerView recycler_view; private Presenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recyclerview); //隐藏原有标题 getSupportActionBar().hide(); //查找控件 recycler_view = (RecyclerView) findViewById(R.id.recycler_view); presenter = new Presenter(this); presenter.attachView(this); Map<String, String> map = new HashMap<>(); map.put("keywords","笔记本"); map.put("page","1"); presenter.getUrl(ApiUrl.seek,map); } @Override public void getSeekBean(final SeekBean seekBean) { runOnUiThread(new Runnable() { @Override public void run() { final List<SeekBean.DataBean> list = seekBean.getData(); recycler_view.setLayoutManager(new LinearLayoutManager(RecyclerviewActivity.this, LinearLayoutManager.VERTICAL,false)); ReayAdapter adapter = new ReayAdapter(RecyclerviewActivity.this, list); recycler_view.setAdapter(adapter); adapter.setOnClicklist(new OnClicklist() { @Override public void setOnClick(int position) { int pid = list.get(position).getPid(); } }); } }); } @Override protected void onDestroy() { super.onDestroy(); if (presenter!=null){ presenter.detachView(); } } }
MyView
import com.bwie.test.bean.SeekBean; public interface MyView { void getSeekBean(SeekBean seekBean); //void getXiangQingBean(XiangQingBean xiangQingBean); }
OnClicklist
public interface OnClicklist { void setOnClick(int position); }
adapter文件夹下RecyAdapter
import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.bumptech.glide.Glide; import com.bwie.test.bean.SeekBean; import com.bwie.test.recyclerviewdemo.OnClicklist; import java.util.List; import com.bwie.test.recyclerviewdemo.R; public class ReayAdapter extends RecyclerView.Adapter<MyHolder>{ private final Context context; private final List<SeekBean.DataBean> list; private OnClicklist onClicklist; public ReayAdapter(Context context, List<SeekBean.DataBean> list) { this.context = context; this.list = list; } @Override public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_recycler, parent, false); MyHolder holder = new MyHolder(view); return holder; } @Override public void onBindViewHolder(MyHolder holder, final int position) { SeekBean.DataBean dataBean = list.get(position); String[] split = dataBean.getImages().split("\\|"); Glide.with(context).load(split[0]).into(holder.image_view); holder.text_title.setText(dataBean.getTitle()); holder.text_price.setText("¥:"+dataBean.getPrice()); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onClicklist.setOnClick(position); } }); } @Override public int getItemCount() { return list.size(); } public void setOnClicklist(OnClicklist onClicklist){ this.onClicklist = onClicklist; } }
MyHolder
import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.bwie.test.recyclerviewdemo.R; public class MyHolder extends RecyclerView.ViewHolder{ public ImageView image_view; public TextView text_title; public TextView text_price; public MyHolder(View itemView) { super(itemView); image_view = itemView.findViewById(R.id.image_view); text_title = itemView.findViewById(R.id.text_title); text_price = itemView.findViewById(R.id.text_price); } }
model文件夹下Model
import com.bwie.test.bean.SeekBean; import com.bwie.test.presenter.PresenterPort; import com.bwie.test.util.OkHttpUtil; import com.google.gson.Gson; import java.io.IOException; import java.util.HashMap; import java.util.Map; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; public class Model { private PresenterPort presenterPort; public Model(PresenterPort presenterPort) { this.presenterPort = presenterPort; } public void getUrl(String seek, Map<String, String> map) { OkHttpUtil.doPost(seek, map, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { //Log.d("+++++++",response.body().string()+""); SeekBean seekBean = new Gson().fromJson(response.body().string(), SeekBean.class); presenterPort.getSeekBean(seekBean); } } }); } } // public void getxiangUrl(String xiangqing, HashMap<String, String> map) { // OkHttpUtil.doPost(xiangqing, map, new Callback() { // @Override // public void onFailure(Call call, IOException e) { // // } // // @Override // public void onResponse(Call call, Response response) throws IOException { // if (response.isSuccessful()){ // //Log.d("+++++++",response.body().string()+""); // XiangQingBean xiangQingBean = new Gson().fromJson(response // .body().string(), XiangQingBean.class); // presenterPort.getXiangQingBean(xiangQingBean); // } // } // }); // }
presenter文件夹下BasePresenter
import java.lang.ref.Reference; import java.lang.ref.WeakReference; public abstract class BasePresenter<T> { protected Reference<T> mViewRef;//View接口类型弱引用 public void attachView(T view) { mViewRef = new WeakReference<T>(view); //建立关联 } protected T getView() { return mViewRef.get();//获取View } public boolean isViewAttached() {//判断是否与View建立了关联 return mViewRef != null && mViewRef.get() != null; } public void detachView() {//解除关联 if (mViewRef != null) { mViewRef.clear(); mViewRef = null; } } }
Presenter
import com.bwie.test.bean.SeekBean; import com.bwie.test.model.Model; import com.bwie.test.recyclerviewdemo.MyView; import java.util.Map; public class Presenter extends BasePresenter implements PresenterPort{ private MyView myView; private final Model model; public Presenter(MyView myView) { model = new Model(this); this.myView = myView; } @Override public void getSeekBean(SeekBean seekBean) { myView.getSeekBean(seekBean); } public void getUrl(String seekbean, Map<String, String> map) { model.getUrl(seekbean,map); } }
PresenterPort
import com.bwie.test.bean.SeekBean; public interface PresenterPort { void getSeekBean(SeekBean seekBean); //void getXiangQingBean(XiangQingBean xiangQingBean); }
util文件夹下ApiUtil
public class ApiUrl { public static String seek="https://www.zhaoapi.cn/product/searchProducts"; public static String xiangqing="https://www.zhaoapi.cn/product/getProductDetail"; }
OkHttpUtil
import android.os.Environment; import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.Cache; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; public class OkHttpUtil { private static OkHttpClient okHttpClient = null; private OkHttpUtil(){ } public static OkHttpClient getinfice(){ if (okHttpClient==null){ synchronized (OkHttpUtil.class){ if (okHttpClient==null){ File sdcache = new File(Environment.getExternalStorageDirectory(), "cache"); //指定缓存大小 int cacheSize = 10 * 1024 * 1024; okHttpClient = new OkHttpClient.Builder()//构建器 .connectTimeout(15, TimeUnit.SECONDS)//连接超时 .writeTimeout(20, TimeUnit.SECONDS)//写入超时 .readTimeout(20, TimeUnit.SECONDS)//读取超时 //.addInterceptor(new CommonParamsInterceptor())//添加的是应用拦截器 //.addNetworkInterceptor(new CacheInterceptor())//添加的网络拦截器 .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize))//设置缓存 .build(); } } } return okHttpClient; } public static void doPost(String url, Map<String,String> map, Callback callback){ Map<String, String> hashMap = new HashMap<>(); hashMap.put("source","android"); OkHttpClient okHttpClient = getinfice(); FormBody.Builder builder = new FormBody.Builder(); for (String key:map.keySet()){ builder.add(key,map.get(key)); } for (Map.Entry<String,String> entry:hashMap.entrySet()){ builder.add(entry.getKey(),entry.getValue()); } Request request = new Request.Builder().url(url).post(builder.build()) .build(); Call call = okHttpClient.newCall(request); call.enqueue(callback); } }
使用的方法和依赖
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INTERNET"/>
compile'com.nostra13.universalimageloader:universal-image-loader:1.9.3' compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' compile 'com.squareup.okhttp3:okhttp:3.4.1' compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.1' compile 'com.google.code.gson:gson:2.6.2' compile 'com.github.bumptech.glide:glide:3.7.0'
bean文件夹下SeekBean
import java.util.List; public class SeekBean { private String msg; private String code; private String page; private List<DataBean> data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getPage() { return page; } public void setPage(String page) { this.page = page; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { private double bargainPrice; private String createtime; private String detailUrl; private String images; private int itemtype; private int pid; private double price; private int pscid; private int salenum; private int sellerid; private String subhead; private String title; public double getBargainPrice() { return bargainPrice; } public void setBargainPrice(double bargainPrice) { this.bargainPrice = bargainPrice; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getDetailUrl() { return detailUrl; } public void setDetailUrl(String detailUrl) { this.detailUrl = detailUrl; } public String getImages() { return images; } public void setImages(String images) { this.images = images; } public int getItemtype() { return itemtype; } public void setItemtype(int itemtype) { this.itemtype = itemtype; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPscid() { return pscid; } public void setPscid(int pscid) { this.pscid = pscid; } public int getSalenum() { return salenum; } public void setSalenum(int salenum) { this.salenum = salenum; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } public String getSubhead() { return subhead; } public void setSubhead(String subhead) { this.subhead = subhead; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } }