图一: 焦点在频道列表时
首先通过mChannelListView.requestFocus();获取焦点, 然后mChannelAdapter.getSelectedPosition()获取到焦点之前所在位置, 那么对该位置的item状态进行设置, 总共用了三行代码:
图二:焦点切换到节目列表时
如上图,要实现频道列表中的字体有三种颜色状态 , 没有焦点时的颜色 #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>