主页面
package com.example.rk_recycleview; import android.annotation.SuppressLint; import android.content.DialogInterface; import android.os.Message; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.os.Handler; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; import android.widget.Toast; import com.google.gson.Gson; import java.io.IOException; import java.util.List; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final int SUCCESS = 492; private View ll; private View bg; private View pb; private MyAdapter adapter; private List<SuperClass.DataBean> list; @SuppressLint("HandlerLeak") //使用handler进行gson解析 Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); String json = (String) msg.obj; Gson gson = new Gson(); SuperClass superClass = gson.fromJson(json, SuperClass.class); list = superClass.getData(); adapter = new MyAdapter(list,MainActivity.this); rv.setAdapter(adapter); } }; private RecyclerView rv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化 initView(); } private void initView() { ll = findViewById(R.id.ll); bg = findViewById(R.id.bg); pb = findViewById(R.id.pb); rv = findViewById(R.id.rv); ll.setOnClickListener(this); bg.setOnClickListener(this); pb.setOnClickListener(this); //长按删除 rv.addOnItemTouchListener(new RecyclerViewClickListener(this, new RecyclerViewClickListener.OnItemClickListener() { @Override public void onItemClick(View view, final int position) { //设置提示框 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); //提示内容 builder.setMessage("是否删除?"); //提示头 builder.setTitle("提示"); //确定按钮 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //吐司 Toast.makeText(MainActivity.this,"已删除",Toast.LENGTH_SHORT).show(); //关闭弹框 dialog.dismiss(); //删除 list.remove(position); //刷新适配器 adapter.notifyDataSetChanged(); } }); //取消按钮 builder.setNegativeButton("取消",null); //执行展示 builder.create().show(); } @Override public void onItemLongClick(View view, final int position) { } })); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.ll: getpost(); //线性布局 rv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)); break; case R.id.bg: //表格布局 rv.setLayoutManager(new GridLayoutManager(this,3)); break; case R.id.pb: //瀑布式布局 rv.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)); break; } } //post解析 public void getpost() { OkHttpClient client = new OkHttpClient(); Request builder = new Request.Builder() .url("https://www.zhaoapi.cn/product/getCatagory") .build(); client.newCall(builder).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); Message message = handler.obtainMessage(); message.obj = string; message.what = SUCCESS; handler.sendMessage(message); } }); return ; } //长按删除 public void getselect() { return ; } }
适配器
package com.example.rk_recycleview; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.List; /** * data:2018/05/24. * author : 殷成龙(Administrator) * function : */ public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<SuperClass.DataBean> list; private Context context; public MyAdapter(List<SuperClass.DataBean> list, Context context) { this.list = list; this.context = context; } //获取条目布局 @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } //给控件赋值 @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.tv.setText(list.get(position).getName()); ImageLoader.getInstance().displayImage(list.get(position).getIcon(),holder.img); } //数量 @Override public int getItemCount() { return list.size(); } //ViewHolder public class ViewHolder extends RecyclerView.ViewHolder{ private final ImageView img; private final TextView tv; public ViewHolder(View itemView) { super(itemView); img = itemView.findViewById(R.id.img); tv = itemView.findViewById(R.id.tv); } } }
方法工具类
package com.example.rk_recycleview; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.widget.AdapterView; public class RecyclerViewClickListener implements RecyclerView.OnItemTouchListener { private int mLastDownX, mLastDownY; //该值记录了最小滑动距离 private int touchSlop; private OnItemClickListener mListener; //是否是单击事件 private boolean isSingleTapUp = false; //是否是长按事件 private boolean isLongPressUp = false; private boolean isMove = false; private long mDownTime; //内部接口,定义点击方法以及长按方法 public interface OnItemClickListener { void onItemClick(View view, int position); void onItemLongClick(View view, int position); } public RecyclerViewClickListener(Context context, OnItemClickListener listener) { touchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); mListener = listener; } @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { int x = (int) e.getX(); int y = (int) e.getY(); switch (e.getAction()) { /** * 如果是ACTION_DOWN事件,那么记录当前按下的位置, * 记录当前的系统时间。 */ case MotionEvent.ACTION_DOWN: mLastDownX = x; mLastDownY = y; mDownTime = System.currentTimeMillis(); isMove = false; break; /** * 如果是ACTION_MOVE事件,此时根据TouchSlop判断用户在按下的时候是否滑动了, * 如果滑动了,那么接下来将不处理点击事件 */ case MotionEvent.ACTION_MOVE: if (Math.abs(x - mLastDownX) > touchSlop || Math.abs(y - mLastDownY) > touchSlop) { isMove = true; } break; /** * 如果是ACTION_UP事件,那么根据isMove标志位来判断是否需要处理点击事件; * 根据系统时间的差值来判断是哪种事件,如果按下事件超过1ms,则认为是长按事件, * 否则是单击事件。 */ case MotionEvent.ACTION_UP: if (isMove) { break; } if (System.currentTimeMillis() - mDownTime > 1000) { isLongPressUp = true; } else { isSingleTapUp = true; } break; } if (isSingleTapUp) { //根据触摸坐标来获取childView View childView = rv.findChildViewUnder(e.getX(), e.getY()); isSingleTapUp = false; if (childView != null) { //回调mListener#onItemClick方法 mListener.onItemClick(childView, rv.getChildLayoutPosition(childView)); return true; } return false; } if (isLongPressUp) { View childView = rv.findChildViewUnder(e.getX(), e.getY()); isLongPressUp = false; if (childView != null) { mListener.onItemLongClick(childView, rv.getChildLayoutPosition(childView)); return true; } return false; } return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }
图片工具类
package com.example.rk_recycleview; import android.app.Application; import android.os.Environment; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; import java.io.File; /** * data:2018/05/21. * author : 殷成龙(Administrator) * function :图片工具类 */ public class App extends Application { @Override public void onCreate() { super.onCreate(); File file = new File(Environment.getExternalStorageDirectory() + "/" + "image"); ImageLoaderConfiguration build = new ImageLoaderConfiguration.Builder(this) //设置缓存地址 .diskCache(new UnlimitedDiskCache(file)) //关联getimg .defaultDisplayImageOptions(getimg()) //内存缓存20M .memoryCacheSize(2 * 1024 * 1024) //可以缓存文件数量 .diskCacheFileCount(100) //线程池数量 .threadPoolSize(3) .build(); ImageLoader.getInstance().init(build); } public DisplayImageOptions getimg() { DisplayImageOptions img = new DisplayImageOptions.Builder() //加载时显示的图片 .showImageOnLoading(R.mipmap.ic_launcher) .showImageOnFail(R.mipmap.ic_launcher) .showImageForEmptyUri(R.mipmap.ic_launcher) //设置圆角 .displayer(new RoundedBitmapDisplayer(25)) .build(); return img; } }
数据
package com.example.rk_recycleview; import java.util.List; /** * data:2018/05/24. * author : 殷成龙(Administrator) * function : */ public class SuperClass { /** * msg : * code : 0 * data : [{"cid":1,"createtime":"2017-10-10T19:41:39","icon":"http://120.27.23.105/images/category/shop.png","ishome":1,"name":"京东超市"},{"cid":2,"createtime":"2017-10-10T19:41:39","icon":"http://120.27.23.105/images/category/qqg.png","ishome":1,"name":"全球购"},{"cid":3,"createtime":"2017-10-10T19:45:11","icon":"http://120.27.23.105/images/category/phone.png","ishome":1,"name":"手机数码"},{"cid":5,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/man.png","ishome":1,"name":"男装"},{"cid":6,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/girl.png","ishome":1,"name":"女装"},{"cid":7,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/manshoe.png","ishome":1,"name":"男鞋"},{"cid":8,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/girlshoe.png","ishome":1,"name":"女鞋"},{"cid":9,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/shirt.png","ishome":1,"name":"内衣配饰"},{"cid":10,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/bag.png","ishome":1,"name":"箱包手袋"},{"cid":11,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/beauty.png","ishome":1,"name":"美妆个护"},{"cid":12,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/jewel.png","ishome":1,"name":"钟表珠宝"},{"cid":13,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/luxury.png","ishome":1,"name":"奢侈品"},{"cid":14,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/computer.png","ishome":1,"name":"电脑办公"},{"cid":15,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"家用电器"},{"cid":16,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"食品生鲜"},{"cid":17,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"酒水饮料"},{"cid":18,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"母婴童装"},{"cid":19,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"玩具乐器"},{"cid":20,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"医药保健"}] */ private String msg; private String code; private List<DataBean> data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { /** * cid : 1 * createtime : 2017-10-10T19:41:39 * icon : http://120.27.23.105/images/category/shop.png * ishome : 1 * name : 京东超市 */ private int cid; private String createtime; private String icon; private int ishome; private String name; public int getCid() { return cid; } public void setCid(int cid) { this.cid = cid; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public int getIshome() { return ishome; } public void setIshome(int ishome) { this.ishome = ishome; } public String getName() { return name; } public void setName(String name) { this.name = name; } } }
主页面布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.rk_recycleview.MainActivity"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="线性布局" android:id="@+id/ll"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="表格布局" android:id="@+id/bg"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="瀑布流" android:id="@+id/pb"/> </LinearLayout> <android.support.v7.widget.RecyclerView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/rv"/> </LinearLayout>
控件布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:orientation="vertical" android:layout_gravity="center" android:gravity="center" android:layout_marginLeft="30dp" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/img"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv"/> </LinearLayout>
依赖
implementation 'com.android.support:recyclerview-v7:26.1.0' compile 'com.squareup.okhttp3:okhttp:3.4.2' implementation files('libs/gson-2.8.0.jar') implementation files('libs/universal-image-loader-1.9.5.jar')
清单文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.rk_recycleview"> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <application android:name=".App" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>