[关闭]
@ZSCDumin 2018-06-13T01:51:48.000000Z 字数 6632 阅读 508

RecycleView + OkHttp3 + SwipeRefreshLayout 实战


【需要注意的是网络处理过程中会遇到很多坑,不能在主线程中执行网络操作,必须采用子线程。子线程中不要弹出对话框或者打印Log日志,会报错。】

参考代码:

MainActivity.java

  1. package com.zscdumin.test;
  2. import android.annotation.SuppressLint;
  3. import android.os.Bundle;
  4. import android.os.Handler;
  5. import android.os.Message;
  6. import android.support.v4.widget.SwipeRefreshLayout;
  7. import android.support.v7.app.AppCompatActivity;
  8. import android.support.v7.widget.LinearLayoutManager;
  9. import android.support.v7.widget.RecyclerView;
  10. import android.util.Log;
  11. import android.view.View;
  12. import android.widget.Toast;
  13. import org.json.JSONArray;
  14. import org.json.JSONException;
  15. import org.json.JSONObject;
  16. import java.io.IOException;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import butterknife.Bind;
  20. import butterknife.ButterKnife;
  21. import okhttp3.FormBody;
  22. import okhttp3.OkHttpClient;
  23. import okhttp3.Request;
  24. import okhttp3.RequestBody;
  25. import okhttp3.Response;
  26. public class MainActivity extends AppCompatActivity {
  27. @Bind(R.id.recycleView)
  28. RecyclerView recycleView;
  29. MyAdpter adapter;
  30. List<String> list = new ArrayList<>();
  31. @Bind(R.id.fresh)
  32. SwipeRefreshLayout fresh;
  33. @SuppressLint("HandlerLeak")
  34. private Handler handler = new Handler() {
  35. @Override
  36. public void handleMessage(Message msg) {
  37. super.handleMessage(msg);
  38. switch (msg.what) {
  39. case 0x101:
  40. if (fresh.isRefreshing()) {
  41. adapter.notifyDataSetChanged();
  42. fresh.setRefreshing(false);//设置不刷新
  43. }
  44. break;
  45. }
  46. }
  47. };
  48. @Override
  49. protected void onCreate(Bundle savedInstanceState) {
  50. super.onCreate(savedInstanceState);
  51. setContentView(R.layout.activity_main);
  52. ButterKnife.bind(this);
  53. list = new ArrayList<>();
  54. download();
  55. adapter = new MyAdpter(this, list, onRecyclerviewItemClickListener);
  56. LinearLayoutManager layoutmanager = new LinearLayoutManager(this);
  57. layoutmanager.setOrientation(LinearLayoutManager.VERTICAL);
  58. recycleView.setLayoutManager(layoutmanager);
  59. recycleView.setAdapter(adapter);
  60. fresh.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light,
  61. android.R.color.holo_orange_light, android.R.color.holo_red_light);
  62. fresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
  63. @Override
  64. public void onRefresh() {
  65. download();
  66. }
  67. });
  68. }
  69. private MyAdpter.OnRecyclerviewItemClickListener onRecyclerviewItemClickListener = new MyAdpter.OnRecyclerviewItemClickListener() {
  70. @Override
  71. public void onItemClickListener(View v, int position) {
  72. //这里的view就是我们点击的view position就是点击的position
  73. Toast.makeText(MainActivity.this, " ItemClick点击了 " + position, Toast.LENGTH_SHORT).show();
  74. }
  75. @Override
  76. public void onItemLongClickListener(View v, int position) {
  77. Toast.makeText(MainActivity.this, " ItemOnLongClick点击了 " + position, Toast.LENGTH_SHORT).show();
  78. }
  79. };
  80. public void download() {
  81. //主线程中不允许执行网络操作,开辟子线程
  82. new Thread(new Runnable() {
  83. @Override
  84. public void run() {
  85. getData();
  86. }
  87. }).start();
  88. }
  89. public void getData() {
  90. OkHttpClient client = new OkHttpClient();
  91. RequestBody requestBody = new FormBody.Builder()
  92. .add("code", "10001")
  93. .add("password", "123456")
  94. .build();
  95. Request request = new Request.Builder().
  96. url("http://115.157.192.47:8080/mes/user/getByCode")
  97. .post(requestBody)
  98. .build();
  99. Response response = null;
  100. try {
  101. response = client.newCall(request).execute();
  102. String responseData = response.body().string();
  103. Log.i("TAG", responseData);
  104. JSONObject jsonObject = new JSONObject(responseData);
  105. JSONObject data = jsonObject.optJSONObject("data");
  106. JSONArray roles = data.optJSONArray("roles");
  107. for (int i = 0; i < roles.length(); i++) {
  108. JSONObject item = roles.getJSONObject(i);
  109. JSONArray modules = item.optJSONArray("models");
  110. for (int j = 0; j < modules.length(); j++) {
  111. list.add(modules.getJSONObject(j).optString("name"));
  112. }
  113. }
  114. handler.sendEmptyMessage(0x101);//通过handler发送一个更新数据的标记
  115. } catch (IOException e) {
  116. e.printStackTrace();
  117. } catch (JSONException e) {
  118. e.printStackTrace();
  119. }
  120. }
  121. }

MyAdapter

  1. package com.zscdumin.test;
  2. import android.content.Context;
  3. import android.support.annotation.NonNull;
  4. import android.support.v7.widget.RecyclerView;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.ImageView;
  9. import android.widget.TextView;
  10. import java.util.List;
  11. public class MyAdpter extends RecyclerView.Adapter<MyAdpter.MyViewHolder> implements View.OnClickListener, View.OnLongClickListener {
  12. private Context context;
  13. private List<String> list;
  14. private OnRecyclerviewItemClickListener mOnRecyclerviewItemClickListener = null;
  15. public MyAdpter(Context context, List<String> list, OnRecyclerviewItemClickListener onRecyclerviewItemClickListener) {
  16. this.context = context;
  17. this.list = list;
  18. this.mOnRecyclerviewItemClickListener = onRecyclerviewItemClickListener;
  19. }
  20. @NonNull
  21. @Override
  22. public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  23. View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
  24. view.setOnClickListener(this);
  25. view.setOnLongClickListener(this);
  26. MyViewHolder viewHolder = new MyViewHolder(view);
  27. return viewHolder;
  28. }
  29. @Override
  30. public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
  31. String s = list.get(position);
  32. holder.textView.setText(s);
  33. holder.imageView.setImageResource(R.mipmap.ic_launcher);
  34. holder.itemView.setTag(position);//给view设置tag以作为参数传递到监听回调方法中
  35. }
  36. @Override
  37. public void onClick(View v) {
  38. //将监听传递给自定义接口
  39. mOnRecyclerviewItemClickListener.onItemClickListener(v, ((int) v.getTag()));
  40. }
  41. @Override
  42. public int getItemCount() {
  43. return list.size();
  44. }
  45. @Override
  46. public boolean onLongClick(View v) {
  47. mOnRecyclerviewItemClickListener.onItemLongClickListener(v, ((int) v.getTag()));
  48. return true;
  49. }
  50. static class MyViewHolder extends RecyclerView.ViewHolder {
  51. ImageView imageView;
  52. TextView textView;
  53. public MyViewHolder(View itemView) {
  54. super(itemView);
  55. imageView = itemView.findViewById(R.id.imageView);
  56. textView = itemView.findViewById(R.id.textView);
  57. }
  58. }
  59. public interface OnRecyclerviewItemClickListener {
  60. void onItemClickListener(View v, int position);
  61. void onItemLongClickListener(View v, int position);
  62. }
  63. }

activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <android.support.v4.widget.SwipeRefreshLayout
  6. android:id="@+id/fresh"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent">
  9. <android.support.v7.widget.RecyclerView
  10. android:id="@+id/recycleView"
  11. android:layout_width="match_parent"
  12. android:layout_height="match_parent">
  13. </android.support.v7.widget.RecyclerView>
  14. </android.support.v4.widget.SwipeRefreshLayout>
  15. </LinearLayout>

item.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="horizontal">
  6. <ImageView
  7. android:id="@+id/imageView"
  8. android:layout_width="50dp"
  9. android:layout_height="50dp"
  10. android:src="@mipmap/ic_launcher" />
  11. <TextView
  12. android:id="@+id/textView"
  13. android:layout_width="match_parent"
  14. android:layout_height="50dp"
  15. android:gravity="center"
  16. android:text="你好"
  17. android:textSize="20dp" />
  18. </LinearLayout>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注