调用setVisibility(View.VISIBLE)后,Android Listview中的项目未被绘制

3
我有一个列表视图,每一行的高度为450dp,例如,在大多数情况下,listview最多只会同时呈现3个项目。
当列表视图最初加载时,每行只是一个带有一个“显示详细信息”按钮的图像(全部包含在相对布局中)。当用户点击按钮时,它通过调用setVisibility(View.GONE)隐藏当前具有图像和按钮的相对布局,并通过调用setVisibility(View.VISIBLE)显示另一个视图(LinearLayout)。
请记住,相对布局和线性布局都驻留在同一个xml中,该xml在Adapter.getView()中被填充,我只是在可见性方面切换其中之一。
问题在于,调用setVisibility(View.VISIBLE)后,线性布局不显示。 它成功地隐藏了相对布局,但线性布局没有出现。
只有在滚动列表视图上下以呈现新项目时,它才会出现。
我如何强制显示相对布局? 通过强制重绘? 我尝试过通过调用invalidate来实现,但它没有起作用。
我还尝试了requestLayout,但同样无效。
我还尝试了notifyDataSetChanged(),它没有起作用,而且我认为我不应该调用它,因为适配器中的数据没有更改,我只是隐藏和显示一个新视图。
请帮帮我。
for(int i=start, j=list.getLastVisiblePosition();i<=j;i++) {
   if(list.getItemAtPosition(vh.position)==list.getItemAtPosition(i)){
       final View view = list.getChildAt(i-start);
       final int index = i;
       view.requestLayout();
       lv.invalidateChild(view, new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()));
        runOnUiThread(new Runnable() {
             @Override
                 public void run(){
                     //lv.invalidateChild(view, new Rect(view.getLeft(),
                      //view.getTop(), view.getRight(), view.getBottom()));     
                     lv.requestChildRectangleOnScreen(view, new Rect(view.getLeft(), 
                           view.getTop(), view.getRight(), view.getBottom()), false);
                     view.requestLayout();
                     list.getAdapter().getView(index, view, list);
        } 
     });
     break; 
   }
}

你是否在按钮的点击事件中调用了notifyDataSetChange()方法? - Ankit
2个回答

0

你应该使用requestChildRectangleOnScreen(),像这样。

这是我的全部代码:有一个略微不同的情况:我不会隐藏原始布局。但是显示/隐藏子布局效果很好。也许你可以参考一下。

        @Override
    public void onClick(final View v) {
        if (mResultView == null) {
            return;
        }

        View buttonLayout = mResultView.findViewById(R.id.call_button);
        if (buttonLayout == null) {
            return;
        }

        switch (buttonLayout.getVisibility()) {
            case View.GONE:
                for (View view : mVisibleCallButtons) {
                    view.setVisibility(View.GONE);
                }

                mVisibleCallButtons.clear();
                displayCallButton(buttonLayout, true);
                mVisiblePosition = mPosition;
                Handler handler = new Handler();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (mListView != null && mResultView != null) {
                            mListView.requestChildRectangleOnScreen(mResultView, new Rect(0, 0,
                                    mResultView.getWidth(), mResultView.getHeight()), false);
                        }
                    }
                });
                break;
            case View.VISIBLE:
            default:
                displayCallButton(buttonLayout, false);
                mVisiblePosition = -1;
                break;
        }
    }
};

    private void displayCallButton(View btnLayout, boolean visible) {
    if (visible) {
        btnLayout.setVisibility(View.VISIBLE);
        mVisibleCallButtons.add(btnLayout);
    } else {
        btnLayout.setVisibility(View.GONE);
        mVisibleCallButtons.remove(btnLayout);
    }
}

这是项目布局的XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<LinearLayout
    android:nextFocusRight="@+id/secondary_action_button"
    android:layout_weight="1" >

    <LinearLayout
        android:id="@+id/actions_view_container"
        android:paddingBottom="@dimen/quickcontact_list_item_padding_bottom" >

        <TextView
            android:id="@android:id/text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@android:id/text1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>

</LinearLayout>

<LinearLayout
    android:id="@+id/call_button"
    android:layout_width="match_parent"
    android:layout_weight="1"
    android:visibility="gone" >

    <include layout="@layout/call_button" />
</LinearLayout>


谢谢你的回答,但是那个方法没有起作用。我已经根据你的建议更新了我的原始问题,并展示了我写的代码片段。 - XyzNullPointer
mResultView是你的RelativeLayout和LinearLayout的父视图,在我的示例中,它是使用我提供的布局文件创建的。 - buptcoder

0

系统对ListView的处理非常有效,在一个项目即将因为不可见而被回收时,新的项目将会被展示,系统会重用旧项目实例。如果您将项目内容视图设置为View.GONE,当您获取项目实例时,它的内容视图状态仍然是View.GONE,因此您必须手动更改项目的内容为View.VISIBLE。


你的回答没有帮助,我不明白你想说什么。我已经手动将该项的可见性设置为可见。 - XyzNullPointer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接