2014-05-04 43 views
2

我是一個android新手..我正在使用遊標適配器和有一個切換按鈕和一個textview的列表視圖...當我點擊切換按鈕,我需要獲得click事件,並在列表中的項目的位置..使用cursorAdapter獲取列表視圖中的按鈕點擊項目位置

我看到很多線程,但我不覺得這對我的作品的完美解決方案...

最後我決定設置的位置bindview並嘗試檢索它點擊事件..但是當我在click事件中訪問holder.position時,我得到空指針異常。

請幫我這個傢伙。非常感謝

public class CalendarListAdapter extends CursorAdapter implements OnClickListener{ 


protected static class RowViewHolder { 
    public TextView mTitle; 
    public ToggleButton mButton; 
    public int position; 
} 

    protected ListView calListView; 


    @SuppressWarnings("deprecation") 
    public CalendarListAdapter(Context context, Cursor c) { 
     super(context, c); 
     // TODO Auto-generated constructor stub 

    } 


    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     // TODO Auto-generated method stub 
     TextView title = (TextView) view.findViewById(R.id.calendarName); 
     System.out.println("cursor details" 
       + cursor.getString(cursor.getColumnIndex(cursor 
         .getColumnName(1)))); 
     title.setText(cursor.getString(cursor.getColumnIndex(cursor 
       .getColumnName(1)))); 
     Log.d("click position " , "position is " +cursor.getPosition()); 
     ToggleButton button = (ToggleButton) view.findViewById(R.id.silentToggle); 
     button.setOnClickListener(this); 
     Log.d("click position " , "position is " +cursor.getPosition()); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(context.LAYOUT_INFLATER_SERVICE); 

     View calendarListView = inflater.inflate(R.layout.calendar_list_item, null); 

     RowViewHolder rowView = new RowViewHolder(); 
     rowView.mTitle = (TextView)calendarListView.findViewById(R.id.calendarName); 
     rowView.mButton = (ToggleButton) calendarListView.findViewById(R.id.silentToggle); 
     rowView.position = cursor.getPosition(); 

     rowView.mTitle.setOnClickListener(titleOnClickListener); 
     rowView.mButton.setOnClickListener(buttonOnClickListener); 

     return calendarListView; 
    } 

    @Override 
    public void onClick(View view) { 
     // TODO Auto-generated method stub 

     Log.d("item clicked", "clicked"); 
     RowViewHolder holder = (RowViewHolder)view.getTag(); 
     int position = holder.position; 
     Log.d("common clicked", "clicked -" +position); 


    } 

    private OnClickListener titleOnClickListener = new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      RowViewHolder holder = (RowViewHolder)v.getTag(); 
      int position = holder.position; 
      Log.d("title clicked", "clicked -" +position); 
     } 
    }; 

    private OnClickListener buttonOnClickListener = new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      RowViewHolder holder = (RowViewHolder)v.getTag(); 
      int position = holder.position; 
      Log.d("button clicked", "clicked -" +position); 

     } 
    }; 

} 

回答

9

爲了能夠使用v.getTag(),您需要兩件事情。在NewView的,你需要做的

calendarListView.setTag(rowView); 

和bindView你需要正確的數據插入座也:

rowView.position = cursor.getPosition(); // (same as in newView) 

對於所有的這一起工作,你還需要確保你正在做getTag()的視圖就是你做了setTag的視圖。

在你的情況,這將意味着在NewView的這樣做:

rowView.mTitle.setTag(rowView); 
rowView.mButton.setTag(rowView); 

它很可能是簡單的不使用RowViewHolder可言。相反,這樣做:

在bindView:

int pos = cursor.getPosition(); 
title.setTag(pos); 
button.setTag(pos); 

,然後在OnClickListeners做

Integer pos = (Integer) v.getTag(); 

祝你好運!

+0

謝謝@Erik Z ...實際上我做的事情,你說的使用持有人..你可以檢查我的代碼...如果你需要我會重新發布我在那裏做的評論......併爲解決方案,你建議我試圖做到..我面對的問題是..當我選擇行的位置越來越設置...但是當我選擇圖像按鈕或切換按鈕內的列表視圖的位置沒有得到設置.. 。 –

+0

@BalaSivagnanam你確定你正確地設置了標籤(必須在bindView中完成)以及正確的視圖。 –

0

上面的答案setTag和getTag對我來說效果很好, 但不知何故,我意識到標籤並不總是帶來正確的數字。 檢查後,我發現我的newView函數工作了太多次,這就是爲什麼我所有的標籤都是「0」。如果您遇到該問題,請檢查 here以獲取解決方案。

相關問題