在ListView中设置Selector为null会报空指针?
mListView.setSelector(null);//空指针
试试下面这种:
mListView.setSelector(new ColorDrawable(Color.TRANSPARENT));
如何让ListView初始化的时候就选中一项?
ListView需要在初始化好数据后,其中一项需要呈选中状态。所谓"选中状态"就是该项底色与其它项不同,setSelection(position)只能定位到某个item,但是无法改变底色呈高亮。setSelection(position)只能让某个item显示在可见Item的最上面(如果Item超过一屏的话)! 就是所谓的firstVisibleItem啦!
如果想要实现效果可以在listview所绑定的adapter里的getView函数里去完成一些具体的工作。可以记下你要高亮的那个item的index,在getView函数里判断index(也就是position),如果满足条件则加载不同的背景。
ListView的右边滚动滑块启用方法?
很多开发者不知道ListView列表控件的快速滚动滑块是如何启用的,其实辅助滚动滑块只需要一行代码就可以搞定,如果你使用XML布局只需要在ListView节点中加入 android:fastScrollEnabled="true" 这个属性即可,而对于Java代码可以通过myListView.setFastScrollEnabled(true); 来控制启用,参数false为隐藏。
还有一点就是当你的滚动内容较小,不到当前ListView的3个屏幕高度时则不会出现这个快速滚动滑块,该方法是AbsListView的基础方法,可以在ListView或GridView等子类中使用快速滚动辅助。
1. 更新ListView中的數據,通過調用BaseAdapter對象的notifyDataSetChanged()方法:
mAdapter.notifyDataSetChanged();
2. 每個listview都有無效的位置,如第一行的前一行,最後一行的後一行,這個無效的位置是一個常量.
ListView.INVALID_POSITION
3. 有時我們需要在程序中通過點擊按鈕來控制ListView行的選中,這就用到了在程序中如何使用代碼來選擇ListView項.
mListView.requestFocusFromTouch();
mListView.setSelection(int index);
第一條語句並不是必須的,但是若你ListView項中含有Button,RadioButton,CheckBox等比ListView取得 焦點優先級高的控件時,那麼第一條語句是你必須加的.
4. 同樣的,若你ListView項中含有Button,RadioButton,CheckBox等比ListView取得 焦點優先級高的控件時,ListView的setOnItemClickListener是不被執行的,這時你需要在你的xml文件中對這些控件添加 android:focusable="false" 注意這條語句要放在xml文件中修改,在代碼中使用是無效的.
5. 如何保持ListView的滾動條一直顯示,不隱藏呢: xml文件中做如下修改 android:fadeScrollbars="false"
6. ListView本身有自己的按鍵事件,即你不需要設置方向鍵的標識,按下方向鍵ListView就會有默認的動作,那如何進行控制,編寫自己的onKey呢,你需要在Activity中重寫dispatchKeyEvent(KeyEvent event);方法,在這裡面定義你自己的動作就可以了
ListView 自定义滚动条样式:
<ListView android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:stackFromBottom="true"//从下开始显示条目
android:transcriptMode="normal"
android:fastScrollEnabled="true"
android:focusable="true"
android:scrollbarTrackVertical="@drawable/scrollbar_vertical_track"
android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb"
/>
//scrollbar_vertical_track,crollbar_vertical_thumb自定义的xml文件,放在Drawable中,track是指长条,thumb是指短条
去掉ListView Selector选种时黄色底纹一闪的效果:
- <?xml version="1.0" encoding="utf-8"?>
- <shape xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="@android:color/transparent"/>
- <corners android:radius="0dip" />
- </shape>
- //listview.setSelector(R.drawable.thisShape);
或者还有一种办法:
在Adapter中重写public boolean isEnabled(int position)方法,将其返回false就可以了,推荐采用此种办法,具体见http://gundumw100.iteye.com/admin/blogs/850654
- public boolean isEnabled(int position) {
-
- return false;
- }
ListView几个比较特别的属性
首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为true和false
android:stackFromBottom="true"
第二是transciptMode属性,需要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,并且希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。
android:transcriptMode="alwaysScroll"
第三cacheColorHint属性,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性 android:background="@drawable/bg",不过不要高兴地太早,当你这么做以后,发现背景是变了,但是当你拖动,或者点击list空白位置的时候发现ListItem都变成黑色的了,破坏了整体效果。
如果你只是换背景的颜色的话,可以直接指定android:cacheColorHint为你所要的颜色,如果你是用图片做背景的话,那也只要将android:cacheColorHint指定为透明(#00000000)就可以了
第四divider属性,该属性作用是每一项之间需要设置一个图片做为间隔,或是去掉item之间的分割线android:divider="@drawable/list_driver" 其中 @drawable/list_driver 是一个图片资源,如果不想显示分割线则只要设置为android:divider="@drawable/@null" 就可以了
第五fadingEdge属性,上边和下边有黑色的阴影android:fadingEdge="none" 设置后没有阴影了~
第五scrollbars属性,作用是隐藏listView的滚动条,android:scrollbars="none"与setVerticalScrollBarEnabled(true);的效果是一样的,不活动的时候隐藏,活动的时候也隐藏
第六fadeScrollbars属性,android:fadeScrollbars="true" 配置ListView布局的时候,设置这个属性为true就可以实现滚动条的自动隐藏和显示。
如何在使用gallery在flinging拖动时候不出现选择的情况?
这时候需要注意使用
gallery.setCallbackDuringFling(false)
如何让ListView自动滚动?
注意stackFromBottom以及transcriptMode这两个属性。类似Market客户端的低端不断滚动。
<ListView android:id="listCWJ"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
/>
如何遍历listView 的的单选框?
- ListView listView = (ListView)findViewById(R.id.配置文件中ListView的ID);
-
- for(int i = 0; i < listView.getChildCount(); i++){
- View view = listView.getChildAt(i);
- CheckBox cb = (CheckBox)view.findViewById(R.id.CheckBoxID);
- cb.setChecked(true);
- }
如何让ListView中TextView的字体颜色跟随焦点的变化?
我们通常需要ListView中某一项选中时,他的字体颜色和原来的不一样。 如何设置字体的颜色呢? 在布局文件中TextColor一项来设置颜色,但是不是只设置一种颜色,而是在不同的条件下设置不同的颜色: 下面是个例子:
- <?xml version="1.0" encoding="utf-8" ?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="false" android:color="@color/orange"></item>
- <item android:state_window_focused="false" android:color="@color/orange"></item>
- <item android:state_pressed="true" android:color="@color/white"></item>
- <item android:state_selected="true" android:color="@color/white"></item>
- <item android:color="@color/orange"></item>
- </selector>
- 在获取焦点或者选中的情况下设置为白色,其他情况设置为橘黄色。
如何自定义ListView行间的分割线?
所有基于ListView或者说AbsListView实现的widget控件均可以通过下面的方法设置行间距的分割线,分割线可以自定义颜色、或图片。
在ListView中我们使用属性android:divider="#FF0000" 定义分隔符为红色,当然这里值可以指向一个drawable图片对象,如果使用了图片可能高度大于系统默认的像素,可以自己设置高度比如6个像素android:dividerHeight="6px" ,当然在Java中ListView也有相关方法可以设置。
ListView不通过notifyDataSetChanged()更新指定的Item
Listview一般大都是通过notifyDataSetChanged()來更新listview,但通过notifyDataSetChanged()会把界面上现实的的item都重绘一次,这样会影响ui性能。
可以通过更新指定的Item提高效率,伪代码如下:
- private void updateView(int itemIndex){
- int visiblePosition = yourListView.getFirstVisiblePosition();
- View v = yourListView.getChildAt(itemIndex - visiblePosition);
- TextView tv = (TextView)v.findViewById(R.id.sometextview);
- tv.setText("Hi! I updated you manually");
- }
让ListView中长按某些Item时能弹出contextMenu,有些不能
定义了一个listView,并为他设置了setOnCreateContextMenuListener的监听,但这样做只能使这个listView中的所有项在长按的时候弹出contextMenu 。
有时希望的是有些长按时能弹出contextMenu,有些不能。解决这个问题的办法是为这个listView设置setOnItemLongClickListener监听,然后实现
- public boolean onItemLongClick(AdapterView<?> parent, View view,
- int position, long id) {
- if(id == 1){
- return true;
- }
- return false;
- }
如果这一项的id=1,就不能长按。 这样就可以了
ListView底部分隔线的问题
在工作中遇到了一个难题,就是一个listView在最下面的一个item下面没有分割线,要求是必须得有这条分割线。经过一通研究发现了这个奇怪的现象:
1. ListActivity有这条底部分割线。
2.在Activity中只有listview,没有别的控件的话也会有。
其实ListActivity也是一个Activity,只不过在其中使用了SetContentView(listView)方法设置了一个listView作为其显示的View而已。所以结论就是只要这个activity调用了SetContentView(listView)就会有这条底部分割线。
那么什么情况下才不会有这条分割线呢?在Activity中如果调用setContentView(View)而ListView只是内嵌入到这个View的话有可能会没有这条分割线。
分析其原因:通过加断点调试发现在listView中,所有的分割线都是通过画一个很窄的矩形来实现的,但是在画分割线前都会都会判断目前的位置A和listView的长度B,如果A=B了,那么就不会画这条分割线了。但是将Listview嵌入到一个View中,一般会设置为高度为wrap_content,这种情况下,最后那条分割线的位置刚好等于listView的高度,所以系统不会画上这条分割线。那要怎么样才会画上呢?很简单,将ListView的高度设置为fill_partent就可以了。
当然以上所说的都是item很少的情况下,如果item很多以至于必须显示滚动条的话,那最后一个item下面是肯定不会有分割线了。<!--[endif]-->
<!--[endif]-->
分享到:
相关推荐
在Android开发中,有时我们需要在一个ListView中嵌套另一个ListView,以实现更为复杂的数据展示效果,这就是所谓的“嵌套ListView”。这种布局方式常用于展现层级关系数据,如目录结构、论坛帖子回复等。本文将深入...
在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。然而,有时我们可能需要构建更复杂的界面,比如包含多级分类的数据结构,这时就需要用到ListView的嵌套。"ListView 嵌套 ListView demo"就是...
此外,对于这个项目,还要注意的是如何使ListView与Dialog结合使用。这通常意味着在Dialog的布局文件中包含ListView,然后在Dialog类中设置适配器和监听器。同时,要确保Dialog的大小和位置调整得当,以便于用户查看...
在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。然而,为了提供更丰富的交互体验,开发者常常需要对其进行自定义,例如实现侧拉子菜单的功能。本篇将详细讲解如何在Android中实现这一功能。 ...
这样,只需传入必要的数据和配置,就能轻松地在任何地方使用这个对话框ListView。这将极大地提高代码的可维护性和开发效率。 综上所述,"ListView 对话效果"是Android开发中的一个高级技巧,涉及到自定义Adapter、...
9. **内存管理**:注意内存泄漏问题,尤其是在持有对内外ListView引用的地方,例如匿名内部类的实现中。 10. **项目实践**:在"我的订单AS项目"中,你可以找到一个实际的案例,研究其代码结构、布局文件以及Adapter...
在Android中,实现ListView下拉刷新有多种方式,但最常用的是使用开源库,如SwipeRefreshLayout。SwipeRefreshLayout是Android Support Library中的一个组件,它为子View(例如ListView或RecyclerView)提供了下拉...
在Adapter中,你需要重写`getView()`方法,这是为ListView的每个条目创建视图的地方。 2. **设置条目布局** - 在`getView()`方法内,首先通过LayoutInflater从XML布局文件中加载条目的视图。这个布局文件应该包含...
在这个Adapter中,我们将重写`getView()`方法,因为这是ListView绘制每个项的地方。 2. **测量控件**:在`getView()`方法内,获取到要调整宽度的控件实例,然后调用`measure()`方法进行测量。这个方法接受两个参数...
7. **性能优化**:在处理大量数据时,需要注意性能优化,例如使用ViewHolder模式减少视图的创建和查找,以及在适当的地方使用异步加载和缓存机制。 通过这个开源项目,开发者可以学习到如何扩展和定制Android的内置...
在Android开发中,ListView是一种常见的组件,用于展示大量的列表数据。...在实际开发中,还应注意优化ListView的性能,如使用ViewHolder模式来减少视图的创建和查找,以及在适配器中复用convertView,以提升用户体验。
在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。在许多应用场景中,如邮件管理、联系人列表等,用户可能需要对列表中的多个项目进行批量操作,例如批量删除。本教程将深入讲解如何实现...
首先,我们需要关注`onInterceptTouchEvent`方法,这是ListView和GridView的子类(如自定义AdapterView)中用于拦截触摸事件的地方。在这个方法里,我们需要检测用户的触摸动作是否在可拖拽的图标上开始。一旦检测到...
在Android开发中,ListView与EditText的组合使用是一个常见的场景,比如在列表中添加可编辑的项。然而,这种结合往往会导致一些棘手的问题,特别是关于焦点和数据绑定的混乱。标题"ListView+EditText混乱问题"所提及...
例如,如果数据加载较慢,可以考虑使用异步加载策略,或者在ListView之外的地方进行数据处理,然后再更新视图。 总结来说,"新listView联动示例"提供了实现多个ListView同步滚动的解决方案,这对于创建多列展示、...
在Android开发中,ListView是一种常用的UI控件,用于展示大量数据列表。批量删除ListView中的item是常见的需求,尤其是在处理数据库或者文件系统等需要操作集合数据的场景。本示例将探讨如何实现ListView的批量删除...
最后,确保在适当的地方调用`notifyDataSetChanged()`方法,通知ListView数据已更新,以便ListView刷新显示。 在代码实现过程中,你还需要注意异常处理,确保程序的健壮性。同时,通过注释和良好的代码结构,使代码...
在Android开发中,ListView是一种常用的组件,用于展示大量的数据列表,具有良好的滚动性能。而"安卓listview相关相关-横竖都能滑动的listview嵌套在一起的.zip"这个资源包,显然涉及到一种特殊的ListView使用场景,...
- 注意,嵌套ListView可能导致性能问题,因为每个外部ListView条目都会有自己的内部ListView。可以使用`convertView`机制在`getView()`中复用视图,减少对象创建。 - 如果目录层级很深,可以考虑使用其他控件,如...
通常我们会使用BaseAdapter或者ArrayAdapter作为ListView的数据源。这里以BaseAdapter为例,我们需要维护一个变量来记录当前选中的位置,并在getView方法中根据该位置设置RadioButton的状态: ```java public class...