Ok+Recyclerview+butterknife

  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>

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值