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 函数,我们将搜索限制在这个被点击的视图中的子视图中。正因为如此,我们得到了正确的观点。
我有一个由 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 函数,我们将搜索限制在这个被点击的视图中的子视图中。正因为如此,我们得到了正确的观点。