2013-08-25 51 views
1

好了,標題是propably不清楚,這裏是我想做的事: 我有ListView和每一行裏面有一些文字和一個按鈕。我設置監聽到每個按鈕(在我的自定義列表適配器)這樣的:獲取數據對象

public View getView(int position, View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     LayoutInflater li; 
     li = LayoutInflater.from(context); 
     convertView = li.inflate(R.layout.list_item, null); 
    } 

    Item elem = elems.get(position); 
    TextView mainText = (TextView) convertView.findViewById(R.id.main_text); 
    TextView sideText = (TextView) convertView.findViewById(R.id.side_text); 

    mainText.setText(elem.desc); 
    sideText.setText(timestampToString(elem.date)); 

    Button againButton = (Button) convertView 
      .findViewById(R.id.itemAgainButton); 

    againButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // onClick actions 
     } 
    }); 

現在的onClick方法內我需要存取權限從當前行創建項目對象。我不確定是否清楚我想要做什麼。這裏我設置上的ListView元素聽衆在我的活動類

lista.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

      Item item = (Item) parent.getItemAtPosition(position); 
      Intent i = new Intent(getApplicationContext(), 
        DidItItemActivity.class); 
      i.putExtra("id", item.id); 
      startActivity(i); 
     } 
    }); 

,我可以使用parent.getItemAtPosition(position)這給了我正是我需要的。我怎麼能在Adapter類中做同樣的事情?

回答

0

好吧,首先,你應該在getView方法來初始化LayoutInflater。更適合做這件事的地方是適配器的構造函數。因爲構造函數只被調用一次,getView方法將被調用很多次。

現在讓我們去你的主要問題。您不應該在適配器類中調用onClick方法,而是在活動中調用。爲此,您可以使用給定視圖的設置標籤。要實現這一點,你首先需要聲明的適配器類

public static class ViewHolder { 
    int mId; 
} 

內部類然後,你要適當的ID設置每個標籤,將與視圖進行綁定。 像這樣

public View getView(int position, View convertView, ViewGroup parent) { 

if (convertView == null) { 
    ... 
    ViewHolder tag = new ViewHolder(); 
    convertView.setTag(tag); 
} 

Item elem = elems.get(position); 
... 

ViewHolder tag = (ViewHolder) view.getTag(); 
tag.mId = elem.id; 
... 
} 

最後一部分是有關的onClick方法得到的值id。當onClick函數叫你只需要調用getTag方法上給出的觀點:

public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

       ViewHolder tag = (ViewHolder) view.getTag(); 
       int id = tag.mId; 
       } 

而最後一件事,設置onClickListener是更好地做NewView的方法。