android中的动态嵌套列表视图

android中的动态嵌套列表视图,android,listview,android-listview,Android,Listview,Android Listview,我的应用程序要求我显示动态嵌套列表视图。 我的外部listview是一系列作业,每个作业内部都包含它所需的行项目的listview。 我使用自定义适配器来实现动态嵌套ListView。如下所示: LineItemCustomListViewAdapter-加载单个作业的数据项 JobCustomListViewAdapter-通过在每个作业上调用LineItemCustomListViewAdapter来加载各个作业 JobCustomListViewAdapter的getView函数如下- p

我的应用程序要求我显示动态嵌套列表视图。 我的外部listview是一系列作业,每个作业内部都包含它所需的行项目的listview。 我使用自定义适配器来实现动态嵌套ListView。如下所示:

LineItemCustomListViewAdapter-加载单个作业的数据项

JobCustomListViewAdapter-通过在每个作业上调用LineItemCustomListViewAdapter来加载各个作业

JobCustomListViewAdapter的getView函数如下-

public View getView(int position, View convertView, ViewGroup parent ) {

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_job, parent, false);
        holder = new ViewHolder();
        holder.jobnum = (TextView)convertView.findViewById(R.id.JobNum); // jobID
        holder.lineitems = (ListView)convertView.findViewById(R.id.list); // lineitems

        convertView.setTag(holder);
    } else
        holder = (ViewHolder) convertView.getTag();

    holder.jobnum.setText(job.getJobID());
    listviewadapter = new LineItemCustomListViewAdapter(context,R.layout.list_row, job.getLineItem());
    holder.lineitems.setAdapter(listviewadapter);   

    return convertView;
}
在显示外部作业列表和内部列表之前,这都可以正常工作。但每个作业在内部仅显示第一个产品项,即外部列表的每一行仅显示内部列表的第一行

有人能指出我是否遗漏了什么或者我哪里出了错吗。任何帮助都将不胜感激

编辑:根据巴伦德的评论,使用ExpandableListAdapter使其工作。

由于ExpandableListView根据需要在父/子组中将每个元素添加为新行,因此列表的动态性质并不重要。 我将父级及其关联的子级数据存储在ArrayList对象中,这些对象正在扩展适配器类中处理

public class ExpandableAdapter extends BaseExpandableListAdapter {

    private Context context;
    private ArrayList<String> parent;
    private ArrayList<ArrayList<LineItem>> children;

    public ExpandableAdapter(Context context, ArrayList<String> parent,
        ArrayList<ArrayList<LineItem>> children) {
         this.context = context;
         this.parent = parent;
         this.children = children;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) {

        final LineItem lineitem = (LineItem)getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
               convertView = mInflater.inflate(R.layout.list_row, null);
        }

        TextView item; // item
        TextView desc; // desc

        item = (TextView)convertView.findViewById(R.id.Item); // item
        desc = (TextView)convertView.findViewById(R.id.Desc); // desc

        item.setText(lineitem.getItem());
        desc.setText(lineitem.getDesc());
        return convertView;
    }


    public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) {
    Integer parentnum = Integer.valueOf(groupPosition);

        String parentcond = (String) getGroup(groupPosition);
        TextView jobnum; // jobID
        TextView cond; 

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_job,
                null);
        }    
        jobnum = (TextView)convertView.findViewById(R.id.JobNum); // jobID
        cond = (TextView)convertView.findViewById(R.id.Condition); // cond

        jobnum.setText(parentnum.toString())
        cond.setText(parentcond);
        return convertView;
   }

   /// other methods
} 
公共类ExpandableAdapter扩展了BaseExpandableListAdapter{
私人语境;
私有ArrayList父级;
私人ArrayList儿童;
公共可扩展适配器(上下文、ArrayList父级、,
ArrayList(儿童){
this.context=上下文;
this.parent=parent;
这个。孩子=孩子;
}
@凌驾
公共视图getChildView(最终int groupPosition,最终int childPosition,
布尔值isLastChild、视图转换视图、视图组父级){
最终LineItem LineItem=(LineItem)getChild(groupPosition,childPosition);
if(convertView==null){
LayoutInflater mInflater=(LayoutInflater)上下文
.getSystemService(活动.布局\充气机\服务);
convertView=mInflater.充气(R.layout.list_行,空);
}
TextView项;//项
TextView desc;//desc
item=(TextView)convertView.findViewById(R.id.item);//item
desc=(TextView)convertView.findViewById(R.id.desc);//desc
item.setText(lineitem.getItem());
desc.setText(lineitem.getDesc());
返回视图;
}
公共视图getGroupView(int-groupPosition,布尔值isExpanded,
视图(视图、视图组父级){
整数parentnum=Integer.valueOf(groupPosition);
字符串parentcond=(字符串)getGroup(groupPosition);
TextView jobnum;//作业ID
文本视图条件;
if(convertView==null){
LayoutInflater infalInflater=(LayoutInflater)上下文
.getSystemService(上下文布局\充气机\服务);
convertView=充气机充气(R.layout.list\U作业,
无效);
}    
jobnum=(TextView)convertView.findViewById(R.id.jobnum);//jobID
cond=(TextView)convertView.findViewById(R.id.Condition);//cond
jobnum.setText(parentnum.toString())
cond.setText(parentcond);
返回视图;
}
///其他方法
} 

您不应该尝试嵌套两个列表视图–这两个视图都是滚动视图,用户体验变得很糟糕。您应该做的是使用,它允许您创建父视图(组)和子视图的列表。每个组可能有多个子项,因此在实践中,您有嵌套列表,但实际上,它是一个单一的
列表视图
您最好不要嵌套列表视图。这种方式效率很低


您可以使用ExpandableListView。或者你可以使用这个项目。它符合您的情况,并且易于使用。

嵌套的
列表视图不太可能正常工作
ExpandableListView
似乎是一个更实用的解决方案。Hi@Commonware-Barend在下面的回答中提到ExpandableListAdapter是一个可能的选项。我猜这是因为我的内部和外部列表都是动态的。如果你也能加入,我将非常感谢。嗨@Barend-非常感谢你的回答!碰巧,我的内部和外部列表在这里都是动态的。所以,你能给我一些提示或者传递一些他们可能处理过这样一个场景的链接吗?这将非常有助于我走上正确的轨道。@Sandman:“碰巧,我的内部和外部列表在这里都是动态的”--所以?@Commonware-我可能没有使用正确的单词或搜索短语进行搜索,但当我搜索类似的内容时,我只遇到过使用ExpandableListAdapter处理静态数据的示例。我正在寻找一个使用动态数据可扩展列表的实现。如果您能为我指出正确的方向,我将不胜感激。扩展
BaseExpandableListAdapter
,在数据发生更改时使用
notifyDataSetChanged()
方法;这将告诉列表视图重新计算/rerender.Hi@Barend-感谢您的宝贵意见。我已经接受了你的答案,并编辑了我的帖子,说明我是如何实现我所需要的。非常感谢!