Ok+Recyclerview+butterknife

来源:互联网 发布:便宜的零食 知乎 编辑:程序博客网 时间:2024/06/16 00:47
  1. 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>

大功告成,小伙伴们,哪还有不懂得地方请评论和回馈。谢谢。

原创粉丝点击