2017-09-27 32 views
0

我失去了整整一天试图找出如何使这项工作。 我成功地设置了一个自定义适配器和我的ListView。 问题是,我得到了我单击的项目的正确位置,但项目始终是列表中的最后一个。
更重要的是,我在另一个线程中调用所有这些来执行PostCall。setOnClickListener返回正确的位置,但错误的项目

我尝试了下面的其他例子,当然也有官方开发者资源,但我无法弄清楚我做错了什么。

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(),也使用视图,总是相同的结果。

EDIT 这是我的适配器 公共ListaMenuActivity(Activity上下文,字符串[] ITEMNAME){ 超级(上下文,R.layout.menu_custom,ITEMNAME)的代码;

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; 
} 
+0

秀你的完整代码。 –

+0

发布您的适配器。 – FWeigl

+0

添加了适配器的代码 – Andrea

回答

0

如果您的列表有完整和正确的数据,如果你得到正确的位置,那么你可以直接从与使用的位置,你得到的列表获取值。请尝试下面的代码片段

@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(); 
} 
+0

好的,这种方式它的工作原理,但..有任何reasong为什么我的代码不起作用? 因为这是一种避免这个问题的方法,但是我想让它按照它应该的方式工作...... 感谢您指出这种其他方式,我会使用它直到我能够正常工作。 – Andrea

+0

你的答案只是一个解决方法,以完成工作。它并没有回答它为什么不起作用。另外我相当确信,当有足够大的数据并快速滚动时,listview会崩溃。另外,OP将getView和getItem方法紧密耦合,这是一种不好的做法。 –

1

不好的想法,在getView中设置一些东西,然后在getItem()中获取它。

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

  1. 您在屏幕第4和列表
  2. 适配器的getView呼吁位置的第五项看到= 4
  3. 您设置适配器全球varibales desc_piatto, nome_foto,项目数量nomepiatto和数据4
  4. 立即getView呼吁项与第5位
  5. 您设置全局varibales项的数据5
  6. 您可以从onItemClick调用getItem,它将返回适配器全局变量的最后一个值。

这是Adapter的getItem的错误用法。阅读关于ListView充气视图和适配器生命周期的信息

P.S.使用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]); 
} 
+0

谢谢你的回答。我想我开始看到这个问题,但是..我仍然没有得到我如何解决这个问题,使它以这种方式工作。 我是否应该从菜单中拿取我的数据并直接使用它们而不必往返? – Andrea

+0

@Andrea添加一些代码 – Romadro

+0

感谢@Romadro,我想我设法解决了。由于我已经有了菜单,所以我会从那里得到我的字符串,尽管它不是最优雅的解决方案,是目前唯一的一个。 – Andrea

0

你应该重新写你的getItem为:

@Override 
public String getItem(int position) { 
    String [] elems = itemname[position].split(", "); 
    return elems[0] + "," +elems[5] + "," + elems[4]; 
} 
+0

我也试试这个,谢谢! – Andrea

相关问题