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

Novia ·
更新时间:2024-09-20
· 804 次阅读

看到京东电视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(); } } } 您可能感兴趣的文章:Android实现延迟的几种方法小结Android 三种延迟操作的实现方法Android延迟实现的几种解决方法及原理分析



延迟加载 按钮 Android

需要 登录 后方可回复, 如果你还没有账号请 注册新账号