Java 在android ListView中查找已单击元素的父级

Java 在android ListView中查找已单击元素的父级,java,android,listview,Java,Android,Listview,我正在根据来自的材料构建我的第一个应用程序。 目前一切正常,但我发现ListView元素有一个bug,我自己无法解决:( 我将list_row_layout.xml扩展了两个字段: <Button android:layout_width="wrap_content" android:layout_height="20dp" android:text="komcie" android:textSize="11sp" android:id="@

我正在根据来自的材料构建我的第一个应用程序。 目前一切正常,但我发现ListView元素有一个bug,我自己无法解决:( 我将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" />
java代码与教程中的代码基本相同


我非常感谢您的帮助,因为我花了很多时间来解决这个问题,但没有成功:(

在填充listview后,我将此方法称为:

private void registerClickCallback() {
    ListView list = (ListView) findViewById(R.id.lv);
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View viewClicked,
                int position, long id) {
            String xx = position+ ":" + id;

            //then you can do what ever you want

        }

    });
}
private void registerClickCallback(){
ListView列表=(ListView)findViewById(R.id.lv);
list.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
公共视图单击(AdapterView父级,视图单击,
内部位置,长id){
字符串xx=位置+“:”+id;
//然后你想做什么就做什么
}
});
}

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

原因:

您正在描述的问题可能是由于视图的回收和重用造成的

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

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

由于项目1被重用以创建项目8,因此项目8也将显示文本“单击”

解决方案:

通常的方法是将所有状态/内容保存在一个列表(或其他)中,并更新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();
}

@AndreuRodrígueziDonaire:“来自单击元素的注释被加载到列表视图中的每8个元素中。”正如我所想。你必须再次渲染整个列表,不能只更改一个元素。非常感谢!也可以只更新一个视图。我提供的答案只是一个简单明了的解决方案。要只更新一个视图,你必须确保更新了正确的视图,并且必须确保在getView meth中正确地重新创建了视图在我的解决方案中,这可以通过删除commentListAdapter.notifyDataSetChanged()来实现;行并更新updateItem中的视图和内容列表。但是,当您像在另一个问题中一样更新async时,这可能有点棘手。因此有改进的余地。您还可以看看RecyclerView,它默认情况下可以更新一个项。
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();
}