Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 367|回复: 0

[默认分类] android上改变listView的选中颜色

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-28 12:50:53 | 显示全部楼层 |阅读模式


      需要说明的是,在正常
    默认情况下都是选择Item橙黄色,点击Item橙黄色,但是如果你设置了Item整体布局的背景色 android:background="#000000"则,你的上面两个都会不起作用,导致你selected了Item看不出来是否选择了。


    那如何改橙黄色为绿色呢?????
    step1:list_item.xml中的代码:

    <?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="45dp"
         android:orientation="vertical"
         android:background="@drawable/list_item_bg"
          >
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:gravity="center_vertical"
            
            >
            <TextView
               .....
                />
            <ImageView
                ....
                />
        </RelativeLayout>
    </LinearLayout>


    ============================================
    drawable下的 list_item_bg.xml中的代码:

    <?xml version="1.0" encoding="utf-8" ?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
       <item android:state_selected="true"
             android:drawable="@color/blue" />
       <item android:state_focused="true"
             android:drawable="@color/blue" />
    </selector>

    step2:
    list.setOnItemClickListener(new OnItemClickListener(){

                     @Override
                     public void onItemClick(AdapterView<?> arg0, View arg1,
                             int arg2, long arg3) {
                        
                         arg1.setBackgroundResource(R.color.blue);  // 注意是这个方法o
                         .......
                     }});
             }



    注意:当完成第二步之后,再运行程序会发现有个小小的问题,当你点击item时,选中的颜色会先是默认的橙黄色,然后变成设置的绿色。所以我们需要进行step3。

    step3:在myList.xml中的 ListView设置:
      android:listSelector="@android:color/transparent"   // 将选中的默认设置为透明色

    等同于: android:listSelector="#00000000"  



    这样就ok了
       
    还有其他方法
       
    ListView选中时默认是黄色,很多时候会和我们软件的配色不符合,那么我就教你如何修改默认的ListView配色,改变ListView选中颜色有两个方法:

    1. 在程序中:

      
       
       
        java代码  
        (转)" alt="收藏代码" src="http://www.itdaan.com/imgs/6/7/2/3/48/f9aa34520c38cd94e8662d1c7394d50e.jpe">(转)" alt="android上改变listView的选中颜色 (转)" src="http://www.itdaan.com/imgs/7/5/7/3/96/a4c26d1e5885305701be709a3d33442f.jpe">
       
       
      
       Drawable drawable=getResources().getDrawable(R.drawable.touch_feedback);   
       ListView.setSelector(drawable);   
      
      
    1. Drawable drawable=getResources().getDrawable(R.drawable.touch_feedback); ListView.setSelector(drawable);
    复制代码




    2. 在xml里面的ListView标签下添加:

      
       
       
        Java代码  
        (转)" alt="收藏代码" src="http://www.itdaan.com/imgs/6/7/2/3/48/f9aa34520c38cd94e8662d1c7394d50e.jpe">(转)" alt="android上改变listView的选中颜色 (转)" src="http://www.itdaan.com/imgs/7/5/7/3/96/a4c26d1e5885305701be709a3d33442f.jpe">
       
       
      
       android:listSelector=”#00000000″ //后面的颜色可以自己定这样写是透明的   
      
      
    1. android:listSelector=”#00000000″ //后面的颜色可以自己定这样写是透明的
    复制代码




    记录和恢复ListView滚动的位置
    有时候我们需要记录当前ListView滚动到的位置,重新加载的时候要回到原位,不罗嗦,给出代码:


      
       
       
        Java代码  
        (转)" alt="收藏代码" src="http://www.itdaan.com/imgs/6/7/2/3/48/f9aa34520c38cd94e8662d1c7394d50e.jpe">(转)" alt="android上改变listView的选中颜色 (转)" src="http://www.itdaan.com/imgs/7/5/7/3/96/a4c26d1e5885305701be709a3d33442f.jpe">
       
       
      
       //列表滚动   
       private OnScrollListener ScrollLis = new OnScrollListener() {   
          
           @Override   
           public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {   
           }   
          
           @Override   
           public void onScrollStateChanged(AbsListView view, int scrollState) {   
               if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){   
                           ListPos=list.getFirstVisiblePosition();  //ListPos记录当前可见的List顶端的一行的位置   
                   }   
           }   
       };   
      
      



    接下来就是还原位置,放在ListView加载之后:



      
       
       
        Java代码  
        (转)" alt="收藏代码" src="http://www.itdaan.com/imgs/6/7/2/3/48/f9aa34520c38cd94e8662d1c7394d50e.jpe">(转)" alt="android上改变listView的选中颜色 (转)" src="http://www.itdaan.com/imgs/7/5/7/3/96/a4c26d1e5885305701be709a3d33442f.jpe">
       
       
      
       list.setSelection(ListPos);   
      
      
    1. list.setSelection(ListPos);
    复制代码




    关于android ListView的美化

    用心的朋友应该会发现,listview中在设置了背景之后。会有些问题。
    1.、listview在拖动的时候背景图片消失变成黑色背景。等到拖动完毕我们自己的背景图片才显示出来。
    2 、listview的上边和下边有黑色的阴影。
    3、lsitview的每一项之间需要设置一个图片做为间隔。
    针对以上问题 在listview的xml文件中设置一下语句。



    问题1 有如下代码结解决 android:scrollingCache=”false” 或 android:cacheColorHint=”#00000000″
    问题2 用如下代码解决:android:fadingEdge=”none”
    问题3 用如下代码解决: android:divider=”@drawable/list_driver” 其中 @drawable/list_driver 是一个图片资源




    ListView拖动时背景黑色的问题

    我们知道在Android中ListView是一个比较常用的UI控件,我们在大部分开发中都需要用到它,因此Android为我们提供了 ListView的多种实现方法,通过自定义显示布局让显示的内容更加美观,但是我们会发现这样一个问题,当我们操作ListView的时候,如果不使用手机上下按键的时候,直接用触摸拖动视图的方式,会发现ListView的背景一片黑色,而且所有被选中的文字都变成一片漆黑。

    其实这个问题发生的原因在于ListView存在缓存颜色机制,因此我们可以通过设定缓存颜色为透明的方法来解决这个问题。ATAAW.COM提供两个解决方法供大家使用,如下所示:

    A、通过布局属性来设定(ListView的属性中直接定义)

    android:cacheColorHint=”#00000000″

    B、在代码中直接设定

    listView.setCacheColorHint(Color.TRANSPARENT);

    这样就可以解决黑色出现的问题了。


    ListView 中添加按钮,动态删除添加ItemView的操作

    要实现添加按钮的操作,必须自定义Adapter,使用Button View的setTag()方法,将Button所属的位置设置到tag当中
    要实现动态添加删除ItemView的操作,必须首先调整调整Adapter所绑定的数据源,然后调用Adapter的notifyDataSetChanged()方法

    以下为实现的一个实例


      
       
       
        Java代码  
        (转)" alt="收藏代码" src="http://www.itdaan.com/imgs/6/7/2/3/48/f9aa34520c38cd94e8662d1c7394d50e.jpe">(转)" alt="android上改变listView的选中颜色 (转)" src="http://www.itdaan.com/imgs/7/5/7/3/96/a4c26d1e5885305701be709a3d33442f.jpe">
       
       
      
       package com.jason.joysmsyd;   
          
       import java.util.ArrayList;   
       import java.util.HashMap;   
       import java.util.List;   
       import java.util.Map;   
          
       import android.app.ListActivity;   
       import android.content.Intent;   
       import android.os.Bundle;   
       import android.view.LayoutInflater;   
       import android.view.View;   
       import android.view.ViewGroup;   
       import android.view.Window;   
       import android.view.View.OnClickListener;   
       import android.widget.BaseAdapter;   
       import android.widget.Button;   
       import android.widget.EditText;   
       import android.widget.TextView;   
          
       public class SendMain extends ListActivity implements OnClickListener{   
          
           Button buttonMessage,buttonContact,buttonHistory;   
           EditText textMessage;   
          
           List<Map<String,String>> contacts = new ArrayList<Map<String,String>>();   
          
          
          
           @Override   
           protected void onCreate(Bundle savedInstanceState) {   
               // TODO Auto-generated method stub   
               super.onCreate(savedInstanceState);   
               this.requestWindowFeature(Window.FEATURE_NO_TITLE);   
          
               this.setContentView(R.layout.layout_send);   
          
               buttonMessage = (Button) this.findViewById(R.id.ButtonMessage);   
               buttonContact = (Button) this.findViewById(R.id.ButtonContact);   
               buttonHistory = (Button) this.findViewById(R.id.ButtonHistory);   
          
               textMessage = (EditText)this.findViewById(R.id.EditTextMessage);   
               textMessage.setText(this.getIntent().getExtras().getString("message"));   
          
           }   
          
           public void onClick(View v) {   
               // TODO Auto-generated method stub   
               switch(v.getId()){   
               case R.id.ButtonMessage:   
                   this.finish();   
                   break;   
               case R.id.ButtonContact:   
               {   
                   Intent intent = new Intent();   
                   intent.setAction("com.jason.action.contact");   
                   this.startActivityForResult(intent, 0);   
               }   
                   break;   
               case R.id.ButtonHistory:   
               {   
                   Intent intent = new Intent();   
                   intent.setAction("com.jason.action.history");   
                   this.startActivityForResult(intent, 1);   
               }   
                   break;   
               }   
          
           }   
          
          
           protected void onActivityResult(int requestCode, int resultCode, Intent data) {   
               // TODO Auto-generated method stub   
               super.onActivityResult(requestCode, resultCode, data);   
                if (requestCode == 0 && resultCode == RESULT_OK) {   
                   this.getcontactFromString(data.getExtras().getString(   
                           UserSelectActivity.RETURN_LIST));   
                   bindDataToList();   
               }   
           }   
          
           private void getcontactFromString(String data) {   
               if (data == null || data.length() == 0) {   
                   return;   
               }   
          
          
               String[] arrayContact = data.split("#");   
               for (String singleContact : arrayContact) {   
                   if (singleContact != null && singleContact.length() > 0) {   
                       String[] props = singleContact.split(":");   
                       if (props.length == 2) {   
                           Map<String,String> contact = new HashMap<String,String>();   
                           contact.put("name", props[0]);   
                           contact.put("phone", props[1]);   
                           contacts.add(contact);   
          
                       }   
                   }   
          
               }   
          
           }   
          
           private void bindDataToList(){   
               this.setListAdapter(new MyAdapter());   
           }   
          
           public class MyAdapter extends BaseAdapter{   
          
               public int getCount() {   
                   // TODO Auto-generated method stub   
                   return contacts.size();   
               }   
          
               public Object getItem(int position) {   
                   // TODO Auto-generated method stub   
                   return contacts.get(position);   
               }   
          
               public long getItemId(int position) {   
                   // TODO Auto-generated method stub   
                   return position;   
               }   
          
          
               public View getView(int position, View convertView, ViewGroup parent) {   
                   // TODO Auto-generated method stub   
                   LayoutInflater inflater = SendMain.this.getLayoutInflater();   
                    final View view = inflater.inflate(R.layout.layout_user_item, null);   
                    final TextView textPhone = (TextView) view.findViewById(R.id.text1);   
                    final TextView textName = (TextView) view.findViewById(R.id.text2);   
                    Button button = (Button)view.findViewById(R.id.buttonDelete);   
          
                    textPhone.setText(contacts.get(position).get("phone"));   
                    textName.setText(contacts.get(position).get("name"));   
          
                    button.setTag( position);   
          
                    button.setOnClickListener(new OnClickListener(){   
          
                       public void onClick(View v) {   
                           // TODO Auto-generated method stub   
                           int position = Integer.parseInt(v.getTag().toString());   
                           contacts.remove(position);   
                           MyAdapter.this.notifyDataSetChanged();   
          
       //                  SendMain.this.getListView().refreshDrawableState();   
                       }});   
          
          
          
          
                   return view;   
               }   
          
           }   
       }   
      
      



    Android ListView 清单与其Trigger 触发事件

    Android ListView 清单与其选择时的触发事件,

    可以参考下面的程式范例 :


      
       
       
        Java代码  
        (转)" alt="收藏代码" src="http://www.itdaan.com/imgs/6/7/2/3/48/f9aa34520c38cd94e8662d1c7394d50e.jpe">(转)" alt="android上改变listView的选中颜色 (转)" src="http://www.itdaan.com/imgs/7/5/7/3/96/a4c26d1e5885305701be709a3d33442f.jpe">
       
       
      
       public class helloWorld extends Activity {   
          
           String[] vData = null;   
          
           public void onCreate(Bundle savedInstanceState) {   
               super.onCreate(savedInstanceState);   
          
               // 要做为ArrayAdapter的资料来源   
               vData = new String[]{"足球","棒球","篮球"};   
          
               // 建立"阵列接收器"   
               ArrayAdapter<String>  arrayData = new ArrayAdapter<String>(   
                       this   
                       , android.R.layout.simple_list_item_1   
                       , vData   
                       );   
          
               // 建立ListView 物件   
               ListView  lv = new ListView(this);   
          
               // 设定ListView 的接收器, 做为选项的来源   
               lv . setAdapter ( arrayData );   
          
               // ListView 设定Trigger   
               lv . setOnItemClickListener ( new OnItemClickListener() {   
          
                   public void onItemClick (AdapterView<?> arg0, View arg1, int arg2,   
                           long arg3) {   
                       // TODO Auto-generated method stub   
                       setTitle( getResources().getString(R.string.app_name) + ": " + vData [ arg2 ]);   
                   }   
               });   
          
               // 设定ListView 为ContentView   
               setContentView(lv);   
           }   
       }   
      
      

    (转)" alt="android上改变listView的选中颜色 (转)" src="http://disanji.net/wp-content/uploads/2010/12/20101210_list01.jpg">
    (转)" alt="android上改变listView的选中颜色 (转)" src="http://disanji.net/wp-content/uploads/2010/12/20101210_list02.jpg">
    (转)" alt="android上改变listView的选中颜色 (转)" src="http://disanji.net/wp-content/uploads/2010/12/20101210_list03.jpg">


    Android中的ListView内容刷新问题

    最近在学习Android的listView控件时遇到了一个问题,如何添加一个Item到ListView中并及时的刷新出来。在网上查了很多帖子,很多人在问,也很多人在解答,但是总的来说都没找到详细的解决方案。对于ListView与数据库的同步,高手们建议使用 ContentProvider对象。但是如果我不使用数据库呢?也有人回答用notifyDataSetChanged()方法。这倒是一个正确的解决方案,但是对于新手来说,还是比较困惑怎么去用,这里我贴一下我的用法:


      
       
       
        Java代码  
        (转)" alt="收藏代码" src="http://www.itdaan.com/imgs/6/7/2/3/48/f9aa34520c38cd94e8662d1c7394d50e.jpe">(转)" alt="android上改变listView的选中颜色 (转)" src="http://www.itdaan.com/imgs/7/5/7/3/96/a4c26d1e5885305701be709a3d33442f.jpe">
       
       
      
       OnClickListener listener2 = new OnClickListener() {   
               @Override   
               public void onClick(View v) {   
                   // TODO Auto-generated method stub   
                   Map<String, Object> m = new HashMap<String, Object>();   
                   String tiString  = tv.getText().toString(); // 注意这里我为什么要取出这个EditText的内容   
                   m.put("prod_na", tiString); // 而不这样写 m.put("prod_na", tv.getText());   
                   m.put("prod_type", tiString); // 因为tv.getText()返回的是Editable对象,真正的数据是被缓存的,   
                                                 // 也就是说你后续的EditText改动都会影响之前添加的Item   
                   coll.add(m);   
          
                   // 取回Adapter对象,用于调用notifyDataSetChanged方法。   
                   SimpleAdapter sAdapter = (SimpleAdapter)lv.getAdapter();   
                   sAdapter.notifyDataSetChanged();   
               }   
           };   
      
      


    这里涉及到了Android中的MVC模式概念,如何存储数据,控制和显示。

    你可以认为ListView是一个View,那么mode是什么呢?显然是SimpleAdapter对象,而Control又是什么呢?那只能是notifyDataSetChanged()了。当数据变化时,也就是SimpleAdapter所处理的数据变化了,那么我们就需要调用 notifyDataSetChanged 去通知View作出改变。


       
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-1 13:28 , Processed in 0.401269 second(s), 50 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表