调用setVisibility(View.VISIBLE)后未绘制Android Listview项

时间:2013-04-22 03:13:09

标签: android listview android-listview

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

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

请记住BOTH相对布局和线性布局位于Adapter.getView()中膨胀的同一个xml中,我只是根据可见性切换其中一个。

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

只有在列表视图中的新项目需要通过向上和向下滚动列表视图后才会显示

如何强制显示相对布局?通过武力重绘?我通过调用invalidate来尝试它,它没有用。

我也尝试过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; 
   }
}

2 个答案:

答案 0 :(得分:0)

系统hanler listview非常有效,当一个项目无法看到,并且将显示anthrod项目时,系统将重用旧项目权限。如果您将项目内容视图设置为View.GONE,当您获得项目实例时,它的内容视图的状态是View.Gone,因此您必须手动将项目的内容更改为View.VISIBLE

答案 1 :(得分: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>