Java setOnClickListener返回正确的位置,但返回错误的项
我花了整整一天的时间想弄明白怎么做才行。 我成功地设置了自定义适配器和我的Java setOnClickListener返回正确的位置,但返回错误的项,java,android,listview,Java,Android,Listview,我花了整整一天的时间想弄明白怎么做才行。 我成功地设置了自定义适配器和我的列表视图。 问题是我找到了我单击的项目的正确位置,但该项目始终是列表中的最后一个项目。 更重要的是,我在另一个线程中调用所有这些来执行PostCall 我试着遵循其他的例子,当然也遵循官方的开发者资源,但是我不知道我做错了什么 protected void onPostExecute(String result) { try { ListView serviceList = (Lis
列表视图
。
问题是我找到了我单击的项目的正确位置,但该项目始终是列表中的最后一个项目。更重要的是,我在另一个线程中调用所有这些来执行PostCall 我试着遵循其他的例子,当然也遵循官方的开发者资源,但是我不知道我做错了什么
protected void onPostExecute(String result) {
try {
ListView serviceList = (ListView)findViewById(android.R.id.list);
String[] menu = result.split("_");
ListaMenuActivity adapter = new ListaMenuActivity(ListaCibo.this, menu);
serviceList.setAdapter(adapter);
serviceList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id)
{
Toast.makeText(ListaCibo.this, String.valueOf(position) + parent.getAdapter().getItem(position), Toast.LENGTH_SHORT).show();
}
}catch (Exception e){
e.printStackTrace();
Toast.makeText(getApplicationContext(), R.string.error_string, Toast.LENGTH_LONG).show();
}
}
如果您的列表具有完整且正确的数据,并且您获得了正确的位置,那么您可以使用您获得的位置直接从列表中获取值。请尝试下面的代码片段
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String data = menu[position];
Toast.makeText(ListaCibo.this, String.valueOf(position) + data, Toast.LENGTH_SHORT).show();
}
@覆盖
public void onItemClick(AdapterView父对象、视图、int位置、长id){
字符串数据=菜单[位置];
Toast.makeText(ListaCibo.this,String.valueOf(position)+data,Toast.LENGTH_SHORT.show();
}
在getView中设置某些内容,然后在getItem()中设置
代码的工作方式(示例)
class YourAwesomeObject {
String[] elems = null;
public YourAwesomeObject(String inputString) {
elems = inputString.split(", ");
}
public String getTitle() {
return elems[0] + ", " + elems[2];
}
public String getExtraTxt() {
return elems[1].replace("-", ", ");
}
public boolean isShowImage() {
return !elems[3].equals("1");
}
public String getDescPiatto() {
return elems[4];
}
public String getNomeFoto() {
return elems[5];
}
public String getNomePiatto() {
return elems[0];
}
@Override
public String toString() {
return getNomePiatto() + "," +getNomeFoto() + "," + getDescPiatto();
}
}
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.menu_custom, null, true);
TextView txtTitle = (TextView) rowView.findViewById(R.id.item);
TextView extratxt = (TextView) rowView.findViewById(R.id.ingredienti);
ImageView image = (ImageView) rowView.findViewById(R.id.vegan);
try {
if (itemname[position] != "Medium Text") {
Log.e("basd", itemname[position]);
YourAwesomeObject item = getItem(itemname[position])
txtTitle.setText(item.getTitle());
extratxt.setText(item.getExtraTxt());
if (item.isShowImage()) {
Bitmap icon = BitmapFactory.decodeResource(context.getResources(),
R.drawable.leaf);
vegan.setImageBitmap(icon);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return rowView;
}
@Override
public YourAwesomeObject getItem(int position) {
return new YourAwesomeObject(itemname[position]);
}
您应该将
getItem
重新编写为:
@Override
public String getItem(int position) {
String [] elems = itemname[position].split(", ");
return elems[0] + "," +elems[5] + "," + elems[4];
}
显示完整的代码。发布适配器。添加适配器的代码检查我的答案OK,这样可以工作,但是..我的代码不工作有什么原因吗?因为这是一种避免问题的方法,但我希望它能以应有的方式工作。。。。谢谢你指出了另一种方式,无论如何,我会使用它,直到我能让它正常工作。你的回答只是一个解决办法,让工作完成。它没有回答为什么它一开始不起作用。另外,我很确定,当有足够大的数据并快速滚动时,listview将会崩溃。此外,OP是紧密耦合的
getView
和getItem
方法,这是一种糟糕的做法。谢谢您的回答。我想我开始意识到问题的存在,但我仍然不知道如何解决这个问题,让它以这种方式工作。我是否应该直接从菜单中获取数据并使用它们,而不必来回?谢谢@Romadro,我想我已经解决了这个问题。因为我已经在那里有了菜单,所以我将从那里获取字符串,即使它不是最优雅的解决方案,也是目前唯一有效的解决方案。@Andrea如果您不想使用包装器YourAwesomeObject,那么请使用最简单且100%正确的Sumit Jha解决方案
@Override
public String getItem(int position) {
String [] elems = itemname[position].split(", ");
return elems[0] + "," +elems[5] + "," + elems[4];
}