android實(shí)現(xiàn)按鈕獲取焦點(diǎn)延遲加載
看到京東電視app的按鈕獲取焦點(diǎn)后才加載數(shù)據(jù),之前網(wǎng)上沒找到好的說法,所以自己實(shí)現(xiàn)了記錄一下以便后續(xù)學(xué)習(xí)。
主要是按鈕獲取焦點(diǎn)以后,初始化一個(gè)定時(shí)器Timer延遲500ms加載數(shù)據(jù),如果失去焦點(diǎn),取消這個(gè)定時(shí)器就ok了。其實(shí)原理很簡(jiǎn)單,下面是我實(shí)現(xiàn)的一個(gè)效果。
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();
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Fragment通過FragmentManager實(shí)現(xiàn)通信功能詳細(xì)講解
這篇文章主要介紹了Fragment通過FragmentManager實(shí)現(xiàn)通信功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
Android簡(jiǎn)單創(chuàng)建一個(gè)Activity的方法
這篇文章主要介紹了Android簡(jiǎn)單創(chuàng)建一個(gè)Activity的方法,結(jié)合圖文形式分析了Android創(chuàng)建Activity的具體步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-04-04
Android編程ViewPager回彈效果實(shí)例分析
這篇文章主要介紹了Android編程ViewPager回彈效果,以實(shí)例形式較為詳細(xì)的分析了ViewPager回彈效果的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
android實(shí)現(xiàn)常駐通知欄遇到的問題及解決辦法
這篇文章主要介紹了android實(shí)現(xiàn)常駐通知欄遇到的問題及解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
Android中新引進(jìn)的Google Authenticator驗(yàn)證系統(tǒng)工作原理淺析
這篇文章主要介紹了Android中新引進(jìn)的Google Authenticator驗(yàn)證系統(tǒng)工作原理淺析,需要的朋友可以參考下2014-10-10
Java語言讀取配置文件config.properties的方法講解
今天小編就為大家分享一篇關(guān)于Java語言讀取配置文件config.properties的方法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
Android開發(fā)組件化架構(gòu)設(shè)計(jì)原理到實(shí)戰(zhàn)
這篇文章主要為大家介紹了Android開發(fā)組件化架構(gòu)設(shè)計(jì)原理到實(shí)戰(zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Android拼圖游戲 玩轉(zhuǎn)從基礎(chǔ)到應(yīng)用手勢(shì)變化
這篇文章主要介紹了Android拼圖游戲的實(shí)現(xiàn)方法,教大家玩轉(zhuǎn)從基礎(chǔ)到應(yīng)用手勢(shì)變化,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10

