我为我的客户定制了一个视图
ListView
我的自定义视图将扩展
LinearLayout
,它将作为普通数据库的可扩展项
列表视图
列表视图
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
所以高度是
wrap_content
让我们注意这一点,因为这将有助于我们理解这个问题。
这是我的ListVIew的视频。第一
Expandable
项目是可见的,但其他项目没有填满屏幕,我很有信心这是因为
包装内容
但只要我展开其中一个项目,它就会填满整个屏幕。我如何解决这个问题?我猜是因为ListView没有更新其他项目?这是我的CustomView代码
import android.content.Context;
import android.database.DataSetObserver;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import java.util.ArrayList;
import java.util.List;
public class ExpandableInnerListView extends LinearLayout {
private ListAdapter adapter;
private DataChangeObserver dataChangeObserver;
private View mainView;
private List<View> reusableViews = new ArrayList<>();
private boolean viewsHidden = true;
int mDividerHeight = 1;
public ExpandableInnerListView(Context context) {
this(context, null);
}
public ExpandableInnerListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ExpandableInnerListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setOrientation(VERTICAL);
}
public void setAdapter(ListAdapter adapter) {
if (this.adapter != null && dataChangeObserver != null) {
this.adapter.unregisterDataSetObserver(dataChangeObserver);
}
this.adapter = adapter;
}
public void setMainView(View mainView) {
this.mainView = mainView;
}
public void toggle() {
viewsHidden = !viewsHidden;
dataChangeObserver.onInvalidated();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (adapter != null) {
dataChangeObserver = new DataChangeObserver();
adapter.registerDataSetObserver(dataChangeObserver);
setupView();
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (adapter != null && dataChangeObserver != null) {
adapter.unregisterDataSetObserver(dataChangeObserver);
dataChangeObserver = null;
}
}
private void setupView() {
this.removeAllViews();
setupMainLayout();
setupInnerView();
}
public void setupMainLayout() {
if (mainView == null) {
throw new NullPointerException("Main View cannot be null!");
}
addView(mainView);
}
public void setupInnerView() {
if (viewsHidden) return;
int reusableCount = reusableViews.size();
int count = adapter.getCount();
for (int i = 0; i < count; i++) {
View converView = null;
if (i < reusableCount) {
converView = reusableViews.get(i);
}
View view = adapter.getView(i, converView, this);
if (i >= reusableCount) {
reusableViews.add(view);
}
if(mDividerHeight > 0) {
View divider = new View(getContext());
divider.setBackground(new ColorDrawable(0xFFCCCCCC));
LinearLayout.LayoutParams dividerLayoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mDividerHeight);
divider.setLayoutParams(dividerLayoutParams);
addView(divider);
}
addView(view);
}
}
private class DataChangeObserver extends DataSetObserver {
@Override
public void onChanged() {
super.onChanged();
setupView();
}
@Override
public void onInvalidated() {
super.onInvalidated();
setupView();
}
}
}
这是我的整个片段视图XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff">
<include
android:id="@+id/back_button_container"
layout="@layout/kik_back_button" />
<FrameLayout
android:id="@+id/topbar"
android:layout_width="match_parent"
android:layout_height="@dimen/native_topbar_height"
android:layout_alignParentTop="true"
android:layout_toEndOf="@id/back_button_container"
android:layout_toRightOf="@id/back_button_container" />
<include
android:id="@+id/nav_bar_shadow"
layout="@layout/navbar_underline"
android:layout_width="fill_parent"
android:layout_height="@dimen/navbar_underline_height"
android:layout_below="@id/topbar" />
<EditText
android:id="@android:id/edit"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_below="@+id/topbar"
android:layout_centerHorizontal="true"
android:textSize="18sp"
android:layout_marginEnd="15dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginStart="15dp"
android:layout_marginTop="15dp"
android:drawablePadding="15dp"
android:hint="Search Settings"
android:inputType="textNoSuggestions"
android:maxLines="1"
android:paddingEnd="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingStart="16dp"
android:textStyle="normal"
android:typeface="sans" />
<ImageView
android:id="@android:id/icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_alignEnd="@android:id/edit"
android:layout_alignRight="@android:id/edit"
android:layout_alignTop="@android:id/edit"
android:layout_marginEnd="15dp"
android:layout_marginRight="15dp"
android:layout_marginTop="12dp"
android:src="@drawable/delete_gray"
android:visibility="gone" />
<View
android:id="@+id/top_divider"
android:layout_width="match_parent"
android:layout_height="1.0px"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@android:id/edit"
android:layout_marginTop="15dp"
android:background="@color/list_divider_color" />
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/top_divider"
android:divider="@null"
android:dividerHeight="0dp" />
<View
android:id="@+id/bottom_divider"
android:layout_width="match_parent"
android:layout_below="@android:id/list"
android:layout_height="1.0px"
android:background="@color/list_divider_color" />
<TextView
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="No Settings Found"
android:textSize="19.0sp"
android:visibility="gone" />
</RelativeLayout>
如果有人能够发现错误发生的地方以及如何解决它,如果在某些情况下可能发生任何其他错误,那将是非常慷慨的。