android实现按钮获取焦点延迟加载

时间:2021-05-20

看到京东电视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(); } }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章