项目中那些事| ListView 一些问题

来源:互联网 发布:淘宝卖的息肌丸管用吗 编辑:程序博客网 时间:2024/05/16 00:59


4.  java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.

原因主要还是牵涉到 线程之间同步 问题,ListView本身就是线程不安全的 ,出现以下错误。 主要是 线程1更新了Adapter中的内容,却还没有来得及通知内容已经更新,就又有线程2更新了Adapter中的内容,这个时候如果线程1再通知内容更新

  解决办法:

  把数据源ListData 和 notifyDataSetChanged(); 放到同一个线程中。

我相信方法有很多中,如

1.如何你使用线程处理的后台数据,那么就在run方法里面用Handler将数据send出来到主线程里面的handleMessage然后再addAll或者赋值;

1-1. 不send出,创建一个临时的 List<>, 在handleMessage然后再addAll;

2.如果用的异步task,那么在onPostExecute里面去add或者赋值就ok了,注意千万不要在后台去修改类变量的方式去修改数据;



3. ListView的item动画

实现item动画其实很简单,只需在控件Listview中添加属性android:layoutAnimation=“”即可,下面看具体步骤:

     <ListView        android:id="@id/lv_test"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:cacheColorHint="#00000000"        android:layoutAnimation="@anim/item_layout_anim"/>


首先说一下什么是LayoutAnimationsController?

LayoutAnimationsController可以用于实现使多个控件按顺序一个一个的显示。

1)LayoutAnimationsController用于为一个layout里面的控件,或者是一个ViewGroup里面的控件设置统一的动画效果。

2)每一个控件都有相同的动画效果。

3)控件的动画效果可以在不同的时间显示出来。

4)LayoutAnimationsController可以在xml文件当中设置,以可以在代码当中进行设置。

在xml当中使用LayoutAnimationController

1)在res/anim文件夹下创建一个名为item_layout_anim文件:

android:dylay -动画间隔时间;

android:animationOrder -动画执行的循序(normal:顺序,random:随机,reverse:反向显示)

android:animation –引用动画效果文件

<?xml version="1.0" encoding="utf-8"?><layoutAnimation   xmlns:android="http://schemas.android.com/apk/res/android"   android:delay="0.5"   android:animationOrder="normal"   android:animation="@anim/item_anim"/>
这里注意layoutAnimation首字母大小写(小写),我就在这里调试了好久,汗。。。

2)创建item_anim文件,设置动画效果,从左到右飞入效果

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"    android:interpolator="@android:anim/accelerate_interpolator" >    <translate        android:fromXDelta="-100%p"        android:duration="1000"        android:toXDelta="0.0" />    <alpha        android:fromAlpha="0.0"        android:duration="500"        android:toAlpha="1.0"/></set>
到这里,就完成实现ListView中item的动画效果了~



2. ListView的item无法响应点击事件
通常默认能获得focus的控件有Button,Checkable继承来的所有控件,这就意味着如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus,也就是说我们可以通过将ListView中Item中包含的所有控件的focusable属性设置为false,这样的话ListView的Item自动获得了Focus的权限,也就可以被选中了,也就会响应onItemClickListener中的onItemClick()方法;
解决方法:

我们可以通过对Item Layout的根控件设置其android:descendantFocusability=”blocksDescendant”即可,这样Item Layout就屏蔽了所有子控件获取Focus的权限。(注:单个设置子控件的 focusable 有时不起作用,有知道原因的请留言,3Q~)


1. ListView的item无法响应点击事件
a.如果是listView的id是使用系统默认的id,如下, 则可以在实现此listView的adapter里override isEnabled()方法:
@Override public boolean isEnabled(int position) { return false; } 

b.如果是listView的id是使用系统默认的id,如下, 则可以在实现此listView的adapter里override isEnabled()方法:


ListView.setEnabled(false);
原创粉丝点击