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>
大功告成,小伙伴们,哪还有不懂得地方请评论和回馈。谢谢。