我有一个列表视图 列表视图中的每一行都有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;
}
}
答案 0 :(得分:0)
答案 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>