android组件不能加适配器,ListView+Adapter适配器的使用与Listview常见的UI显示问题

一.ListView的事件:1.setOnItemClickListener()点击事件

copycode.giflistview.setOnItemClickListener(new OnItemClickListener() {

@Override            public void onItemClick(AdapterView> parent, View view,                    int position, long id) {

Toast.makeText(ArrayAdapterActivity.this, "你点击了第"+(position+1)+"项", Toast.LENGTH_SHORT).show();

}

});

copycode.gif

2.setOnItemLongClickListener()长按事件,设置“长按”listview某一项的监听事件。

copycode.giflistview.setOnItemLongClickListener( OnItemLongClickListener() {  

@Override

onItemLongClick(AdapterView> parent, View view,

position,  id) {

Toast.makeText(ArrayAdapterActivity., "你了第"+(position+1)+"项", Toast.LENGTH_SHORT).show();

;

}

});

copycode.gif

二.ListView由于item项中包含某些可以抢焦点的控件导致无法获取焦点问题:

(注意:ListView的项根元素layout的宽要设置成android:layout_width="fill_parent",否则可能会因为项内容太短,导致点击时获取不到焦点)

1>.如果你自定义ListView的项中包含能获得焦点的子控件(RadioGroup、Button、CheckBox、DatePicker、ImageButton、ScrollView、SeekBar、EditText、ToggleButton、RatingBar等)的话,默认焦点会被交给这些子控件,而ListView的项能被选中的基础是它能获取焦点,所以项中的这些子控件的焦点必须为false,这样ListView的项才能获取onItemLongClick事件与onItemClick事件

解决办法(以Button为例):

在布局文件中,在项的layout布局文件根元素中加入android:descendantFocusability="blocksDescendants"如:

copycode.gif

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:descendantFocusability="blocksDescendants" >

android:id="@+id/header"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

android:id="@+id/name"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignTop="@id/header"

android:layout_toRightOf="@id/header" />

android:id="@+id/age"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignLeft="@id/name"

android:layout_below="@id/name" />

android:id="@+id/delete"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:text="@string/deleteselect" />

copycode.gif

如果layout是程序动态生成的,则调用layout.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);

2>.如果你自定义ListView的项中包含能获得焦点的子控件GridView的话,默认焦点会被交给这些子控件,而ListView的项能被选中的基础是它能获取焦点,所以项中的这些子控件的焦点必须为false,这样ListView的项才能获取onItemLongClick事件与onItemClick事件

解决办法(以Button为例):

1.在布局文件中,在项的layout布局文件根元素中加入android:descendantFocusability="blocksDescendants"

2.程序中给GridView进行如下设置gridView.setClickable(false);

gridView.setPressed(false);

gridView.setEnabled(false);

三.ListView的UI显示中常见问题及解决办法

1>如果需求是listview点击时,item无背景变色效果

步骤:

1.drawable文件夹中新建timer_list_selector.xml内容如下<?xml  version="1.0" encoding="utf-8"?>

2.values文件夹中新建colors.xml内容如下<?xml  version="1.0" encoding="utf-8"?>

#50000000

3.布局文件中给listview加入如下属性android:listSelector="@drawable/timer_list_selector"

2>listview设置分割线Divider样式,布局文件给listview加入如下属性(已分隔符为颜色为例)

android:divider属性用来设置分割线颜色(或图片),当设置为#00000000时表示item之间无间隙;

通过android:dividerHeight属性设置分割线高度android:divider="#ff999999"

android:dividerHeight="1sp"

3>UI展现时常见问题

问题1:listview设置背景,拖动listview时显示黑色,只有拖动完才会显示我们设置的背景颜色或图片

产生原因:listview的背景是固定不变的,默认Listview的每项的背景是透明的,拖动滚动条的过程中需要实时将每个项的显示内容跟背景进行混合运算,android系统为了优化这个过程,使用了android:cacheColorHint属性,在黑色背景下默认颜色为#191919,所以出现了上面的黑色显示问题

解决办法:(根据需求而定)

1.如果只换背景颜色:将android:cacheColorHint设置成和背景颜色一样或android:scrollingCache="false"如下android:cacheColorHint="#ff00ff00"

android:background="#ff00ff00"

或android:scrollingCache="false"

android:background="#ff00ff00"

2.如果用图片做背景:将android:cacheColorHint设为#00000000变为透明或android:scrollingCache="false"即可如下android:cacheColorHint="#00000000"

android:background="@drawable/ic_launcher"

或android:scrollingCache="false"

android:background="@drawable/ic_launcher"

问题2:listview上面或下面有黑色阴影

解决办法:布局文件中给listview加入android:fadingEdge="none"

UI总结:

综上问题得到最终的布局为(带分割线+背景色)

copycode.gif

android:layout_width="fill_parent"

android:layout_height="180dip"

android:divider="#ff999999"

android:dividerHeight="1sp"

android:fadingEdge="none"

android:scrollingCache="false"

android:background="#ff00ff00"

/>

copycode.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值