gpt4 book ai didi

java - 在android ListView中找出被点击元素的父级

转载 作者:行者123 更新时间:2023-11-29 20:28:05 25 4
gpt4 key购买 nike

我正在根据 http://javatechig.com/video/json-feed-reader-in-android 中的 Material 构建我的第一个应用程序.到目前为止一切正常,但我发现了一个 ListView 元素的错误,我无法自己解决 :(我通过 2 个字段扩展了 list_row_layout.xml:

    <Button
android:layout_width="wrap_content"
android:layout_height="20dp"
android:text="komcie"
android:textSize="11sp"
android:id="@+id/loadComments"
android:layout_gravity="center|bottom"
android:background="#bbb"
android:layout_marginLeft="5dp"
android:enabled="true"
android:clickable="true"
android:onClick="clickedLoadComments"
android:elegantTextHeight="true"
android:layout_toRightOf="@id/thumbImage"
android:layout_below="@+id/content"
android:padding="1px" />

<ListView
android:id="@+id/comment_list"
android:layout_toRightOf="@id/thumbImage"
android:layout_below="@+id/content"
android:paddingTop="5dp"
android:layout_marginTop="0dp"
android:paddingLeft="5dp"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:cacheColorHint="#00000000"
android:dividerHeight="1dp"
android:focusable="false"
android:listSelector="@drawable/list_selector_flatcolor"
android:visibility="invisible" />

Button.android:onClick="clickedLoadComments"函数将带有元素的 Json 加载到 ListView/comment_list 中。它工作得很好。但是如果元素多于屏幕上可以显示的元素(~8 个元素),就会出现错误。 来自被点击元素的评论被加载到 ListView 中的每 8 个元素中。一些代码:

    public void clickedLoadComments(View v)
{
try {
View parent = (View)v.getParent();
ViewHolder t = (ViewHolder) parent.getTag();

if( parent != null ) {
this.loadCommentsForLeaf(parent);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}

protected void loadCommentsForLeaf( View view )
{
String tmpUrl = "http://some.url.com/Ajax/LoadComments?lid=" + this.currentLeafInUse;


JSONObject commentsJson = this.getJSONFromUrl(tmpUrl);
this.parseJsonComments(commentsJson);

if( commentsJson != null )
this.updateCommentList(view);
}

public void updateCommentList( View view) {
commentListView = (ListView) view.findViewById(R.id.comment_list);
commentListView.setVisibility(View.VISIBLE);

CommentListAdapter cla = new CommentListAdapter(this, this.commentList.get(this.currentLeafInUse));
commentListView.setAdapter(cla);



// Set list height.
ViewGroup.LayoutParams params = commentListView.getLayoutParams();
params.height = setListViewHeightBasedOnItems(commentListView) + 20;
commentListView.setLayoutParams(params);
commentListView.requestLayout();

}

CustomListAdapter.java 代码与教程中的大部分相同。

我真的很感激帮助,因为我花了很多时间来解决它但没有成功:(

最佳答案

这只是一个猜测。如果这不起作用,您也可以发布适配器代码和 parseJsonComments

原因:

您描述的问题可能是由于View的回收再利用引起的。看看这张来自 http://android.amberfog.com 的图片

enter image description here

如您所见,1. items 被重复使用并在滚动后成为 8. item。

让我们假设项目 1 有一个 OnClickListener 来更新项目的文本。例如,我们在触发 OnClickListener 后将文本设置为“clicked”。

因为项目 1 被重复用于创建项目 8,所以项目 8 也会显示文本“clicked”。

解决方案:

通常的方法是将所有状态/内容保存在列表(或其他)中,并在 getView 调用中更新所有内容。所以如果你想更新文本:

public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
...
holder.textView.setText(jsonTexts[position]);
...

return convertView;
}

如果您想更新一个项目,只需更新包含内容/JsonObjects(等)的适配器中的列表,然后调用 notifyDataSetChanged

public void updateCommentList(JSONObject commentsJson, int position) {
// does not exist you might create something
//like that in your Adapter class
commentListAdapter.updateItem(commentsJson,position);
commentListAdapter.notifyDataSetChanged();
}

关于java - 在android ListView中找出被点击元素的父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32308881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com