我正在尝试创建嵌套的评论系统,但我遇到了一个问题。我有一个主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();
} }
感谢您的帮助!
答案 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
解决了这个问题。