Ok+Recyclerview+butterknife
来源:互联网 发布:便宜的零食 知乎 编辑:程序博客网 时间:2024/06/16 06:17
OK异步请求网络数据,RecyclerView展示数据,通过接口回掉,点击弹出文内容,长按删除
- BaseActivity(封装类)
public abstract class BaseActivity extends Activity { Unbinder binder; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(getLayoutID()); //注入 binder = ButterKnife.bind(this); initView(); initData(); } public abstract int getLayoutID(); public abstract void initView(); public abstract void initData(); @Override protected void onDestroy() { super.onDestroy(); if (binder!=null){ binder.unbind(); } }}
- 导入依赖
compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.0' compile 'com.squareup.okhttp3:okhttp:3.8.1' compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' compile 'com.github.bumptech.glide:glide:4.0.0' compile 'com.google.code.gson:gson:2.8.1'
- 访问网络权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
- MainActivity主方法
public class MainActivity extends BaseActivity { private Bean bean; @BindView(R.id.recy_main) RecyclerView recyMain; @BindView(R.id.swipe_main) SwipeRefreshLayout swipeMain; private MyRecyclerAdapter adapter; private List<Bean.DataBean> list = new ArrayList<>(); @Override public int getLayoutID() { return R.layout.activity_main; } @Override public void initView() { LinearLayoutManager layoutManager = new LinearLayoutManager(this); //设置布局管理器 recyMain.setLayoutManager(layoutManager); //设置为垂直布局,这也是默认的。 layoutManager.setOrientation(OrientationHelper.VERTICAL); //设置分割线 recyMain.addItemDecoration(new RecycleViewDivider(this, OrientationHelper.HORIZONTAL)); //设置增加或删除条目的动画 recyMain.setItemAnimator(new DefaultItemAnimator()); //刷新的进度设置 颜色 swipeMain.setColorSchemeColors(Color.RED,Color.YELLOW); } @Override public void initData() { OkHttpClient ok = new OkHttpClient(); Request request = new Request.Builder() .url("http://www.yulin520.com/a2a/impressApi/news/mergeList?sign=C7548DE604BCB8A17592EFB9006F9265&pageSize=20&gender=2&ts=1871746850&page=1") .build(); Call call = ok.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { Gson gson = new Gson(); String str = response.body().string(); bean = gson.fromJson(str, Bean.class); list.addAll(bean.getData()); runOnUiThread(new Runnable() { @Override public void run() { adapter = new MyRecyclerAdapter(MainActivity.this, list); recyMain.setAdapter(adapter); adapter.setOnItemClickListener(new MyRecyclerAdapter.OnItemClickListener() { @Override public void onOnItemClick(View view, int position) { //点击弹出text文字 Toast.makeText(MainActivity.this, "点击了:" + list.get(position).getTitle(), Toast.LENGTH_SHORT).show(); } @Override public void onOnItemlongClick(View view, int position) { //长按删除 list.remove(position); adapter.notifyItemRemoved(position); } }); } }); } }); }}
- main布局
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipe_main" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recy_main" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </android.support.v4.widget.SwipeRefreshLayout>
- MyRecyclerAdapter 适配器
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> { private Context context; private List<Bean.DataBean> list; private LayoutInflater inflater; private OnItemClickListener mItemClickListener; public MyRecyclerAdapter(Context context, List<Bean.DataBean> list) { this.context = context; this.list = list; inflater = LayoutInflater.from(context); } //条目点击时候的回调接口 public interface OnItemClickListener { //条目被点击时触发的回调 void onOnItemClick(View view, int position); //长按时触发的回调 void onOnItemlongClick(View view, int position); } //定义一个设置点击监听器的方法 public void setOnItemClickListener(OnItemClickListener itemClickListener) { this.mItemClickListener = itemClickListener; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //填充布局 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false); MyViewHolder holder = new MyViewHolder(view); return holder; } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { holder.tv.setText(list.get(position).getTitle()); Glide.with(context).load(list.get(position).getImg()).into(holder.img); // 如果回调,则设置点击事件 if (mItemClickListener != null) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //得到当前点击item的位置pos int position = holder.getLayoutPosition(); //把事件交给我们实现的接口那里处理 mItemClickListener.onOnItemClick(holder.itemView, position); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { //得到当前点击item的位置pos int position = holder.getLayoutPosition(); //把事件交给我们实现的接口那里处理 mItemClickListener.onOnItemlongClick(holder.itemView, position); return true; } }); } } @Override public int getItemCount() { return list.size(); } public class MyViewHolder extends RecyclerView.ViewHolder { TextView tv; ImageView img; public MyViewHolder(View itemView) { super(itemView); tv = itemView.findViewById(R.id.text_recycler); img = itemView.findViewById(R.id.img_recycler); } }}
- 自定义分割线 RecycleViewDivider
public class RecycleViewDivider extends RecyclerView.ItemDecoration { private Paint mPaint; private Drawable mDivider; private int mDividerHeight = 2;//分割线高度,默认为1px private int mOrientation;//列表的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; /** * 默认分割线:高度为2px,颜色为灰色 * * @param context * @param orientation 列表方向 */ public RecycleViewDivider(Context context, int orientation) { if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) { throw new IllegalArgumentException("请输入正确的参数!"); } mOrientation = orientation; final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); } /** * 自定义分割线 * * @param context * @param orientation 列表方向 * @param drawableId 分割线图片 */ public RecycleViewDivider(Context context, int orientation, int drawableId) { this(context, orientation); mDivider = ContextCompat.getDrawable(context, drawableId); mDividerHeight = mDivider.getIntrinsicHeight(); } /** * 自定义分割线 * * @param context * @param orientation 列表方向 * @param dividerHeight 分割线高度 * @param dividerColor 分割线颜色 */ public RecycleViewDivider(Context context, int orientation, int dividerHeight, int dividerColor) { this(context, orientation); mDividerHeight = dividerHeight; mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(dividerColor); mPaint.setStyle(Paint.Style.FILL); } //获取分割线尺寸 @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); outRect.set(0, 0, 0, mDividerHeight); } //绘制分割线 @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); if (mOrientation == LinearLayoutManager.VERTICAL) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } } //绘制横向 item 分割线 private void drawHorizontal(Canvas canvas, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getMeasuredWidth() - parent.getPaddingRight(); final int childSize = parent.getChildCount(); for (int i = 0; i < childSize; i++) { final View child = parent.getChildAt(i); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); final int top = child.getBottom() + layoutParams.bottomMargin; final int bottom = top + mDividerHeight; if (mDivider != null) { mDivider.setBounds(left, top, right, bottom); mDivider.draw(canvas); } if (mPaint != null) { canvas.drawRect(left, top, right, bottom, mPaint); } } } //绘制纵向 item 分割线 private void drawVertical(Canvas canvas, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom(); final int childSize = parent.getChildCount(); for (int i = 0; i < childSize; i++) { final View child = parent.getChildAt(i); RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); final int left = child.getRight() + layoutParams.rightMargin; final int right = left + mDividerHeight; if (mDivider != null) { mDivider.setBounds(left, top, right, bottom); mDivider.draw(canvas); } if (mPaint != null) { canvas.drawRect(left, top, right, bottom, mPaint); } } }}
- 适配器布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/text_recycler" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:textColor="#f000" android:text="zzzz"/> <ImageView android:id="@+id/img_recycler" android:layout_width="match_parent" android:layout_height="100dp" android:src="@mipmap/ic_launcher"/></LinearLayout>
大功告成,小伙伴们,哪还有不懂得地方请评论和回馈。谢谢。
阅读全文
0 0
- Ok+Recyclerview+butterknife
- RecyclerView.Adapter结合ButterKnife封装
- Tablayout+recyclerview+ok+ 购物车见下文
- ButterKnife结合RecyclerView.Adapter一起使用
- ButterKnife结合RecyclerView.Adapter一起使用
- RecyclerView的用法和ButterKnife的配置
- ButterKnife在RecyclerView adapter中的使用
- Studio使用ButterKnife和RecyclerView的简单配置
- RecyclerView+ButterKnife点击按钮进行布局切换与添加删除
- MVP+Retrofit+Rxjava+ButterKnife+Fresco+Recyclerview+GreenDao+泛型+完整Demo
- Fresco+RecyclerView+OkHttp+ButterKnife传值+条目点击跳转
- ok
- OK!
- ok
- oK
- ok
- ok
- ok
- 第一篇
- 使用Qt将一系列图片通过网络发送到客户端动态显示的参考代码(修改一下可以用作远程网络监控)
- B
- 如何识别金笛短信猫型号
- 查找某个文件夹位置的命令
- Ok+Recyclerview+butterknife
- 欢迎使用CSDN-markdown编辑器
- 机器学习路线
- html5本地数据库 Web Sql Database
- Freagmentparge(滑动)
- The 踩坑:android gradle plugin version 3.0.0-alpha1 is too old, update to the latest version
- 前端学习-CSS-03
- 程序猿谈恋爱什么的·QT自定义符文旋转按钮
- 组装计算机基本知识