recyclerview+okhttp+glide实现网络请求加载图片列表
2017-09-19 09:04
741 查看
导入依赖
compile 'com.squareup.okhttp3:okhttp:3.8.1'
compile 'com.google.code.gson:gson:2.8.1' compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' compile 'com.github.bumptech.glide:glide:3.8.0'
权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>main布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.w.myapplication2.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recy" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v7.widget.RecyclerView> </RelativeLayout>recyclerview适配器
public class MyAdapter extends RecyclerView.Adapter{ private View view; private Context mcontext; private ArrayList<Bean.StoriesBean> mlist=new ArrayList<>(); private OnItemClickListener mClickListener; public MyAdapter(Context mcontext, ArrayList<Bean.StoriesBean> list) { this.mcontext = mcontext; this.mlist=list; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mcontext).inflate(R.layout.item, null); return new ViewHolder(view,mClickListener); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { ViewHolder viewholder= (ViewHolder)holder; viewholder.textview.setText(""+mlist.get(position).getTitle()); Glide.with(mcontext).load(getItem(position).getImages().get(0)).into(viewholder.ima); //只给标题设置的点击事件 /* viewholder.textview.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mcontext, mlist.get(position).getTitle(), Toast.LENGTH_SHORT).show(); } });*/ } //手写的重置数据的方法 public void setdata(ArrayList<Bean.StoriesBean> list){ if (list!=null&&list.size()>0){ mlist.addAll(list); } } //手写的获得视图的方法 public Bean.StoriesBean getItem(int position){ return mlist.get(position); }; @Override public int getItemCount() { return mlist.size(); } //自定义的方法 public void setOnItemClickListener(OnItemClickListener listener){ this.mClickListener=listener; } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ private OnItemClickListener mListener;// 声明自定义的接口 private TextView textview; private ImageView ima; //把定义的接口作为参数放到方法内 public ViewHolder(View itemView,OnItemClickListener listener) { super(itemView); mListener=listener; //给item设置点击事件 itemView.setOnClickListener(this); textview=(TextView)itemView.findViewById(R.id.textView); ima=(ImageView)itemView.findViewById(R.id.imageView); } @Override public void onClick(View v) { // getpostion()为Viewholder自带的一个方法,用来获取RecyclerView当前的位置,将此作为参数,传出去 mListener.onItemClick(v,getPosition()); } } //手写的一个接口 public interface OnItemClickListener { public void onItemClick(View view, int postion); } }okhttp工具类
//OKHttp工具类 public class OKHttp { public void getdata(String url, final MainActivity netDataCallback) { //初始化一个 OkHttpClient 并且设置连接和读取超时时间 OkHttpClient okhttp = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(20, TimeUnit.SECONDS) .build(); //构造一个Request对象 Request request = new Request.Builder().url(url).build(); //通过request的对象去构造得到一个Call对象 Call call=okhttp.newCall(request); //调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,我们在Callback中即可得到结果。 call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { netDataCallback.err(500,e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException { String s = response.body().string(); netDataCallback.callback(s); } }); } public interface NetDataCallback { void callback(String str); void err(int code,String s); } }
recyclerview的布局管理器(不能忽视)
public class AppManager { // Activity栈 private static Stack<Activity> activityStack; // 单例模式 private static AppManager instance; private AppManager() { } /** * 单一实例 */ public static AppManager getAppManager() { if (instance == null) { instance = new AppManager(); } return instance; } /** * 添加Activity到堆栈 */ public void addActivity(Activity activity) { if (activityStack == null) { activityStack = new Stack<Activity>(); } activityStack.add(activity); } /** * 获取当前Activity(堆栈中最后一个压入的) */ public Activity currentActivity() { Activity activity = activityStack.lastElement(); return activity; } /** * 结束当前Activity(堆栈中最后一个压入的) */ public void finishActivity() { Activity activity = activityStack.lastElement(); finishActivity(activity); } /** * 结束指定的Activity */ public void finishActivity(Activity activity) { if (activity != null) { activityStack.remove(activity); activity.finish(); activity = null; } } /** * 结束指定类名的Activity */ public void finishActivity(Class<?> cls) { for (Activity activity : activityStack) { if (activity.getClass().equals(cls)) { finishActivity(activity); break; } } } /** * 结束所有Activity */ public void finishAllActivity() { for (int i = 0; i < activityStack.size(); i++) { if (null != activityStack.get(i)) { activityStack.get(i).finish(); } } activityStack.clear(); } /** * 退出应用程序 */ public void AppExit(Context context) { try { finishAllActivity(); //退出程序 android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1); } catch (Exception e) { } } }main代码
public class MainActivity extends AppCompatActivity { private RecyclerView mrv; private String url="https://news-at.zhihu.com/api/4/news/latest"; private MyAdapter md; private OKHttp http; private ArrayList<Bean.StoriesBean> mlist=new ArrayList<>(); public Handler hand=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what==1){ Gson gson=new Gson(); Bean bean = gson.fromJson(msg.obj.toString(), Bean.class); // mlist=(ArrayList<NewsData.DataBean>) newsData.getData(); mlist=(ArrayList<Bean.StoriesBean>) bean.getStories(); md.setdata((ArrayList<Bean.StoriesBean>) mlist); md.notifyDataSetChanged(); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mrv=(RecyclerView)findViewById(R.id.recy); initdata(); mrv.setLayoutManager(new LinearLayoutManager(this)); md=new MyAdapter(this,mlist); mrv.setAdapter(md); //RecyclerView条目的点击事件 md.setOnItemClickListener(new MyAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int postion) { Toast.makeText(MainActivity.this, mlist.get(postion).getTitle(), Toast.LENGTH_SHORT).show(); } }); } private void initdata() { OKHttp http=new OKHttp(); http.getdata(url, this); } public void callback(String str) { Message msg = Message.obtain(); msg.what=1; msg.obj=str; hand.sendMessage(msg); } public void err(int code, String s) { } }
相关文章推荐
- Glide结合Recyclerview(也适用于Listview)实现列表滑动的时候图片不加载,滑动停止的时候加载(已修正Listview部分以及排版)
- MVP实现用Retrofit请求网络数据Fresco加载图片,Recyclerview CheckBox显示并实现全选删除
- 使用recyclerview多条目加载代替listview okhttp请求网路 Glide加载图片
- Android使用OKHTTP网络框架请求数据,RecyclerView结合Glide展示图片,瀑布流布局样式
- Kotlin实现Retrofit网络请求RecyclerView展示图片列表
- 【Android】Glide结合Recyclerview(也适用于Listview)实现列表滑动的时候图片不加载,滑动停止的时候加载(已修正Listview部分以及排版)
- Glide结合Recyclerview(Listview)实现列表滑动的时候图片不加载,滑动停止的时候加载
- SSS___listview多条目加载、使用okhttp请求网络数据,Glide加载图片
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
- RecyclerView和okhttp结合 实现一个网络请求数据
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
- OkHttp的网络请求数据和RecyclerView的多条目加载,添加分割线
- ListView、RecyclerView CheckBox 单选实现,以及RecyclerView异步加载网络图片
- OkHttp解析数据,RecyclerView和Glide的加载图片
- okhttp + RecycleView + Glide 请求网络数据及图片
- 用RecyclerView实现新闻列表页,包括头部的图片轮播,两种Item显示方式,下拉刷新和上拉加载以及限制列表的加载条目数
- RecyclerView条目跳转+SpringView数据刷新加载+MVP+OKhttp+拦截器+自定义view 实现请求网络数据的二级列表购物车
- 图片加载用Fresco,网络请求用OKhttp+Retrofit实现
- Android Glide+CircleImageView实现加载圆形图片列表
- recyclerview 显示图片 glide加载图片 实现点击跳转 上拉刷新下拉加载