2017-08-09 54 views
0

我有一个ArrayList填充整数和ListView。现在我想通过这个Arraylist,如果status.get(i) % 2 != 0,我想通过充满TextViews的ListView的相应子节点。迭代ListView的子代

我的代码:

for(int i = 0; i < mLsitView.getCount(); i++){ 
      TextView tv = (TextView) mLsitView.getChildAt(i); 
      if(mArrayList.get(i) % 2 != 0) { 
      tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
      } 
     } 

当我执行这个代码,它给了我一个NullPointerException异常,告诉我:Attempt to invoke virtual method 'Attempt to invoke virtual method 'int android.widget.TextView.getPaintFlags()' on a null object reference

我已经搜索了互联网,但我找不到解决方案。有人说你应该在循环中使用for (int 1 = 0; i < mLsitView.getFirstVisiblePosition() - mLsitView.getLastVisiblePosition(); i++,但它对我而言只返回0,代码片段不会执行。

回答

0

ListView与常规视图的不同之处在于,ListView的子元素不一次全部存在。 ListViews生成足够的子视图以适应设备的屏幕,再加上一些额外的。在您浏览ListView时,从屏幕顶部消失的子视图是recycled and placed at the bottom again以供重用,以便手机不必一直创建和销毁视图。

要在每个其他视图上放置一个透视图,您必须创建一个自定义Adapter。当你的适配器被调用时,它也会收到你正在创建的视图的位置,你可以用它来确定是否绘制透视。

+0

Ty为答案! – Sarius

2

你不能做这样的,因为列表不会一次性创建所有视图,

就可以解决这个问题,通过把你getView在适配器中的状态。

+0

我不明白你的观点。你能解释一下,所以初学者可以理解它吗? – Sarius

+0

转到你的列表适配器(应该是自定义列表适配器),检查你将得到的getView()方法,在那样的情况下,你将得到TextView,你可以根据该位置修改。 –

+0

我没有自定义适配器,只是使用ArrayAdapter ... – Sarius