【问题标题】:Dynamic nested listviews in androidandroid中的动态嵌套列表视图
【发布时间】:2013-08-25 18:37:55
【问题描述】:

我的应用要求我显示动态嵌套列表视图。 我的外部列表视图是一系列工作,每个工作都包含一个列表视图,其中包含所需的行项目。 我正在使用自定义适配器来实现动态嵌套列表视图。如下所示:

LineItemCustomListViewAdaptor - 为单个作业加载数据项

JobCustomListViewAdaptor - 通过在每个作业上调用 LineItemCustomListViewAdaptor 来加载各个作业。

我的JobCustomListViewAdaptor的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;
}

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

谁能指出我是否遗漏了什么或哪里出错了。任何帮助将不胜感激!

编辑:根据 Barend 的评论,使用 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
} 

【问题讨论】:

  • 嵌套ListViews 不太可能正常工作。 ExpandableListView 似乎是一个更实用的解决方案。
  • 嗨@CommonsWare - Barend,在他下面的回答中提到 ExpandableListAdapter 作为一个可能的选项。我猜那是因为我的内部和外部列表都是动态的。如果你也能称重,我将不胜感激。

标签: android listview android-listview


【解决方案1】:

您不应该尝试嵌套两个列表视图 - 两者都是滚动视图,用户体验会变得很糟糕。你应该做的是使用ExpandableListAdapter,它可以让你创建一个父(组)和子视图的列表。每个组可能有多个孩子,因此在实践中,您有嵌套列表,但实际上,它是一个 ListView

【讨论】:

  • 嗨@Barend-非常感谢您的回答!碰巧的是,我的内部和外部列表在这里都是动态的。那么,您能否给我任何指示或传递他们可能处理过此类情况的任何链接?这对让我走上正轨真的很有帮助。
  • @Sandman:“碰巧,我的内部和外部列表都是动态的”——所以?
  • @CommonsWare - 我可能没有使用正确的词或搜索短语进行搜索,但是当我搜索类似的内容时,我只遇到过他们使用 ExpandableListAdapter 和静态数据的示例。我正在寻找一种使用可扩展列表来获取动态数据的实现。如果您能指出正确的方向,我将不胜感激。
  • 扩展BaseExpandableListAdapter,当数据发生变化时使用notifyDataSetChanged()方法;这将告诉列表视图重新计算/重新渲染。
  • 嗨@Barend - 感谢您的宝贵意见。我已接受您的答案作为答案,并且还编辑了我的帖子,说明我如何着手实施我需要的东西。非常感谢!
【解决方案2】:

最好不要嵌套 ListView。这种方式效率低。

您可以使用 ExpandableListView。或者您可以使用项目PreOrderTreeAdapter。它与您的情况相匹配,并且易于使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 2013-10-29
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2020-11-20
    相关资源
    最近更新 更多