gpt4 book ai didi

java - setOnClickListener 返回正确的位置但错误的项目

转载 作者:行者123 更新时间:2023-12-02 12:12:14 27 4
gpt4 key购买 nike

我花了一整天的时间试图弄清楚如何使这项工作成功。我成功设置了自定义适配器和我的 ListView。问题是我得到了单击的项目的正确位置,但该项目始终是列表中的最后一个。
更重要的是,我在另一个线程中调用所有这些来执行 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();

}

}

我还尝试使用parent.getItemAtPosition(),也使用 View ,总是相同的结果。

编辑这是我的适配器的代码 公共(public)ListaMenuActivity( Activity 上下文,String []项目名称){ super (上下文,R.layout.menu_custom,项目名称);

    this.context=context;
this.itemname=itemname;
}

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]);
String [] elems = itemname[position].split(", ");
txtTitle.setText(elems[0] + ", " + elems[2]);
extratxt.setText(elems[1].replace("-", ", "));

if(!elems[3].equals("1")) {
Bitmap icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.leaf);
vegan.setImageBitmap(icon);
}
desc_piatto = elems[4];
nome_foto = elems[5];
nomepiatto = elems[0];
}
} catch (Exception e){e.printStackTrace();}
return rowView;

}
@Override
public String getItem(int position) {
return nomepiatto + "," +nome_foto + "," + desc_piatto;
}

最佳答案

在 getView 中设置某些内容然后在 getItem() 中获取它是个坏主意。

你的代码是如何工作的(示例)

  1. 您在屏幕上看到列表的第 4 项和第 5 项
  2. 适配器的 getView 调用位置 = 4
  3. 您将适配器全局变量 desc_piatto、nome_foto、nomepiatto 设置为项目编号 4 的数据
  4. 立即调用 getView 来获取位置为 5 的项目
  5. 您将全局变量设置为第 5 项的数据
  6. 您从 onItemClick 调用 getItem,它返回 Adapter 全局变量的最后一个值。

这是对 Adapter 的 getItem 的错误使用。阅读有关 ListView 如何膨胀 View 以及适配器生命周期的内容

附注使用 lowerCamelCase 进行变量命名,使用 ViewHolder 进行适配器

编辑:好多了,但不是最好的解决方案

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]);
}

关于java - setOnClickListener 返回正确的位置但错误的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46451521/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com