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();
        }

    }

}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值