setOnItemClickListener returns 第一个元素

setOnItemClickListener returns the first element

我有一个由 ArrayList 填充的 ListView。当我在我的视图中单击 LV 的一个元素时,应用程序将启动一个新的 Activity。 但是如果我点击列表视图的第二个或第三个元素,就好像我按下了第一个。这是一些代码:

RipartitoriRepo repo = new RipartitoriRepo(this);
        my_list = repo.getRipartitoriByIdUnitàAbitativa(IdUnitàAbitativa);
        if(my_list.size()!=0){

            my_listview.setOnItemClickListener(new AdapterView.OnItemClickListener(){
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id){
                    Intent intent = new Intent(MainActivity.this, NextActivity.class);

                    TextView my_textview = (TextView)findViewById(R.id.IdElementCell);
                    String myId = my_textview.getText().toString();
                    intent.putExtra("IdElement", myId);

                    startActivity(intent);
                }
            });
            SimpleAdapter adapter;
            adapter = new SimpleAdapter(MainActivity.this, my_list, R.layout.ripartitori_row, new String[]{"idripartitore","posizione", "matricola", "altezza", "larghezza"},
                    new int[]{R.id.IdRipartitore_cell,R.id.ripart_posizione, R.id.ripart_matricola, R.id.rip_altezza, R.id.rip_larghezza});

            my_listview.setAdapter(adapter);
        }

这是单元格:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:id="@+id/IdElement_cell"/>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/rip_testo1"
            android:text="Posizione:"
            android:textStyle="bold"
            android:textSize="20dp"
            android:layout_marginLeft="5dp"

            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/rip_testo1"
            android:text="xxx"
            android:textSize="20dp"

            android:layout_marginLeft="3dp"
            android:id="@+id/ripart_posizione"/>

        </RelativeLayout>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:textSize="20dp"
            android:textStyle="bold"
            android:text="Matricola:"
            android:id="@+id/rip_testo4"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/ripart_matricola"
            android:layout_toRightOf="@id/rip_testo4"
            android:text="xxx"
            android:textSize="20dp"
            android:layout_marginLeft="3dp"
            />
        </RelativeLayout>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/rip_testo2"
            android:text="Altezza:"
            android:layout_marginLeft="8dp"
            android:textSize="17dp"
            android:textStyle="bold"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="3dp"
            android:text="xxx"
            android:layout_toRightOf="@+id/rip_testo2"
            android:textSize="17dp"
            android:id="@+id/rip_altezza"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/rip_altezza"
            android:text="Larghezza:"
            android:layout_marginLeft="10dp"
            android:textSize="17dp"
            android:textStyle="bold"
            android:id="@+id/rip_testo3"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/rip_larghezza"
            android:layout_toRightOf="@id/rip_testo3"
            android:text="xxx"
            android:textSize="17dp"
            android:layout_marginLeft="3dp"/>

        </RelativeLayout>

</LinearLayout>

例如:如果第一个元素有 Id = 00001,第二个元素有 Id = 0002,当我点击列表视图时,setOnItemClickListener 方法就像我总是点击第一个元素。所以 my_textview 将永远是 00001.

你可以做到

intent.putExtra("IdElement", position);

startActivity(intent);

更新

 TextView my_textview = (TextView)findViewById(R.id.IdElementCell);
 String myId = my_textview.getText().toString();
 my_textview.setTag("myId", myId);
 intent.putExtra("IdElement", my_textview.getTag("myId"));
 startActivity(intent);

你应该通过:

intent.putExtra("IdElement", id); // OR position, if you don't care about ID's

不是

intent.putExtra("IdElement", myId);

您正在通过以下代码在列表视图的 onclick 中声明一个文本视图

TextView my_textview = (TextView)findViewById(R.id.IdElementCell);
String myId = my_textview.getText().toString();
intent.putExtra("IdElement", myId); 

并将此 ID 发送到您的下一个 activity 无论您点击哪个位置,您总是传递带有 ID IdElementCell 的文本视图 ID,这就是您的原因始终检索相同的 ID,您永远不会发送不同的 ID 来获取发生点击事件的位置,您可以按位置检索它,或者 setOnItemClickListener() 中的参数 long id 将为您提供单击的项目的行 ID。

我在你的 xml 中找不到 R.id.IdElementCell

但我的猜测是,你必须这样做

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
    ...

    TextView my_textview = (TextView)view.findViewById(R.id.IdElementCell);
    String myId = my_textview.getText().toString();

    ...
}

编辑

您试图在 activity 上查找 ID 为 R.id.IdElementCell 的视图。 由于这是一个属于 listItem 的视图,因此它有多个实例,并且将 return 找到具有此 ID 的第一个视图。

通过在被点击的视图上调用 findViewById 函数,我们将搜索限制在这个被点击的视图中的子视图中。正因为如此,我们得到了正确的观点。