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

图一: 焦点在频道列表时


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


如上图,要实现频道列表中的字体有三种颜色状态 , 没有焦点时的颜色 #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>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值