==========================分割线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>

上述的代码是由很多前辈提供的,的确是能实现点击之后改变颜色,但问题来了,点击之后松开手指,就会显示成默认的背景颜色,无法保持背景颜色,感谢csdn的那些前辈对于这个问题的分析,贴出如下:

1.selector写法是在item处于selected状态时变成灰色但是ListView默认点击item再松开就恢复到默认,并不是像TabWidget一样处于selected状态

2.listview item的点击,不是点击一次就变为选中状态的未被点击:初始状态点击:按下状态点击后松开:初始状态

这也就解释了,我现在无法通过selector来完成点击之后保持颜色,不过另一位高手提出了这样的解决方案

其实你在ListView的OnItemClickListener里边,将当前选中的item执行setSelected(true)就好了
按照他的方法,我在监听列表项点击函数写了如下代码:
ListView listView = (ListView) getActivity().findViewById(R.id.listmessage);listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic 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>  
这里虽然实现了保持颜色的效果,但是在点击按下列表项的时候,背景会有默认的黄色背景,找到了如下的解决方案: 就是在listview标签里面设置选中时为透明的背景:<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:background="@color/background"
android:orientation="vertical" >


<ListView
android:id="@+id/listmessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:listSelector="@android:color/transparent" >
</ListView>
成功解决!!!
还遇到一个问题,就是显示的时候有一个黑色的分割线,好难看,需要隐藏掉:

android listview去掉分割线

[java] view plain copy
  1. <ListViewandroid:id="@id/android:list"
  2. android:layout_width="fill_parent"
  3. android:layout_height="wrap_content"
  4. android:layout_marginTop="150dip"
  5. android:divider="#00000000"
  6. android:dividerHeight="0dip"
  7. android:listSelector="@android:color/transparent"
  8. android:layout_gravity="center_vertical"/>
第四个需求就是:点击了某一个列表项之后,要求改变字体的颜色,这里的解决方案是: 第一步:设定一个全局变量,保存哪个列表项被点击了。 第二步:在列表项点击监听事件中,取得被点击的列表项的具体行数,传给适配器,如果和position匹配,则得到改textview,然后就可以进行判断,如果点击的行数和postion一样,则更改颜色,并进行列表更新。 代码如下:
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创建完成之后 * 取到列表的值,进行更新。 */@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);ListView listView = (ListView) getActivity().findViewById(R.id.listmessage);listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {<span style="font-size:24px;color:#ff0000;"><strong>arg1.setSelected(true);selectItem = arg2; // 当前选择的节目itemmessageAd.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) {}@Overridepublic int getCount() {if (maps == null) {return 0;}return maps.size();}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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;}}@Overridepublic String getFragmentTitle() {return "";}@Overridepublic int getFramentKey() {return IBundleCommData.FRAGMENT_ID_Message;}@Overridepublic 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;}

————————————————————————————分割线,textview 点击变换背景—————————————————— android:background="@drawable/systemsettingsseletor"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"
2.selector文件:<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">


<item android:drawable="@drawable/grayright" android:state_focused="true"/>
<item android:drawable="@drawable/grayright" android:state_pressed="true"/>


<item android:drawable="@drawable/grayrightmoren"/>


</selector>




更多相关文章

  1. [置顶] 如何演示你的App?Android录制Gif动态图教程
  2. Android(安卓)TextView设置自动识别的超链接字体颜色,及自身点击
  3. Android之——获取进程总数、内存、任务列表
  4. Android控件之利用selector自定义的带文字的图片按钮
  5. opencv for android 教程
  6. android 操作sdcard中的多媒体文件(一)——音乐列表的制作
  7. 在Android上用PHP编写应用- PFA初探
  8. Android(安卓)RadioButton设置选中时文字和背景颜色同时改变
  9. Android全埋点解决方案-认识

随机推荐

  1. 另一个更简单的Android应用程序全屏的方
  2. android类
  3. Android 属性文件build.prop,获取属性以及
  4. android 抽屉的一些小问题
  5. LinearLayout中gravity和layout_gravity
  6. Android应用程序基础
  7. Android(安卓)二级列表
  8. Android CTS 测试总结【转】
  9. Android之 UI主线程
  10. Android 在界面中显示以及输入文本信息 T