Android TypeFace - android.support.v7.widget.AppCompatTextView不正确调用的requestLayout()

时间:2015-09-17 09:10:30

标签: android listview textview

我正在更改ListView中TextView的TypeFaceBold

(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();
}

0 个答案:

没有答案