安卓listview 失去焦点的焦点在不点击的情况下如何变色

博客分类:
ListView中没有默认的选择颜色,只有选择Item后的焦点颜色,鼠标点击时Item有颜色,放开鼠标后颜色也就没有了,要实现放开鼠标后选择项的背景还是有颜色的。
1、配置main.xml
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent"&
&ListView android:id="@+id/listView" android:listSelector="#000000"
android:layout_width="fill_parent"
android:layout_height="wrap_content" /&
&/LinearLayout&
设置Item的获取焦点颜色为白色android:listSelector="#000000"(即不显示背景颜色)
2、配置用于ListView显示Item的button_layout.xml
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayoutButton"
android:layout_width="144px"
android:layout_height="99px"
android:gravity="center"
android:orientation="vertical"&
android:id="@+id/TextViewButton"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:textSize="20px"&
&/TextView&
&/LinearLayout&
3、实现Activity
package com.listButtonTest.
import java.util.ArrayL
import android.app.A
import android.content.C
import android.graphics.C
import android.os.B
import android.os.H
import android.os.M
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.AdapterV
import android.widget.BaseA
import android.widget.LinearL
import android.widget.ListV
import android.widget.TextV
public class listButtonTest extends Activity {
private ListView listView =
private ListAdapter listAdapter =
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView) this.findViewById(R.id.listView);
ArrayList&ButtonView& buttonListView = new ArrayList&ButtonView&();
ButtonView a = new ButtonView(R.string.l1);
buttonListView.add(a);
ButtonView b = new ButtonView(R.string.l2);
buttonListView.add(b);
ButtonView c = new ButtonView(R.string.l3);
buttonListView.add(c);
ButtonView d = new ButtonView(R.string.l4);
buttonListView.add(d);
ButtonView e = new ButtonView(R.string.l5);
buttonListView.add(e);
listAdapter = new ListAdapter(buttonListView);
listView.setAdapter(listAdapter);
listView.setDividerHeight(0);
listView.setOnItemClickListener(new ListView.OnItemClickListener() {
public void onItemClick(AdapterView&?& arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
listAdapter.setSelectedPosition(arg2);
listAdapter.notifyDataSetInvalidated();
public class ListAdapter extends BaseAdapter {
ArrayList&ButtonView& arrayList =
ButtonLayoutHolder buttonLayoutH
LinearLayout buttonLayout =
TextView buttonText =
private int selectedPosition = -1;// 选中的位置
public ListAdapter(ArrayList&ButtonView& buttonListView) {
// TODO Auto-generated constructor stub
arrayList = buttonListV
public int getCount() {
// TODO Auto-generated method stub
return arrayList.size();
public Object getItem(int position) {
// TODO Auto-generated method stub
return arrayList.get(position);
public long getItemId(int position) {
// TODO Auto-generated method stub
public void setSelectedPosition(int position) {
selectedPosition =
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.button_layout, null, false);
buttonLayoutHolder = (ButtonLayoutHolder) view.getTag();
if (buttonLayoutHolder == null) {
buttonLayoutHolder = new ButtonLayoutHolder();
buttonLayoutHolder.buttonLayout = (LinearLayout) view
.findViewById(R.id.LinearLayoutButton);
buttonLayoutHolder.textView = (TextView) view
.findViewById(R.id.TextViewButton);
view.setTag(buttonLayoutHolder);
buttonLayout = buttonLayoutHolder.buttonL
buttonText = buttonLayoutHolder.textV
if (selectedPosition == position) {
buttonText.setSelected(true);
buttonText.setPressed(true);
buttonLayout.setBackgroundColor(Color.RED);
buttonText.setSelected(false);
buttonText.setPressed(false);
buttonLayout.setBackgroundColor(Color.TRANSPARENT);
buttonText.setTextColor(Color.WHITE);
buttonText.setText(arrayList.get(position).textViewId);
class ButtonView {
int textViewId;
ButtonView(int tId) {
textViewId = tId;
class ButtonLayoutHolder {
LinearLayout buttonL
TextView textV
在listView的setOnItemClickListener事件中标记这次选择的Item的下标:listAdapter.setSelectedPosition(arg2);
然后调用listAdapter.notifyDataSetInvalidated()通知后台重新刷新界面。
在ListAdapter的getView()方法中,如果是选中的Item则显示背景颜色,如果不是则不显示背景颜色。
下载次数: 711
浏览 65302
longyi_java
浏览: 227041 次
来自: 深圳
正需要呢,非常感谢!!!!!!!!!!
楼主给力!
哪里用那么麻烦,ListView().setChoiceMod ...
正需要,谢谢分享!
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'博客分类:
实际开发中,发现ListView中含有Button,ImageButtom,CheckBox等子控件时,ListView本身的Item无法获得单击事件,原因是,里面的子控件优先获得了单击事件。
如何避免?这时候就可以使用descendantFocusability来解决。
关于descendantFocusability属性,开发文档有详细描述:
http://developer.android.com/reference/android/view/ViewGroup.html
该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。
属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
通常我们用到的是第三种,即在Item布局的根部加上android:descendantFocusability=”blocksDescendants”的属性就好了。
浏览: 3622 次
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!博客分类:
做了ListView,但是只能点击button,无法对ListView进行激活。
ListView的Item能被选中的基础是它能获取Focus,也就是说我们可以通过将ListView中Item中包含的所有控件的focusable属性设置为false,这样的话ListView的Item自动获得了Focus的权限,也就可以被选中了,也就会响应onItemClickListener中的onItemClick()方法
解决办法就是将Button的Focus设置为非默认获取
方法一:将ListView的Item Layout的子控件focusable属性设置为false
方法二:对Item Layout的根控件android:descendantFocusability="blocksDescendant"
方法三:在实现ListView的Adapter的getView方法时,将button.setFocusable(false);
通常默认能获得focus的控件有Button,Checkable继承来的所有控件,这就意味着如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus,也就是说我们可以通过将ListView中Item中包含的所有控件的focusable属性设置为false,这样的话ListView的Item自动获得了Focus的权限,也就可以被选中了,也就会响应onItemClickListener中的onItemClick()方法,然而将ListView的Item Layout的子控件focusable属性设置为false有点繁琐,我们可以通过对Item Layout的根控件设置其android:descendantFocusability="blocksDescendant"即可,这样Item Layout就屏蔽了所有子控件获取Focus的权限,不需要针对Item Layout中的每一个控件重新设置focusable属性了,如此就可以顺利的响应onItemClickListener中的onItemClick()方法了。
浏览: 259106 次
来自: 武汉
Mfeng 写道评论竟然不能删除
评论竟然不能删除
如何更改回来?
写点有技术含量的,纯浪费时间的文章
龙哥IT 写道setTextView(int,String)? ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'博客分类:
今天遇到一个问题:android中ListView点击和里边ImageView点击不能同时生效问题解决。
研究ListView,首先ListView的适配器类型分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。
ArrayAdapter的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。同时用setAdapter()完成适配的最后工作。
使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局。下面做适配,new一个SimpleAdapter参数一次是:this,布局文件,HashMap的 title 和 info,img。布局文件的组件id,title,info,img。布局文件的各组件分别映射到HashMap的各元素上,完成适配。
然后我在使用SimpleAdapter的时候,希望在SimpleAdapter中添加的ImageView图片并且添加点击事件,我通过ID找到这个组件,然后给组件添加单击事件:
img.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Toast.makeText(FriendListTwitter.this, "click add friend.",
Toast.LENGTH_SHORT).show();
但是程序一直出现NullPointerException。
原来以为只要给图片添加clickable和focusable属性就行了,可是还是出现异常时一直出现NullPointerException。
后来看到网上一篇文章后才明白,文章的关键内容是:
---------------------------------------&
但是有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。
---------------------------------------&
&?xml version="1.0" encoding="utf-8"?&
&RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="46dip"
android:descendantFocusability="blocksDescendants"&
&ImageView android:layout_margin="2dip" android:layout_width="40dip"
android:layout_height="40dip" android:id="@+id/ItemImage" /&
&TextView android:text="Defalut" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textSize="15dip"
android:textColor="@drawable/white" android:layout_toRightOf="@id/ItemImage"
android:id="@+id/ItemTitle1" android:layout_gravity="center_vertical"
android:layout_alignParentTop="true" /&
&TextView android:text="Defalut" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textSize="15dip"
android:textColor="@drawable/black" android:layout_toRightOf="@id/ItemImage"
android:id="@+id/ItemTitle2" android:layout_gravity="center_vertical"
android:layout_alignParentBottom="true" /&
&ImageView android:id="@+id/add" android:src="@drawable/btn_check_on"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:clickable="true" android:focusable="false"
android:layout_alignParentRight="true" android:layout_centerVertical="true"
android:layout_marginRight="10dip" /&
&/RelativeLayout&
import java.io.BufferedInputS
import java.io.InputS
import java.net.URL;
import java.net.URLC
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
import android.app.A
import android.content.C
import android.content.I
import android.graphics.B
import android.graphics.BitmapF
import android.os.B
import android.util.L
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.view.W
import android.widget.AdapterV
import android.widget.BaseA
import android.widget.ImageV
import android.widget.ListV
import android.widget.TextV
import android.widget.T
import android.widget.AdapterView.OnItemClickL
public class FriendListTwitter extends Activity {
private List&Map&String, Object&& mListI
private ListView mListV
public void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.apl_mb_c1_friend_001_01);
mListView = (ListView) findViewById(R.id.friends);
mListItem = getData();
MyAdapter adapter = new MyAdapter(this);
mListView.setAdapter(adapter);
// 添加点击
mListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView&?& arg0, View arg1, int arg2,
long arg3) {
startActivity(new Intent(FriendListTwitter.this,
FriendDetail.class));
private List&Map&String, Object&& getData() {
List&Map&String, Object&& list = new ArrayList&Map&String, Object&&();
for (int i = 0; i & 10; i++) {
HashMap&String, Object& map = new HashMap&String, Object&();
String url = "http://10.167.12.184:8080/examples/images/1.png";
Bitmap bitmap = getImageByURL(url);
map.put("avatar", bitmap);// 图像资源的ID
map.put("username", "@username " + i);
map.put("location", "SuZhou JiangSu China");
map.put("add", R.drawable.btn_check_on);
list.add(map);
* listview中点击按键弹出对话框
public void showInfo() {
Toast.makeText(this, "add user", Toast.LENGTH_SHORT).show();
public Bitmap getImageByURL(String url) {
URL imgURL = new URL(url);
URLConnection conn = imgURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
Bitmap bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
if (bm == null) {
Log.e("MO", "httperror");
} catch (Exception e) {
public final class ViewHolder {
public ImageV
public TextV
public TextV
public ImageV
public class MyAdapter extends BaseAdapter {
private LayoutInflater mI
public MyAdapter(Context context) {
this.mInflater = LayoutInflater.from(context);
public int getCount() {
return mListItem.size();
public Object getItem(int arg0) {
public long getItemId(int arg0) {
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder =
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(
R.layout.apl_mb_c1_friend_001_03, null);
holder.avatar = (ImageView) convertView
.findViewById(R.id.ItemImage);
holder.username = (TextView) convertView
.findViewById(R.id.ItemTitle1);
holder.location = (TextView) convertView
.findViewById(R.id.ItemTitle2);
holder.add = (ImageView) convertView.findViewById(R.id.add);
convertView.setTag(holder);
holder = (ViewHolder) convertView.getTag();
holder.avatar.setImageBitmap((Bitmap) mListItem.get(position).get(
"avatar"));
Log.e("txl01", mListItem.get(position).get("avatar").toString());
holder.username.setText((String) mListItem.get(position).get(
"username"));
holder.location.setText((String) mListItem.get(position).get(
"location"));
holder.add.setBackgroundResource((Integer) mListItem.get(position)
.get("add"));
holder.add.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showInfo();
return convertV
  下面将对上述代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return
1,就只显示一行。
  系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那
再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了。
另外,通过这种方法不可以将ListView和ImageView同时添加了监听,通过网上搜索,原来是没有在xml中添加部分属性,在list的配置xml的根节点添加属性android:descendantFocusability="blocksDescendants",还有就是在要添加事件的控件上添加android:focusable="false",上边的代码中我已经添加过了。
浏览 39104
7楼的,tag,怎么解决的啊1、设置tagView view = new View(mContext);view.setTag(tag);2、获取tagObject tag = (Object) view.getTag();目标:可解决传参问题。希望能解决你的问题。
你好~~,我想着点击事件里面得到一个 变量,可是它一定要求是final型的,而我这个变量又是需要变化的,请问:这个问题要怎么解决??
gangbener 写道gangbener 写道你好~~,我想着点击事件里面得到一个 变量,可是它一定要求是final型的,而我这个变量又是需要变化的,请问:这个问题要怎么解决??
——该问题已解决:View里面都有tag,请用tag识别。^_^
怎么解决的,能详细点吗
你好~~,我想着点击事件里面得到一个 变量,可是它一定要求是final型的,而我这个变量又是需要变化的,请问:这个问题要怎么解决??——该问题已解决:View里面都有tag,请用tag识别。^_^
txlong_onz
浏览: 998989 次
来自: 郑州
非常有用,多谢楼主
haotainan 写道Activity伪造Dialog,这个 ...
Activity伪造Dialog,这个Dialog显示的时候界 ...
cainingyouyou 写道7楼的,tag,怎么解决的啊1 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 listview 失去焦点 的文章

 

随机推荐