Android 使用适配器在Listview中填充Listview

Android 使用适配器在Listview中填充Listview,android,listview,android-fragments,android-listview,android-adapter,Android,Listview,Android Fragments,Android Listview,Android Adapter,我有一个碎片。加载的视图的onCreateView方法上的这个片段有一个ListView(a)(在适配器(a)中填充)。但是,此ListView(A)内部有另一个ListView(B)。现在,我必须调用一个适配器(B)来填充这个listview(B)。如果我从片段调用它,我会得到一个空指针,如果我从适配器调用它(a),它不会崩溃,但不会工作 如何调用另一个适配器中的适配器 这是片段的代码: public View onCreateView(LayoutInflater inflater, Vie

我有一个碎片。加载的视图的onCreateView方法上的这个片段有一个ListView(a)(在适配器(a)中填充)。但是,此ListView(A)内部有另一个ListView(B)。现在,我必须调用一个适配器(B)来填充这个listview(B)。如果我从片段调用它,我会得到一个空指针,如果我从适配器调用它(a),它不会崩溃,但不会工作

如何调用另一个适配器中的适配器

这是片段的代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mContentView = inflater.inflate(R.layout.fragment_kidscontacts, container, false);
    mAdapter = new KidsContactsAdapter(getActivity());
    final ListView list = (ListView) mContentView.findViewById(R.id.listViewKidsContacts);
    list.setAdapter(mAdapter); 
    return mContentView;
}
其中mAdapter是我对适配器(a)的调用。mContentView是一个简单的视图。 现在,适配器的代码(A)中创建了一个名为Holder的Holder对象(它保存xml中的元素)


适配器(B)中有一些日志,但它们没有显示在LogCat中。列表视图也没有被填充。它显示为如果没有listview。然而,在xml中它是存在的

你说得对。要填充第二个列表视图,请在

@凌驾 公共视图getView(最终整数位置、视图转换视图、视图组父视图){

方法(在第一个列表视图中获取每个项),您必须从视图中获取(第二个)列表视图(convertView或为第一个列表视图的项扩展布局)。在获取要填充的(第二个)列表视图后,在此方法中,您可以设置适配器,执行以下操作: ListView ListView=(ListView)view.findViewById(R.id.___;);//获取第一个列表视图中的第二个列表视图 setAdapter(第二个列表视图的适配器)

这应该行得通。把你的代码放在这里,我可以看一下,然后告诉你为什么它可能不起作用

也可以看看这些:(如果你想做这样的事情)


可能发生的一件事是,第二个列表视图的高度设置不正确,因为它位于另一个列表视图中。我可能不得不处理一次

尝试在第一个适配器中使用此方法来设置列表视图的高度-(设置适配器后) 类似setListViewHeightBasedOnChildren(holder.listViewKidsContacts)的内容

//用于动态设置ListView高度的方法

public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null)
        return;

    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED);
    int totalHeight = 0;
    View view = null;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        view = listAdapter.getView(i, view, listView);
        if (i == 0)
            view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT));
        view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
        totalHeight += view.getMeasuredHeight();
    }
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
    listView.requestLayout();
}
public static void setListViewHeightBasedOnChildren(ListView ListView){
ListAdapter ListAdapter=listView.getAdapter();
如果(listAdapter==null)
返回;
int desiredWidth=MeasureSpec.makeMeasureSpec(listView.getWidth(),MeasureSpec.UNSPECIFIED);
int totalHeight=0;
视图=空;
对于(int i=0;i
如果这不起作用,我会尝试在以下行上断点: KidsInsideContactsAdapter mAdapter=new KidsInsideContactsAdapter(((活动)mContext));//这是适配器(B) holder.listViewKidsContacts.setAdapter(mAdapter);//将适配器(B)分配给ListView(B)

调试时,检查mAdapter是否为null。同时在KidsInsideContactsAdapter的构造函数中放置断点,查看是否一切正常


还要检查以确保holder.listViewKidsContacts是调试时要查找的列表视图。

这修复了它。getCount返回0,因为我有一个错误,所以如果有人遇到类似问题,请检查它。感谢mate的回答…我在适配器内部调用适配器,并且listviews高度属性为动态更改…初始值为0…我注意到,当我将targetsdk更改为更高级别时,我看到listview项未被访问…在看到您的答案后,我已经解决了问题…但为什么目标低api项可见,但在更高级别的目标api中不可见??
public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null)
        return;

    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED);
    int totalHeight = 0;
    View view = null;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        view = listAdapter.getView(i, view, listView);
        if (i == 0)
            view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT));
        view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
        totalHeight += view.getMeasuredHeight();
    }
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
    listView.requestLayout();
}