Mvp+OkHttp+XRecyclerView------上拉加载下拉刷新


依赖

 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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值