android实现按钮获取焦点延迟加载
时间:2019-04-07
本文章向大家介绍android实现按钮获取焦点延迟加载,主要包括android实现按钮获取焦点延迟加载使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
看到京东电视app的按钮获取焦点后才加载数据,之前网上没找到好的说法,所以自己实现了记录一下以便后续学习。
主要是按钮获取焦点以后,初始化一个定时器Timer延迟500ms加载数据,如果失去焦点,取消这个定时器就ok了。其实原理很简单,下面是我实现的一个效果。
package com.longmaster.iptv.health.DoctorP2P.mode; import android.content.Context; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.RelativeLayout; import com.longmaster.iptv.health.R; import com.longmaster.iptv.health.common.Constants; import com.longmaster.iptv.health.widget.MagicTextView.MagicTextView; import org.VideoWebInterface.DepartmentParam; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import cn.longmaster.lmkit.event.MessageProxy; import cn.longmaster.lmkit.utils.AppLogger; /** * Created by yzq on 2017/5/8 */ public class ButtonAdapter extends RecyclerView.Adapter<ButtonAdapter.MyViewHolder> { private List<DepartmentParam> mDepartmentList = new ArrayList<>(); private LayoutInflater mInflater; private Context mContext; private boolean mIsLostFocus = false; private LinearLayoutManager mLinearLayoutManager; private RecyclerView mRecyclerView; private TimerTask mTimerTask; private Timer mTimer; private boolean isLoadData = true; public ButtonAdapter(Context context) { super(); this.mContext = context; mInflater = LayoutInflater.from(context); } public void setLayoutManager(LinearLayoutManager linearLayoutManager, RecyclerView re) { mLinearLayoutManager = linearLayoutManager; mRecyclerView = re; } public void setDepartmentList(List list) { mDepartmentList = list; } public void setFocus(boolean isFocus) { mIsLostFocus = isFocus; } public void setIsLoadData(boolean isLoadData) { this.isLoadData = isLoadData; } public void clear() { mDepartmentList.clear(); } @Override public int getItemCount() { return mDepartmentList.size(); } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { holder.tv.setText(mDepartmentList.get(position).GetDeptName()); holder.tv.setFocusable(true); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.list_class_item, parent, false); MyViewHolder holder = new MyViewHolder(view); return holder; } class MyViewHolder extends RecyclerView.ViewHolder { MagicTextView tv; RelativeLayout mOuterBgRL; public MyViewHolder(final View view) { super(view); RecyclerView.LayoutParams param = (RecyclerView.LayoutParams) itemView.getLayoutParams(); param.height = LinearLayout.LayoutParams.WRAP_CONTENT; param.width = LinearLayout.LayoutParams.MATCH_PARENT; itemView.setVisibility(View.VISIBLE); tv = (MagicTextView) view.findViewById(R.id.class_name); mOuterBgRL = (RelativeLayout) view.findViewById(R.id.rl_class_outer_bg); tv.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { mOuterBgRL.setBackgroundResource(R.drawable.p2p_select); if (isLoadData) { mTimerTask = new TimerTask() { @Override public void run() { int iPosition = getAdapterPosition(); DepartmentParam departmentParam = mDepartmentList.get(iPosition); MessageProxy.sendMessage(Constants.Message.P2P_SELECTION_DOCTOR_CLASS, iPosition, departmentParam); } }; mTimer = new Timer(); mTimer.schedule(mTimerTask, 500); } } else { clearTimer(); if (mIsLostFocus) { mOuterBgRL.setBackgroundResource(R.drawable.p2p_unselect); } } } }); tv.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { int mCurrentSelectPosition = getAdapterPosition(); int mDepartmentCount = mDepartmentList.size(); AppLogger.e("mCurrentSelectPosition>>>>>>>>", mCurrentSelectPosition + "----" + mDepartmentCount); switch (keyCode) { case KeyEvent.KEYCODE_DPAD_LEFT: setIsLoadData(true); setFocus(true); if (mCurrentSelectPosition == (mLinearLayoutManager.findFirstVisibleItemPosition())) { mRecyclerView.smoothScrollBy(-400, 0); } View view1 = mLinearLayoutManager.findViewByPosition(mCurrentSelectPosition - 1); if (view1 != null) { setViewFocus(view1.findViewById(R.id.class_name)); } return true; case KeyEvent.KEYCODE_DPAD_RIGHT: if (mCurrentSelectPosition == mDepartmentCount - 1) { return true; } setIsLoadData(true); setFocus(true); if (mCurrentSelectPosition == (mLinearLayoutManager.findLastVisibleItemPosition())) { mRecyclerView.smoothScrollBy(400, 0); } View view = mLinearLayoutManager.findViewByPosition(mCurrentSelectPosition + 1); if (view != null) { setViewFocus(view.findViewById(R.id.class_name)); } return true; case KeyEvent.KEYCODE_BACK: break; case KeyEvent.KEYCODE_DPAD_UP: break; case KeyEvent.KEYCODE_DPAD_DOWN: setFocus(false); mOuterBgRL.setBackgroundResource(R.drawable.p2p_key_down); break; } } return false; } }); } } public void setViewFocus(View view) { view.setFocusable(true); view.setFocusableInTouchMode(true); view.requestFocus(); view.requestFocusFromTouch(); } private void clearTimer() { if (mTimer != null) { mTimer.cancel(); } if (mTimerTask != null) { mTimerTask.cancel(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 【一天一大 lee】两数相加 (难度:中等) - Day20201004
- 历经14天自定义3个注解解决项目的3个Swagger难题
- 【一天一大 lee】秋叶收藏集 (难度:中等) - Day20201001
- 【译文】Facebook工程师谈运维工作的未来
- 【一天一大 lee】环形链表II (难度:中等) - Day20201010
- 【西法带你学算法】一次搞定前缀和
- 一文快速入门分库分表中间件 Sharding-JDBC (必修课)
- 求求你别再用System.out.println 了!!
- 为什么阿里巴巴Java开发手册中强制要求超大整数禁止使用Long类型返回?
- 独家 | 教你用Python来计算偏差-方差权衡
- 使用 KinD 加速 CI/CD 流水线
- 使用 Docker 加速开发工作流
- Kubernetes CRD 自定义控制器
- 推荐算法之: LFM 推荐算法
- 推荐算法之: DeepFM及使用DeepCTR测试