RecyclerView监听实现,实例解析

详细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中对组件的监听实现。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值