依赖
compile 'com.jcodecraeer:xrecyclerview:1.3.2'
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.github.bumptech.glide:glide:3.3.1'
model层
CallBack
public interface CallBack {
void onResponse(Object o);
void onFailure(Exception e);
}
GsonUtils
public class GsonUtils {
private static Gson instance;
private GsonUtils(){
}
public static Gson getInstance(){
if (instance == null) {
instance = new Gson();
}
return instance;
}
}
HttpsUrl
public class HttpsUrl {
private Handler handler = new Handler();
private static volatile HttpsUrl instance;
public HttpsUrl(){
}
public static HttpsUrl getInstance(){
if(null == instance){
synchronized (HttpsUrl.class){
if(instance==null){
instance = new HttpsUrl();
}
}
}
return instance;
}
public void get(String url, Map<String , String> map, final CallBack callback, final Class cls){
if(TextUtils.isEmpty(url)){
return;
}
StringBuffer sb = new StringBuffer();
sb.append(url);
if(url.contains("?")){
if (url.indexOf("?")==url.length()-1) {
}else{
sb.append("&");
}
}else{
sb.append("?");
}
for(Map.Entry<String ,String > entry:map.entrySet()){
sb.append(entry.getKey())
.append("=")
.append(entry.getValue())
.append("&");
}
if(sb.indexOf("&") != -1){
sb.deleteCharAt(sb.lastIndexOf("&"));
}
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder()
.get()
.url(sb.toString())
.build();
Call call = client.newCall(request);
call.enqueue(new okhttp3.Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
callback.onFailure(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String s = response.body().string();
Log.i("ddd",s);
handler.post(new Runnable() {
private Object o;
@Override
public void run() {
if(TextUtils.isEmpty(s)){
o = null;
}else{
o = GsonUtils.getInstance().fromJson(s,cls);
}
callback.onResponse(o);
}
});
}
});
}
}
presenter层
INewsView
public interface INewsView {
void failed(Exception e);
void success(List<JsonBean.DataBean> data);
}
NewsListAdapter --------RecyclerView适配器
public class NewsListAdapter extends RecyclerView.Adapter<NewsListAdapter.ViewHolder> {
private Context context;
private List<JsonBean.DataBean> list;
private View v;
public NewsListAdapter(Context context, List<JsonBean.DataBean> list) {
this.context=context;
this.list=list;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
v = View.inflate(context, R.layout.item_main, null);
ViewHolder holder = new ViewHolder(v);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String img = list.get(position).getImages();
if(img.contains("|")){
img = img.substring(0, img.indexOf("|"));
}
Log.i("imggg",img);
Glide.with(context).load(img).into(holder.t_img);
holder.zjg.setText("折扣价:"+list.get(position).getSalenum());
holder.jg.setText("原价:"+list.get(position).getPrice());
holder.title.setText(""+list.get(position).getTitle());
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private final ImageView t_img;
private final TextView jg;
private final TextView title;
private final TextView zjg;
public ViewHolder(View itemView) {
super(itemView);
t_img = v.findViewById(R.id.iv_timgg);
jg = v.findViewById(R.id.tv_tjiage);
zjg = v.findViewById(R.id.tv_zjiage);
title = v.findViewById(R.id.tv_ttitle);
jg.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
}
}
}
NewsPresenter
public class NewsPresenter {
private INewsView inv;
public NewsPresenter(INewsView inv) {
this.inv = inv;
}
public void getNews(int num){
HashMap<String , String> map = new HashMap<>();
map.put("source","android");
map.put("keywords","笔记本");
map.put("page",num+"");
HttpsUrl.getInstance().get("http://120.27.23.105/product/searchProducts", map, new CallBack() {
@Override
public void onResponse(Object o) {
JsonBean json = (JsonBean) o;
if(json!=null){
List<JsonBean.DataBean> data = json.getData();
Log.i("jjj",data.toString());
inv.success(data);
}
}
@Override
public void onFailure(Exception e) {
inv.failed(e);
}
},JsonBean.class);
}
public void detachView(){
if (inv != null) {
inv = null;
}
}
}
MainActivity
public class MainActivity extends AppCompatActivity implements INewsView {
private List<JsonBean.DataBean> list = new ArrayList<>();
private XRecyclerView rv;
private NewsListAdapter adapter;
private int num =1;
private boolean aa=true;
private boolean flag = true;
private ImageView img;
private NewsPresenter presenter;
private EditText et;
private Button butss;
private String s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
presenter = new NewsPresenter(this);
presenter.getNews(num);
LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
rv.setLayoutManager(manager);
adapter = new NewsListAdapter(this, list);
rv.setAdapter(adapter);
initLoading();
}
private void initLoading() {
rv.setLoadingMoreEnabled(true);
rv.setLoadingMoreProgressStyle(ProgressStyle.SquareSpin);
rv.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {
num=1;
aa=true;
presenter.getNews(num);
}
@Override
public void onLoadMore() {
num++;
aa=false;
presenter.getNews(num);
}
});
}
private void initView() {
rv = (XRecyclerView) findViewById(R.id.rv);
img = (ImageView) findViewById(R.id.iv_img);
et = (EditText) findViewById(R.id.et);
butss = (Button) findViewById(R.id.but_ss);
butss.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
s = et.getText().toString();
Log.i("sss",s);
if(s.equals("笔记本")){
Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
}else if(s.equals("手机")){
Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
}else{
Toast.makeText(MainActivity.this,"没有该数据",Toast.LENGTH_LONG).show();
}
}
});
img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (flag) {
img.setImageResource(R.drawable.kind_grid);
StaggeredGridLayoutManager managera = new StaggeredGridLayoutManager(2, LinearLayoutManager.VERTICAL);
rv.setLayoutManager(managera);
flag=false;
} else {
img.setImageResource(R.drawable.kind_liner);
LinearLayoutManager anager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false);
rv.setLayoutManager(anager);
flag=true;
}
}
});
}
@Override
public void failed(Exception e) {
}
@Override
public void success(List<JsonBean.DataBean> data) {
if (aa) {
rv.refreshComplete();
}else {
rv.loadMoreComplete();
}
Log.i("zzz",data.toString());
if(null!=data){
list.clear();
list.addAll(data);
adapter.notifyDataSetChanged();
}
}
}
main布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="搜索商品"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<ImageView
android:id="@+id/iv_img"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/kind_liner"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="#000"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/et"
android:layout_width="0dp"
android:layout_weight="4"
android:hint="请输入关键字"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_alignParentStart="true" />
<Button
android:id="@+id/but_ss"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:text="搜索" />
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="#000"/>
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.jcodecraeer.xrecyclerview.XRecyclerView>
</LinearLayout>
item_main适配器布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_timgg"
android:layout_width="200dp"
android:layout_height="200dp" />
<TextView
android:id="@+id/tv_ttitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxEms="30"
android:singleLine="true"
android:text="wqewqeqeq" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_tjiage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:text="qweqeqeqw"
android:textSize="18dp" />
<TextView
android:id="@+id/tv_zjiage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1232321"
android:textColor="#f00"
android:textSize="18dp"
android:layout_alignParentTop="true"
android:layout_toEndOf="@+id/tv_tjiage"
android:layout_marginStart="33dp" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>