3

例如,我有一个列表视图,列表视图中的每一行的高度为 450dp,因此在大多数情况下,列表视图将同时呈现最多 3 个项目。

最初加载列表视图时,每一行只是一个带有“显示详细信息”按钮的图像(全部包含在相对布局中)当用户单击按钮时,它会隐藏当前具有图像和按钮的相对布局通过调用 setVisibility(View.GONE),并通过调用 setVisibility(View.VISIBLE) 显示另一个视图 (LinearLayout)

请记住,相对布局和线性布局都位于在 Adapter.getView() 中膨胀的同一个 xml 中,我只是在可见性方面切换另一个。

问题是,在线性布局上调用 setVisibility(View.VISIBLE) 后,它不显示。它确实成功隐藏了相对布局,但没有出现线性布局。

它仅在需要通过上下滚动列表视图来呈现列表视图中的新项目之后出现。

如何强制显示相对布局?通过强制重绘?我通过调用无效尝试过,它不起作用。

我也试过requestLayout,但同样没用。

我也尝试了 notifyDataSetChanged(),它没有用,我认为无论如何我都不应该调用它,因为适配器中的数据没有任何变化,我只是简单地隐藏并显示一个新视图。

请帮忙

编辑:基于butcode的帮助,但没有用

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; 
   }
}
4

2 回答 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>

于 2013-04-22T04:34:44.897 回答
0

系统对listview的处理非常有效,当一个item看不到的时候,anthrod item会被显示,系统会重用旧的item instence。如果您将项目内容视图设置为 View.GONE,当您获取项目实例时,其内容视图的状态为 View.Gone yet,因此您必须手动将项目的内容更改为 View.VISIBLE

于 2013-04-22T03:29:37.483 回答