嵌套ListView只运行第一个getView()

时间:2015-03-05 18:47:40

标签: android listview android-listview

我正在尝试创建嵌套的评论系统,但我遇到了一个问题。我有一个主ListView来显示所有顶级注释,每个注释XML包含一个带有调整填充的子ListView。嵌套注释会加载,但只会为每个父注释加载第一个返回的注释。我做了一些调试,好像所有数据都被发送到ListView ArrayAdapter,但getView()只是为第一个项目运行。是否可以强制重新加载ListView,还是有更好的方法来做我正在尝试的事情?

以下是我目前的代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="-20dp"
android:layout_marginRight="-20dp"

android:background="#ff2b2b2b"
android:orientation="vertical"
android:padding="20dp"
android:paddingBottom="0dp"
android:paddingEnd="0dp"
android:scrollbars="none">

<TextView
    android:id="@+id/author"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="ccrama"
    android:textSize="12dp" />

<TextView
    android:id="@+id/commentLine"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="COMMENT"
    android:textSize="14dp" />

<ListView 
    android:id="@+id/commentsListUnder"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="-20dp"
    android:layout_marginLeft="-5dp"
    android:layout_marginRight="-20dp"
    android:background="#ff2b2b2b"
    android:orientation="vertical"
    android:scrollbars="none" />

My ArrayAdapter看起来像这样

public class CommentAdapter extends ArrayAdapter<CommentNode> {
public CommentAdapter(Context context, ArrayList<CommentNode> users) {
    super(context, 0, users);
    main = context;
    this.users = users;

}
ArrayList<CommentNode> users;



Context main;

CommentNode user;

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    user = getItem(position);
    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.comment, parent, false);
    }
    TextView author = (TextView) convertView.findViewById(R.id.author);
    TextView comm = (TextView) convertView.findViewById(R.id.commentLine);
    TextView upvote = (TextView) convertView.findViewById(R.id.upvotePost);

    author.setText(user.getComment().getAuthor());
    comm.setText(user.getComment().getBody());
    upvote.setText(user.getComment().getScore() + "");

    ArrayList<CommentNode> comments = new ArrayList<CommentNode>();
    CommentNode comment = user;
    for (CommentNode node : comment.walkTree(TraversalMethod.BREADTH_FIRST)) {
        if (node.getParent().getComment().getId() == comment.getComment().getId()) {
            comments.add(node);
        }

    }

    //The above method IS returning all the correctly leveled comments

    CommentAdapter adapter = new CommentAdapter(main, comments);
    ListView listView = (ListView) convertView.findViewById(R.id.commentsListUnder);
    listView.setAdapter(adapter);

    return convertView;

}

@Override
public int getCount() {
    return users == null ? 0 : users.size();
} }

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

这可以在不使用ExpandableListView的情况下完成。 发生的事情就是你已经在另一个内部浏览了一个列表视图,它正在缩小,你需要做的是根据项目的数量动态调整内部列表视图的高度。在外部适配器中执行此操作:

OrderDetailAdapter adapter = new OrderDetailAdapter(context,0,orderDetails);
        int numberOfItems = orderDetails.size();
        ViewGroup.LayoutParams params = holder.listView.getLayoutParams();
        int pixels = (int) (80 * scale);
        int dpPixels = (int) (0.1 * scale);
        params.height =numberOfItems * pixels + (numberOfItems - 1) * dpPixels;
        holder.listView.setLayoutParams(params);
        holder.listView.setAdapter(adapter);

其中OrderDetailAdapter是内部列表的适配器。 比例是在内部获得的:

scale = context.getResources().getDisplayMetrics().density;

这是一个浮点变量;

答案 1 :(得分:0)

我使用ExpandableListView代替ListView解决了这个问题。