2017-09-27 51 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

相關問題