两个listview之间焦点切换, 如何将焦点落在之前所处位置

来源:互联网 发布:高速公路车流量数据 编辑:程序博客网 时间:2024/06/08 18:55
图一: 焦点在频道列表时


图二:焦点切换到节目列表时


如上图,要实现频道列表中的字体有三种颜色状态 , 没有焦点时的颜色 #a0b1b5b7, 选中时候的字体颜色#ffe8e8e8b 和 焦点离开的时候字体颜色#ff1198ff

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <!-- 没有焦点时字体颜色 -->    <item android:state_selected="false" android:color="#a0b1b5b7"/>    <!-- 选中时的字体颜色 -->    <item android:state_selected="true" android:color="#ffe8e8e8"/></selector>

焦点离开的时候字体颜色,通过代码来设置, 代码如下, 当焦点从频道列表切换到节目列表, isHighLight为true , 那么字体颜色将被设置为蓝色, 这个时候字体颜色是永久改变的,无法还原, 并不会像 text:selector属性中焦点移动后 ,能够还原, 所以当焦点从节目列表切换到频道列表的时候, 这个时候有两个工作: 一, 焦点落在之前离开时候的位置 ; 二 , 字体颜色还原成原来的 selector状态而不是继续显示为蓝色 .

问题一: 如何记住之前焦点离开时候的位置?

listview设置OnItemSelectedListener监听, 焦点移动的过程,会触发onItemSelected()的方法, 这个时候通过mChannelListView.getSelectedItemPosition()方法总是返回 0,所以这种方法没法获得选中item的position位置, 所以只能通过mChannelAdapter.setSelectedPostion(position);方法记录住焦点的位置

<span style="font-size:14px;"><span style="font-size:12px;">public void onItemSelected(AdapterView<?> parent, View view,int position, long id) {LogUtils.i( "onItemSelected pos : "+position);mChannelListView.getSelectedItemPosition();mChannelAdapter.setSelectedPostion(position);ChannelData channelData = mChannelList.get(position);loadPbData(channelData.getResourceCode(), 0, position);}</span></span>
问题二 : 那么焦点如何回到之前的位置?
首先通过mChannelListView.requestFocus();获取焦点,  然后mChannelAdapter.getSelectedPosition()获取到焦点之前所在位置, 那么对该位置的item状态进行设置, 总共用了三行代码:
<span style="font-size:14px;">                                        mChannelListView.requestFocus();int pos = mChannelAdapter.getSelectedPosition();mChannelAdapter.setSelectedTextColor(pos, false);</span>
重点在于如何将蓝色字体还原到原来的颜色, 首先根据position找到相应的TextView控件,这里注意的是mListView.getChildAt(position - mListView.getFirstVisiblePosition()); 如果单纯mListView.getChildAt(position),可能该item是不可见的所以为空
<span style="font-size:14px;"><span style="font-size:12px;">/** * 将选中的条目字体颜色设置为蓝色 * @param position * @param isHightlight */public void setSelectedTextColor(int position, boolean isHightlight){               <span style="color:#FF6666;">//避免position对应的itemView不可见为空 </span>               View itemView = mListView.getChildAt(position - mListView.getFirstVisiblePosition());TextView mCNum = (TextView) itemView.findViewById(R.id.channel_num);TextView mCName = (TextView) itemView.findViewById(R.id.channel_name);<span style="color:#FF6666;">//通过selector的xml文件还原到之前的状态</span>XmlPullParser xpp = mCtx.getResources().getXml(R.drawable.textcolorselector2);try {ColorStateList csl = ColorStateList.createFromXml(mCtx.getResources(),xpp);mCNum.setTextColor(csl);mCName.setTextColor(csl);if(isHightlight){mCNum.setTextColor(Color.parseColor("#ff1198ff"));mCName.setTextColor(Color.parseColor("#ff1198ff"));}} catch (XmlPullParserException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}</span></span>

0 0
原创粉丝点击