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'}
阅读全文
0 0
- Xhttp——RecyclerView——MVP
- Android——MVP架构OkHttp的二次封装以及RecyclerView的使用
- MVP模式—徐旸
- RecyclerView(一)——初探RecyclerView
- MvP+recyclerview
- Mvp+RecyclerView
- MVP+RecyclerView
- MaterialDesign——RecyclerView
- RecyclerView——LayoutAnimation
- Android控件—RecyclerView
- Android—RecyclerView
- android MVP——mvp架构的应用和优化
- MVP源码实战解析——告别MVC,初识MVP
- MVP模式最佳实践(1)—MVP模式简介
- MD风格Mvp—RxJava2应用,MVP初体验
- Android——MVP架构
- 设计模式——MVP
- 异步加载——MVP
- 机器学习
- <algorithm>头文件
- 阿里双十一,3分01秒破百亿;乐视网称贾跃亭无力履行承诺;法乐第未来宣布解职CFO和CTO丨价值早报
- Atom常用package记录
- SubList分页-012-StudentService接口
- Xhttp——RecyclerView——MVP
- 创投圈饭局指南,如何撩到投资人?
- 今日头条10亿美元全资收购短视频社区 musical.ly
- SubList分页-013-SubListStudentServiceImpl类
- JVM之执行引擎(二)
- SubList分页-014-SubListServlet类
- 唯快不破:Linux 进程间通信 --- 信号通信
- SubList分页-015-InputParameter类
- 【头条】英特尔:画个同“芯”圆,圈出大生态