在android ListView中找出clicked元素的父元素

时间:2015-08-31 10:12:28

标签: java android listview

我根据http://javatechig.com/video/json-feed-reader-in-android的资料构建了我的第一个应用。 到目前为止一切顺利,但我发现ListView元素有一个错误,我无法自己解决:( 我已将list_row_layout.xml扩展为2个字段:

    <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 =&#34; clickedLoadComments&#34;函数将带有元素的Json加载到ListView / comment_list中。它工作得很好。但是如果屏幕上显示的元素多于(8个元素),则会出现错误。 来自clicked元素的注释将加载到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代码与教程中的代码大致相同。

我真的很感激帮助,因为我花了很多时间搞清楚并没有成功:(

2 个答案:

答案 0 :(得分:2)

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

原因:

您所描述的问题可能是由于回收和视图的重用造成的。从http://android.amberfog.com

看一下这张图片

enter image description here

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

我们假设第1项有OnClickListener更新项目的文本。 例如,我们在触发OnClickListener后将文本设置为“点击”。

因为第1项被重复用于创建第8项,所以第8项也会显示“已点击”的文字。

解决方案:

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

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

    return convertView;
}

如果你想更新一个项目,只需更新你的适配器中的List,它包含内容/ 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();
}

答案 1 :(得分:0)

填充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

        }

    });
}