TextView.post Runnable并不总是有效

时间:2013-09-18 13:37:27

标签: java android android-layout listview adapter

我有一个ListView,可以通过单击标签来删除项目。这个ListView在我自己的Adapter中继承自BaseAdapter。单击此标签后,我正在调用一个方法,从我的适配器中存储的数据数组中删除该元素 每个元素都包含一些布局内容,在一个布局中包含TextView。有时这个视图应该是可见的。但是我只知道它是否应该是可见的,在列表视图之后是不可思议的! (我问它是否是椭圆化的)所以我使用了一个带有Runnable的post方法。

在我的getView方法中,我有以下Runnable语句:

holder.llMyItem.post(new Runnable() {
  @Override
  public void run() {
     if (...) { 
         holder.lblExpand.setVisibility(View.VISIBLE);
     }
   }
});

llMyItem是ListView中项目的LinearLayout。

lblExpand是我的TextView,应该是可见的。

我的View第一次出现在Android 4.3上运行正常。但是在Android 2.1上它无法正常工作。

仅在我点击视图中的“下一步”按钮后才会显示标签。就在我的活动结束之前,我的Textview将会出现。但那太晚了! 还有第二个问题: 使用以下方法删除列表中的一个项目后,在调用notifyDataSetChanged后它将无效。在屏幕上某处触摸后,可以开始运行。

我认为这两个问题具有相同的根源。

以下是删除项目的方法的代码(我简化了它)

public void removeListItem(int position) {
   //do some animation stuff
   ArrayList<SomeClass> data = getData();
   data.remove (position);
   notifyDataSetChanged();
}

(“删除物品”工作正常)

我尝试使用ListView上的invalidate方法重绘它。但它仍然无法正常工作。布局完成后,Runnable没有启动。

有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

刚刚解决了!

我没有将Runnable添加到我的布局中,而是将其添加到处理程序中。

现在看起来像这样: 在我的getView方法中,我添加了这一行

//uiHandler is a private Attribute    
uihandler = new Handler();

在我的create方法中,我在新处理程序上调用post方法

uiHandler.post(new Runnable() {
   @Override
   public void run() {
       if (...){
          holder.lblExpand.setVisibility(View.VISIBLE);
       }
    }
 });

我得到的暗示: https://stackoverflow.com/a/4083830/2380896

这个答案高于另一个,有助于理解为什么它并不总是有效: https://stackoverflow.com/a/10457064/2380896