Xhttp——RecyclerView——MVP

来源:互联网 发布:hz是什么意思网络用语 编辑:程序博客网 时间:2024/06/06 12:49

xhttp请求数据

package com.bwei.recycler_xhttp.http;import android.os.Handler;import android.text.TextUtils;import com.bwei.recycler_xhttp.callback.CallBack;import com.bwei.recycler_xhttp.utils.GsonUtils;import java.io.IOException;import java.util.Map;import okhttp3.Call;import okhttp3.Callback;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;/** * Created by MRli on 2017/11/9. */public class HttpUtils {    private static final String TAG = "HttpUtils";    private static volatile HttpUtils instance;    private static Handler handler = new Handler();    private HttpUtils(){    }    public static HttpUtils getInstance(){        if(instance == null ){            synchronized (HttpUtils.class){                if(instance == null){                    instance = new HttpUtils();                }            }        }        return instance;    }    /**     * Get请求     *  @param url     * @param map     * @param callBack     */    public void get(String url, Map<String, String> map, final CallBack callBack, final Class cls,final String tag){        // http://www.baoidu.com/login?mobile=11111&password=11111&age=1&name=zw        // 1.http://www.baoidu.com/login                --------? key=value&key=value        // 2.http://www.baoidu.com/login?               --------- key=value&key=value        // 3.http://www.baoidu.com/login?mobile=11111   -----&key=value&key=value        if(TextUtils.isEmpty(url)){            return;        }        StringBuffer stringBuffer = new StringBuffer();        stringBuffer.append(url);        if(url.contains("?")){            //如果包含?并且?不是最后一位,对应3            if(url.indexOf("?")==url.length()-1){            }else{                stringBuffer.append("&");            }        }else{            //不包含?对应1            stringBuffer.append("?");        }        //遍历map集合进行拼接,拼接的形式是key=value&        for(Map.Entry<String,String> entry:map.entrySet()){            stringBuffer.append(entry.getKey())                    .append("=")                    .append(entry.getValue())                    .append("&");        }        //如果存在&号,把最后一个&去掉        if(stringBuffer.indexOf("&") != -1){            stringBuffer.deleteCharAt(stringBuffer.lastIndexOf("&"));        }        //Log.i(TAG, "get url: " + stringBuffer);        OkHttpClient client = new OkHttpClient();        Request request = new Request.Builder()                .get()                .url(stringBuffer.toString())                .build();        Call call = client.newCall(request);        call.enqueue(new Callback() {            @Override            public void onFailure(Call call, final IOException e) {                handler.post(new Runnable() {                    @Override                    public void run() {                        callBack.onFailed(tag,e);                    }                });            }            @Override            public void onResponse(Call call, Response response) throws IOException {                final String result = response.body().string();                //Log.i(TAG, "onResponse: "+result);                handler.post(new Runnable() {                    @Override                    public void run() {                        Object o;                        if(TextUtils.isEmpty(result)){                            o = null;                        }else{                            o = GsonUtils.getInstance().fromJson(result,cls);                            //Log.d(TAG, "ooo: "+o.toString());                        }                        callBack.onSuccess(tag,o);                    }                });            }        });    }}

CallBack回调接口

package com.bwei.recycler_xhttp.callback;/** * Created by MRli on 2017/11/9. */public interface CallBack {    void onSuccess(String tag, Object o);    void onFailed(String tag, Exception e);}

INewsView回调接口

package com.bwei.recycler_xhttp.callback;import com.bwei.recycler_xhttp.entity.NewsBean;import java.util.List;/** * Created by MRli on 2017/11/10. */public interface INewsView {

void success(String tag, List<NewsBean> news);

void failed(String tag, Exception e);}

列表显示RecyclerView.Adapter

package com.bwei.recycler_xhttp.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import com.bumptech.glide.Glide;import com.bwei.recycler_xhttp.R;import com.bwei.recycler_xhttp.entity.NewsBean;import java.util.List;/** * Created by WuXirui * Create Time: 2017/11/9 * Description: */public class NewsListAdapter extends RecyclerView.Adapter<NewsListAdapter.ViewHolder> {    private Context context;    private List<NewsBean> list;    public NewsListAdapter(Context context, List<NewsBean> list) {        this.context = context;        this.list = list;    }    @Override    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View v = View.inflate(context, R.layout.item_news, null);        ViewHolder holder = new ViewHolder(v);        return holder;    }    @Override    public void onBindViewHolder(ViewHolder holder, int position) {        Glide.with(context).load(list.get(position).getPicUrl()).into(holder.imgLogo);        holder.txtTitle.setText(list.get(position).getTitle());        holder.txtTime.setText(list.get(position).getDescription());    }    @Override    public int getItemCount() {        if (list == null) {            return 0;        }        return list.size();    }    class ViewHolder extends RecyclerView.ViewHolder {        private ImageView imgLogo;        private TextView txtTitle;        private TextView txtTime;        public ViewHolder(View itemView) {            super(itemView);            imgLogo =  itemView.findViewById(R.id.img_logo);            txtTitle = itemView.findViewById(R.id.txt_title);            txtTime = itemView.findViewById(R.id.txt_time);        }    }}

多条目展示的RecyclerView.Adapter

package com.bwei.recycler_xhttp.adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import com.bumptech.glide.Glide;import com.bwei.recycler_xhttp.R;import com.bwei.recycler_xhttp.entity.NewsBean;import java.util.List;/** * Created by MRli on 2017/11/11. */public class NewsListAdapter2 extends RecyclerView.Adapter<RecyclerView.ViewHolder>{    private Context context;    private List<NewsBean> list;    private static final String TAG = "NewsListAdapter2";    private static final int TYPE_HAS_PIC = 0;    private static final int TYPE_NO_PIC = 1;    public NewsListAdapter2(Context context, List<NewsBean> list) {        this.context = context;        this.list = list;    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if(viewType == TYPE_HAS_PIC){            View v =View.inflate(context,R.layout.item_news,null);            ViewHolder holder = new ViewHolder(v);            return holder;        }else{            View v2 =View.inflate(context,R.layout.item_news2,null);            ViewHolderNoPic holder2 = new ViewHolderNoPic(v2);            return holder2;        }    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        if(holder instanceof ViewHolder){            ViewHolder h1 = (ViewHolder) holder;            Glide.with(context).load(list.get(position).getPicUrl()).into(h1.imgLogo);            h1.txtTitle.setText(list.get(position).getTitle());            h1.txtTime.setText(list.get(position).getDescription());        }else if (holder instanceof ViewHolderNoPic){            ViewHolderNoPic hn = (ViewHolderNoPic) holder;            hn.txtTitle.setText(list.get(position).getTitle());            hn.txtTime.setText(list.get(position).getCtime());        }    }    @Override    public int getItemViewType(int position) {        if(position%2 == 0){            return TYPE_HAS_PIC;        }else{            return TYPE_NO_PIC;        }    }    @Override    public int getItemCount() {        if(list == null){            return 0;        }        return list.size();    }    class ViewHolderNoPic extends RecyclerView.ViewHolder{        private TextView txtTitle;        private TextView txtTime;        public ViewHolderNoPic(View itemView) {            super(itemView);            txtTitle = itemView.findViewById(R.id.txt_title);            txtTime = itemView.findViewById(R.id.txt_time);        }    }    class ViewHolder extends RecyclerView.ViewHolder {        private ImageView imgLogo;        private TextView txtTitle;        private TextView txtTime;        public ViewHolder(View itemView) {            super(itemView);            imgLogo = itemView.findViewById(R.id.img_logo);            txtTitle = itemView.findViewById(R.id.txt_title);            txtTime = itemView.findViewById(R.id.txt_time);        }    }}

当然Gson解析的Bean是不可缺少的还需自定义NewBean类,以及MessageBean类

private String stat;    private List<NewsBean> data;    public String getStat() {        return stat;    }    public void setStat(String stat) {        this.stat = stat;    }    public List<NewsBean> getData() {        return data;    }    public void setData(List<NewsBean> data) {        this.data = data;    }

presenter  V层与M层的连接

package com.bwei.recycler_xhttp.presaenter;import com.bwei.recycler_xhttp.callback.CallBack;import com.bwei.recycler_xhttp.callback.INewsView;import com.bwei.recycler_xhttp.entity.MessageBean;import com.bwei.recycler_xhttp.entity.NewsBean;import com.bwei.recycler_xhttp.http.HttpUtils;import java.util.HashMap;import java.util.List;import java.util.Map;/** * Created by MRli on 2017/11/10. */public class NewsPresenter {    private static final String TAG = "NewsPresenter";    private INewsView inv;    public void attachView(INewsView inv) {        this.inv = inv;    }    public void getNews(int page) {        Map<String,String> map = new HashMap<>();        map.put("key","8d6e3228d25298f13af4fc40ce6c9679");        map.put("num","10");        map.put("page", String.valueOf(page));        HttpUtils.getInstance().get("https://api.tianapi.com/wxnew/?", map, new CallBack() {            @Override            public void onSuccess(String tag, Object o) {                MessageBean bean = (MessageBean) o;                if(bean !=null){                    List<NewsBean> data = bean.getNewslist();                    //Log.d(TAG, "data: " + data.get(3).getPicUrl().toString());                    inv.success(tag,data);                }            }            @Override            public void onFailed(String tag, Exception e) {                inv.failed(tag,e);            }        },MessageBean.class, "news");    }    public  void detachView(){        if(inv != null){            inv = null;        }    }}

添加了刷新和加载的Main页面

package com.bwei.recycler_xhttp;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.widget.Toast;import com.bwei.recycler_xhttp.adapter.NewsListAdapter2;import com.bwei.recycler_xhttp.callback.INewsView;import com.bwei.recycler_xhttp.entity.NewsBean;import com.bwei.recycler_xhttp.presaenter.NewsPresenter;import com.jcodecraeer.xrecyclerview.ProgressStyle;import com.jcodecraeer.xrecyclerview.XRecyclerView;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity implements INewsView {    private XRecyclerView rvNews;    private List<NewsBean> list;    private NewsListAdapter2 adapter;    private NewsPresenter presenter;    private int page = 1;    //是否刷新    private boolean isFresh = true;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        rvNews.setLoadingMoreEnabled(true);        rvNews.setLoadingMoreProgressStyle(ProgressStyle.SquareSpin);        rvNews.setLoadingListener(new XRecyclerView.LoadingListener() {            @Override            public void onRefresh() {                page = 1;                isFresh = true;                loadData();            }            @Override            public void onLoadMore() {                page++;                isFresh = false;                loadData();            }        });        list = new ArrayList<>();        adapter = new NewsListAdapter2(this, list);        LinearLayoutManager manager = new LinearLayoutManager(this);        rvNews.setLayoutManager(manager);        rvNews.setAdapter(adapter);        presenter = new NewsPresenter();        presenter.attachView(this);       // presenter.getNews();        loadData();    }    private void loadData() {        presenter.getNews(page);    }    private void initView() {        rvNews = findViewById(R.id.rv_news);    }    @Override    public void success(String tag, List<NewsBean> news) {        if(isFresh){            rvNews.refreshComplete();        }else{            rvNews.loadMoreComplete();        }        if(news != null){            if(isFresh){                list.clear();            }            list.addAll(news);            adapter.notifyDataSetChanged();        }    }    @Override    public void failed(String tag, Exception e) {        Toast.makeText(this,e.getMessage(),Toast.LENGTH_SHORT).show();    }    @Override    protected void onDestroy() {        super.onDestroy();        if(presenter!=null){            presenter.detachView();        }    }}

普通展示ListView的Main页面

package com.bwie.mvpokrecyclerview;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.widget.Toast;import com.bwie.mvpokrecyclerview.adapter.NewsListAdapter;import com.bwie.mvpokrecyclerview.callback.INewsView;import com.bwie.mvpokrecyclerview.entity.NewsBean;import com.bwie.mvpokrecyclerview.presaenter.NewsPresenter;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity implements INewsView {    private static final String TAG = "MainActivity";    private RecyclerView rvNews;    private NewsPresenter presenter;    private NewsListAdapter adapter;    private List<NewsBean> list;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        rvNews = (RecyclerView) findViewById(R.id.rv_news);        list = new ArrayList<>();        adapter = new NewsListAdapter(this, list);        LinearLayoutManager manager = new LinearLayoutManager(this);        rvNews.setLayoutManager(manager);        rvNews.setAdapter(adapter);        presenter = new NewsPresenter();        presenter.attachView(this);        presenter.getNews();    }    @Override    public void success(String tag, List<NewsBean> news) {        if (null != news) {            list.addAll(news);            adapter.notifyDataSetChanged();        }    }    @Override    public void failed(String tag, Exception e) {        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();    }    @Override    protected void onDestroy() {        super.onDestroy();        if (presenter != null) {            presenter.detachView();        }    }}


main_layout

<com.jcodecraeer.xrecyclerview.XRecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/rv_news"> </com.jcodecraeer.xrecyclerview.XRecyclerView>

多条目加载的两个布局文件new_item

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/img_logo" android:layout_width="70dp" android:layout_height="70dp" android:layout_margin="10dp" android:src="@mipmap/ic_launcher" android:scaleType="centerCrop" /> <LinearLayout android:layout_width="match_parent" android:layout_height="70dp" android:orientation="vertical" android:gravity="center_vertical"> <TextView android:id="@+id/txt_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" android:textColor="#232121" android:textSize="15sp" android:textStyle="bold" /> <TextView android:id="@+id/txt_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#635353" android:textSize="13sp" /> </LinearLayout></LinearLayout>

news_item2

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="70dp" android:orientation="vertical" android:gravity="center_vertical"> <TextView android:id="@+id/txt_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" android:textColor="#232121" android:textSize="15sp" android:textStyle="bold" /> <TextView android:id="@+id/txt_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#635353" android:textSize="13sp" /> </LinearLayout></LinearLayout>

依赖导入

repositories { mavenCentral() maven { url 'https://maven.google.com' }}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:26.+' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'com.android.support:recyclerview-v7:26.+' annotationProcessor 'com.github.bumptech.glide:compiler:4.3.1' compile 'com.github.bumptech.glide:glide:4.3.1' testCompile 'junit:junit:4.12' compile 'com.jcodecraeer:xrecyclerview:1.3.2' compile 'com.squareup.okhttp3:okhttp:3.9.0' compile 'com.google.code.gson:gson:2.8.2'}











 
原创粉丝点击