调用setVisibility(View.VISIBLE)后未绘制Android Listview项
我有一个列表视图 例如,列表视图中的每一行的高度为450dp 因此,在大多数情况下,listview一次最多呈现3个项目 最初加载列表视图时,每一行只是一个带有“显示详细信息”按钮的图像(所有内容都包含在相对布局中) 当用户单击按钮时,它通过调用setVisibility(View.GONE)隐藏具有图像和按钮的当前相对布局,并通过调用setVisibility(View.VISIBLE)显示另一个视图(LinearLayout) 记住,相对布局和线性布局都位于Adapter.getView()中膨胀的同一xml中,我只是在可见性方面切换其中一个 问题是,在线性布局上调用setVisibility(View.VISIBLE)后,它不会显示。它确实成功地隐藏了相对布局,但没有显示线性布局 它仅在需要通过上下滚动列表视图来呈现列表视图中的新项目后出现 如何强制显示相对布局?强行重画?我通过调用invalidate尝试了这一点,但它不起作用 我也尝试了requestLayout,但还是没用 我还尝试了notifyDataSetChanged(),但它不起作用,我认为无论如何都不应该调用它,因为适配器中的数据没有任何更改,我只是简单地隐藏和显示一个新视图 请帮忙 编辑: 基于butcode的帮助,但不起作用调用setVisibility(View.VISIBLE)后未绘制Android Listview项,android,listview,android-listview,Android,Listview,Android Listview,我有一个列表视图 例如,列表视图中的每一行的高度为450dp 因此,在大多数情况下,listview一次最多呈现3个项目 最初加载列表视图时,每一行只是一个带有“显示详细信息”按钮的图像(所有内容都包含在相对布局中) 当用户单击按钮时,它通过调用setVisibility(View.GONE)隐藏具有图像和按钮的当前相对布局,并通过调用setVisibility(View.VISIBLE)显示另一个视图(LinearLayout) 记住,相对布局和线性布局都位于Adapter.getView()
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;
}
}
for(int i=start,j=list.getLastVisiblePosition();i系统可以非常有效地处理listview,当一个项目看不见,并且将显示一个Arrod项目时,系统将重用旧的项目说明。如果将项目内容视图设置为view.Goe,则当您获取项目实例时,其内容视图的状态为view.Goe,因此您必须手动将项目的内容更改为view.VISIBLE您应该使用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>
您的回答没有帮助,我也不明白您想说什么。我已经手动将项目的可见性设置为可见。谢谢您的回答,这不起作用,我已更新了我的原始问题,以显示我根据您的建议编写的片段。mResultView是您的亲戚Yout和lin的父视图早期布局,在我的exmaple中,它是用我提供的布局文件创建的。单击按钮后是否调用notifyDataSetChange()方法?