赞
踩
==========================分割线2015年11月26日08:04:07=============================
下面的文章存在bug,实际上未能解决保持背景的问题,误导大家不好意思,根据朋友的帮忙,我更新了另一片博客解决此需求,如下链接:android 点击更换背景,已读功能,希望对大家有帮忙,有问题,可以相互讨论!!!
==========================分割线2015年11月26日08:04:07=============================
项目中突然遇到这样的问题,一些消息类的界面,需要使用listview进行显示,正常的需求是刚开始进入消息显示界面的时候,列表项显示的都是全黑的,接着点击了某一个列表项之后,就要更换成白色,并且保持白色的显示,剩下的仍旧为黑色的,一开始就有点走进了死胡同,使用selector结合shape来定义选中、未选中、点击或者点击之后的背景显示,实例如下:
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 默认时的背景图片-->
<item android:drawable="@drawable/pic1" />
<!-- 没有焦点时的背景图片 -->
<item android:state_window_focused="false"
android:drawable="@drawable/pic1" />
<!-- 非触摸模式下获得焦点并单击时的背景图片 -->
<item android:state_focused="true" android:state_pressed="true" android:drawable= "@drawable/pic2" />
<!-- 触摸模式下单击时的背景图片-->
<item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/pic3" />
<!--选中时的图片背景-->
<item android:state_selected="true" android:drawable="@drawable/pic4" />
<!--获得焦点时的图片背景-->
<item android:state_focused="true" android:drawable="@drawable/pic5" />
</selector>

1.selector写法是在item处于selected状态时变成灰色但是ListView默认点击item再松开就恢复到默认,并不是像TabWidget一样处于selected状态
2.listview item的点击,不是点击一次就变为选中状态的未被点击:初始状态点击:按下状态点击后松开:初始状态
这也就解释了,我现在无法通过selector来完成点击之后保持颜色,不过另一位高手提出了这样的解决方案:
- ListView listView = (ListView) getActivity().findViewById(
- R.id.listmessage);
- listView.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
- long arg3) {
-
- AlertDialog.Builder builder = new AlertDialog.Builder(
- getActivity());
- builder.setIcon(R.drawable.ic_launcher);
- builder.setTitle(maps.get(arg2).get("messagetitle").toString());
-
- MessageToAccount metoacc = TradeAPI.getInstance().queryMessage(
- (String) maps.get(arg2).get("guid"));
- byte[] messagebyte = metoacc.getContext();
- if (messagebyte != null) {
- try {
- new String(messagebyte, "UTF-8");
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- }
- // builder.setMessage(messagecontent);
- builder.setMessage("现货交易中通行的是一手交钱一手交货的交易方式,或者采取以货易货的交易方式。的方式在限期内结算。现货交易与其它交易方式的不同点有:①在交易的目的上,是为了获得商品的所有权。");
- builder.show();
- }
- });</span>

arg1.setSelected(true);就实现了每次点击之后保持颜色不变。至此效果完成了,贴出我的selector的xml文件:</span></span>
- <?xml version="1.0" encoding="utf-8"?>
- <selector
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_selected="true">
- <shape>
- <!-- 渐变 -->
- <gradient
- android:startColor="#B4B4B4"
- android:endColor="#B4B4B4"
- android:type="radial"
- android:gradientRadius="50" />
- <!-- 描边 -->
- <stroke
- android:width="2dp"
- android:color="#dcdcdc"
- android:dashWidth="5dp"
- android:dashGap="3dp" />
- <!-- 圆角 -->
- <corners
- android:topLeftRadius="5dp"
- android:topRightRadius="5dp"
- android:bottomLeftRadius="5dp"
- android:bottomRightRadius="5dp"/>
- <padding
- android:left="10dp"
- android:top="10dp"
- android:right="10dp"
- android:bottom="10dp" />
- </shape>
- </item>
-
- <item android:state_pressed="true">
- <shape>
- <!-- 渐变 -->
- <gradient
- android:startColor="#B4B4B4"
- android:endColor="#B4B4B4"
- android:type="radial"
- android:gradientRadius="50" />
- <!-- 描边 -->
- <stroke
- android:width="2dp"
- android:color="#dcdcdc"
- android:dashWidth="5dp"
- android:dashGap="3dp" />
- <!-- 圆角 -->
- <corners
- android:topLeftRadius="5dp"
- android:topRightRadius="5dp"
- android:bottomLeftRadius="5dp"
- android:bottomRightRadius="5dp"/>
- <padding
- android:left="10dp"
- android:top="10dp"
- android:right="10dp"
- android:bottom="10dp" />
- </shape>
- </item>
-
-
- <item>
- <shape>
- <solid android:color="#2B2B2B"/>
- <stroke
- android:width="2dp"
- android:color="#2B2B2B" />
- <corners
- android:topLeftRadius="5dp"
- android:topRightRadius="5dp"
- android:bottomLeftRadius="5dp"
- android:bottomRightRadius="5dp"
- />
- <padding
- android:left="10dp"
- android:top="10dp"
- android:right="10dp"
- android:bottom="10dp" />
- </shape>
- </item>
- </selector>

- package client.verbank.mtp.allone.frame.message;
-
- import java.io.UnsupportedEncodingException;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.LinkedList;
- import java.util.List;
-
- import jedi.verbank.CSTS3.comm.struct.MessageToAccount;
- import jedi.verbank.client.station.api.ClientAPI;
- import jedi.verbank.client.station.api.trade.TradeAPI;
- import jedi.verbank.client.station.api.trade.TradeResult_SimpleReport;
- import android.app.AlertDialog;
- import android.app.ProgressDialog;
- import android.content.Context;
- import android.os.Bundle;
- import android.os.Handler;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.BaseAdapter;
- import android.widget.ListView;
- import android.widget.TextView;
- import client.verbank.mtp.allone.R;
- import client.verbank.mtp.allone.component.DialogManager;
- import client.verbank.mtp.allone.component.DialogType;
- import client.verbank.mtp.allone.consts.IBundleCommData;
- import client.verbank.mtp.allone.frame.ControlFragment;
- import client.verbank.mtp.allone.frame.MainActivity;
- import client.verbank.mtp.allone.util.TimeUtil;
-
-
- public class MessageFragment extends ControlFragment {
-
- private int selectItem = -1;
-
-
-
-
-
- /*
- * :对展示的listview列表项进行监听,主要使用fragment的onActivityCreated的Activity创建完成之后
- * 取到列表的值,进行更新。
- */
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- ListView listView = (ListView) getActivity().findViewById(
- R.id.listmessage);
- listView.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
- long arg3) {
-
- <span style="font-size:24px;color:#ff0000;"><strong>arg1.setSelected(true);
- selectItem = arg2; // 当前选择的节目item
- messageAd.notifyDataSetChanged(); // 通知adapter刷新数据 }</strong></span>
-
- AlertDialog.Builder builder = new AlertDialog.Builder(
- getActivity());
- builder.setIcon(R.drawable.ic_launcher);
- builder.setTitle(maps.get(arg2).get("messagetitle").toString());
-
- MessageToAccount metoacc = TradeAPI.getInstance().queryMessage(
- (String) maps.get(arg2).get("guid"));
- byte[] messagebyte = metoacc.getContext();
- if (messagebyte != null) {
- try {
- new String(messagebyte, "UTF-8");
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- }
- // builder.setMessage(messagecontent);
- builder.setMessage("现货交易中通行的是一手交钱一手交货的交易方式,或者采取以货易货的交易方式。的方式在限期内结算。现货交易与其它交易方式的不同点有:①在交易的目的上,是为了获得商品的所有权。");
- builder.show();
- }
- });
- }
-
-
-
- // 开仓单适配器
- public class MessageAdapter extends BaseAdapter {
- public MessageAdapter(Context myContext) {
- }
-
- public MessageAdapter(MessageFragment messageFragment) {
- }
-
- @Override
- public int getCount() {
- if (maps == null) {
- return 0;
- }
- return maps.size();
- }
-
- @Override
- public Object getItem(int position) {
- return position;
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder viewHolder = null;
- if (convertView == null) {
- viewHolder = new ViewHolder();
- convertView = getActivity().getLayoutInflater().inflate(
- R.layout.activity_message_item, null);
-
- viewHolder.messagetitle = (TextView) convertView
- .findViewById(R.id.messagetitle);
- viewHolder.messagetime = (TextView) convertView
- .findViewById(R.id.messagetime);
- convertView.setTag(viewHolder);
- } else {
- viewHolder = (ViewHolder) convertView.getTag();
- }
-
- TextView messagetitle = (TextView) convertView
- .findViewById(R.id.messagetitle);
- TextView messagetime = (TextView) convertView
- .findViewById(R.id.messagetime);
-
- <span style="font-size:18px;color:#cc0000;"><strong> try {
- if (selectItem == position) {
- messagetitle.setTextColor(android.graphics.Color.BLACK);
- messagetime.setTextColor(android.graphics.Color.BLACK);
- viewHolder.messagetitle.setText(maps.get(position)
- .get("messagetitle").toString());
- viewHolder.messagetime.setText(maps.get(position)
- .get("messagetime").toString());
- } else {
- messagetitle.setTextColor(android.graphics.Color.WHITE);
- messagetime.setTextColor(android.graphics.Color.WHITE);
- viewHolder.messagetitle.setText(maps.get(position)
- .get("messagetitle").toString());
- viewHolder.messagetime.setText(maps.get(position)
- .get("messagetime").toString());
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- }</strong></span>
- return convertView;
- }
-
- private class ViewHolder {
- TextView messagetitle;
- TextView messagetime;
-
- }
- }
-
- @Override
- public String getFragmentTitle() {
- return "";
- }
-
- @Override
- public int getFramentKey() {
- return IBundleCommData.FRAGMENT_ID_Message;
- }
-
- @Override
- public void onMessageReceive(MessageToAccount arg0) {
- if (!isHidden()) {
- initData();
- }
- }
-
- }

这里的确可以通过上述方法对列表项的文字的颜色进行更改,但这又引起了其他的bug,就是列表项的背景之前是设置了selector和shape的,点击之后更换为白色的背景,但是按照上述的方法设置之后,全部为黑的,其实解决方案也简单,单独对点击和默认的布局,进行背景的设置,放弃掉之前的利用selector进行背景的改变,直接使用shape来设置,代码如下:
- try {
- if (selectItem == position) {
- messagetitle.setTextColor(android.graphics.Color.BLACK);
- messagetime.setTextColor(android.graphics.Color.BLACK);
- viewHolder.messagetitle.setText(maps.get(position)
- .get("messagetitle").toString());
- viewHolder.messagetime.setText(maps.get(position)
- .get("messagetime").toString());
- convertView.findViewById(R.id.expandable1)
- .setBackgroundColor(android.graphics.Color.WHITE);
- convertView.findViewById(R.id.expandable1)
- .setBackgroundResource(R.drawable.menu_shapeclick);
- } else {
- messagetitle.setTextColor(android.graphics.Color.WHITE);
- messagetime.setTextColor(android.graphics.Color.WHITE);
- viewHolder.messagetitle.setText(maps.get(position)
- .get("messagetitle").toString());
- viewHolder.messagetime.setText(maps.get(position)
- .get("messagetime").toString());
- convertView.findViewById(R.id.expandable1)
- .setBackgroundResource(
- R.drawable.menu_shapeunonclick);
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- return convertView;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。