我正在更改ListView中TextView的TypeFace
到Bold
。
(TextView) listView.getChildAt(childIndex)).setTypeface(Typeface.DEFAULT, 1);
它工作正常,但我经常得到这个:
09-17 10:57:41.996 20991-20991/com.XXXX.XXXXX W/View﹕ requestLayout() improperly called by android.support.v7.widget.AppCompatTextView{22467cb8 V..D.... ........ 0,270-480,366 #1020014 android:id/text1} during second layout pass: posting in next frameX
我已经阅读了有关此问题的所有其他主题(希望如此)。最常见的是这是fastscroll
属性的问题,但不幸的是,这并没有解决我的问题。
如果我注释掉上面提到的这一行,我就不再收到这些警告,但类型不会显示为粗体......
很高兴找到解决方法。
编辑我:
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
getViewByPosition(mDrawerListView);
这是ListView的onScroll,它调用:getViewByPosition(mDrawerListView);
public void getViewByPosition(ListView listView) {
int firstListItemPosition = listView.getFirstVisiblePosition();
for (int i = 0; i < listView.getChildCount(); i++) {
if (listView.getChildAt(i) != null) {
listView.getChildAt(i).setEnabled(true);
if(i>0) {
// Typeface.DEFAULT, 0 == NORMAL
((TextView) listView.getChildAt(i)).setTypeface(Typeface.DEFAULT, 0);
}
}
for (int j = 0; j < HeaderArray.length; j++) {
int childIndex = HeaderArray[j] - firstListItemPosition;
if (listView.getChildAt(childIndex) != null) {
listView.getChildAt(childIndex).setEnabled(false);
//BUG THROUGH TYPEFACE.BOLD
//requestLayout() improperly called by android.support.v7.widget.AppCompatTextView{
// Typeface.DEFAULT, 1 == BOLD
((TextView) listView.getChildAt(childIndex)).setTypeface(Typeface.DEFAULT, 1);
// listView.getChildAt(childIndex).setBackgroundColor(0xFF00FF00);
}
}
listView.refreshDrawableState();
}
}
解决方案: 我将getViewByPosition()移动到getView,现在消息不再出现了。另外,我必须调整方法,以便我不再使用listView.getChildAt(pos)。
public void getViewByPosition(ListView listView, View v, int position) {
v.setEnabled(true);
((TextView) v).setTypeface(Typeface.DEFAULT, 0);
for (int j = 0; j < HeaderArray.length; j++) {
if(HeaderArray[j]==position+1){
v.setEnabled(false);
((TextView) v).setTypeface(Typeface.DEFAULT, 1);
}
}
listView.refreshDrawableState();
}