详细RecyclerView实现代码
详细RecyclerView实现代码只供理解关键监听部分代码参考
Activity
package com.shashank.platform.Activity.activity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.net.wifi.aware.DiscoverySession;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.shashank.platform.Activity.adapter.MyRecyclerViewAdapter;
import com.shashank.platform.Activity.bean.MyVedio;
import com.shashank.platform.Activity.bean.Student;
import com.shashank.platform.Activity.utils.ACache;
import com.shashank.platform.Activity.utils.OkHttpUtil;
import com.shashank.platform.loginui.R;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;
import java.lang.reflect.Type;
import java.util.List;
import okhttp3.Call;
public class ShortcutActivity extends AppCompatActivity implements View.OnClickListener {
private ImageView shortcut_home;
private ImageView shortcut_shortcut;
private ImageView shortcut_user;
//recyclerview
private RecyclerView recyclerView;
private List<MyVedio> list;
private MyRecyclerViewAdapter myAdapte1r;
private Handler mhandler;
private int GET=1;
@SuppressLint("HandlerLeak")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shortcut);
//隐藏菜单栏
getSupportActionBar().hide();
//去除状态栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
ACache aCache=ACache.get(this);
String studentJson = aCache.getAsString("student");
if (studentJson!=null){
Gson gson = new Gson();
Student student = gson.fromJson(studentJson, Student.class);
getUtilsRequest(student.getStudentid());
}
findViewAndOnclick();
mhandler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == GET) {
list = (List<MyVedio>) msg.obj;
System.out.println(list.size());
myAdapte1r = new MyRecyclerViewAdapter(list);
recyclerView = (RecyclerView) findViewById(R.id.message_notice_list_item);
//纵向线性布局
//LinearLayoutManager layoutManager = new LinearLayoutManager(this);
//纵向线性布局
GridLayoutManager layoutManager = new GridLayoutManager(ShortcutActivity.this, 2);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(myAdapte1r);
//====================================重点部分==============================
myAdapte1r.setOnClickListener(new MyRecyclerViewAdapter.OnClickListener() {
@Override
public void onClick(View itemView, int position) {
String vediourl = list.get(position).getVediourl();
String vediodesc = list.get(position).getVediodesc();
Intent intent=new Intent(ShortcutActivity.this,TwopageActivity.class);
intent.putExtra("vediourl",vediourl);
intent.putExtra("vedioname",vediodesc);
startActivity(intent);
}
@Override
public void onLongClick(View itemView, int position) {
// longClick...
}
});
}
}
};
}
//============================================================
public void findViewAndOnclick(){
shortcut_home = findViewById(R.id.shortcut_home);
shortcut_home.setOnClickListener(this);
shortcut_shortcut = findViewById(R.id.shortcut_shortcut);
shortcut_shortcut.setOnClickListener(this);
shortcut_user = findViewById(R.id.shortcut_user);
shortcut_user.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.shortcut_home:
Intent homeIntent = new Intent(ShortcutActivity.this,HomeActivity.class);
startActivity(homeIntent);
break;
case R.id.shortcut_shortcut:
Intent shortcutIntent = new Intent(ShortcutActivity.this,ShortcutActivity.class);
startActivity(shortcutIntent);
break;
case R.id.shortcut_user:
Intent userIntent = new Intent(ShortcutActivity.this,UserActivity.class);
startActivity(userIntent);
break;
}
}
// get请求请求listview所需要的数据
public void getUtilsRequest(int studentid){
String baseUrl=new OkHttpUtil().getBaseUrl();
String url = baseUrl+"/studydog/getstudentvedio";
OkHttpUtils
.get()
.url(url)
.addParams("studentid", String.valueOf(studentid))
.build()
.execute(new MyStringCallback());
}
//get请求回调函数
private class MyStringCallback extends StringCallback {
@Override
public void onError(Call call, Exception e, int id) {
System.out.println(e.getMessage());
}
@Override
public void onResponse(String response, int id) {
Type type = new TypeToken<List<MyVedio>>() {}.getType();
List<MyVedio> vedioLists = new Gson().fromJson(response, type);
Message message= Message.obtain();
message.what=GET;
message.obj=vedioLists;
mhandler.sendMessage(message);
Log.i(ShortcutActivity.class.getSimpleName()+"123",response);
}
}
}
Adapter
package com.shashank.platform.Activity.adapter;
/**
* Create by bab on 2020/4/22
**/
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.shashank.platform.Activity.bean.MyVedio;
import com.shashank.platform.loginui.R;
import java.util.List;
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder>{
private List<MyVedio> mList;
/**
* adapter 中item点击事件的监听对象.
*/
private OnClickListener onClickListener;
public OnClickListener getOnClickListener() {
return onClickListener;
}
public void setOnClickListener(OnClickListener onClickListener) {
this.onClickListener = onClickListener;
}
static class ViewHolder extends RecyclerView.ViewHolder{
View myView;
ImageView imageView;
TextView title;
public ViewHolder(View itemView) {
super(itemView);
myView = itemView;
//获取辅助页面的值
imageView = (ImageView) itemView.findViewById(R.id.iv_image);
title = (TextView) itemView.findViewById(R.id.tv_title);
}
}
//入口,开局一个list
public MyRecyclerViewAdapter(List<MyVedio> list){
this.mList = list;
}
//通过viewholder构造函数返回一个viewholder
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//获取辅助视图,并传入构造viewholder
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_main_notice_list,null);
final ViewHolder holder = new ViewHolder(view);
return holder;
}
//将数据绑定到控件上
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
MyVedio bean = mList.get(position);
final View itemView = holder.itemView;
holder.imageView.setBackgroundResource(R.drawable.lunbo3);
holder.title.setText(bean.getVediodesc());
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 设置单击事件并回调给页面
if (onClickListener != null) {
onClickListener.onClick(itemView, holder.getLayoutPosition());
}
}
});
}
@Override
public int getItemCount() {
return mList.size();
}
//下面两个方法提供给页面刷新和加载时调用
public void add(List<MyVedio> addMessageList) {
//增加数据
int position = mList.size();
mList.addAll(position, addMessageList);
notifyItemInserted(position);
}
public void refresh(List<MyVedio> newList) {
//刷新数据
mList.removeAll(mList);
mList.addAll(newList);
notifyDataSetChanged();
}
/**
* 定义点击事件回调接口.
*/
public interface OnClickListener {
/**
* 点击事件.
*/
void onClick(View itemView, int position);
/**
* 长点击事件.
*/
void onLongClick(View itemView, int position);
}
}
关键代码分析
首先,定义监听器接口(可以在Adapter内部进行定义)
/**
* 定义点击事件回调接口.
*/
public interface OnClickListener {
/**
* 点击事件.
*/
void onClick(View itemView, int position);
/**
* 长点击事件.
*/
void onLongClick(View itemView, int position);
}
在Adapter中进行依赖,定义get,set方法
/**
* adapter 中item点击事件的监听对象.
*/
private OnClickListener onClickListener;
public OnClickListener getOnClickListener() {
return onClickListener;
}
public void setOnClickListener(OnClickListener onClickListener) {
this.onClickListener = onClickListener;
}
在Adapter中进行设置监听事件
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onClickListener != null) {
onClickListener.onClick(itemView, holder.getLayoutPosition());
}
}
});
判断onClickListener是否为空,不为空则进行调用。而这里的onClickListener对象通过本Adapter的setOnClickListener()进行实例化,调用此方法的则为Activity中的adapter对象,并传入OnClickListener对象实例化。
Activity代码如下
//通过此方法进行实例化onClickListener对象,然后根据传入的对象,反过来调用
//该类重写的方法,实现监听 ,此内部类相当于对接口的实现类并重写其方法。
//Activity加载时,就进行实例化自定义监听器
myAdapte1r.setOnClickListener(new MyRecyclerViewAdapter.OnClickListener() {
@Override
public void onClick(View itemView, int position) {
/*写上你自己的内部逻辑
String vediourl = list.get(position).getVediourl();
String vediodesc = list.get(position).getVediodesc();
Intent intent=new Intent(ShortcutActivity.this,TwopageActivity.class);
intent.putExtra("vediourl",vediourl);
intent.putExtra("vedioname",vediodesc);
startActivity(intent);*/
}
@Override
public void onLongClick(View itemView, int position) {
// longClick...
}
});
}
}
};
思路解析:点击事件发生,判断onClicklistener是否实例化,实例化则进行方法的调用,传入参数,实现逻辑间接实现监听。
相比于ListView: RecyclerView并没有自己的监听器,而是通过Adapter中对组件的监听实现。