2013-07-15 50 views
1

我使用Cursoradapter自定義Listview。這是我的列表如何: my list http://kepfeltoltes.hu/130715/device-2013-07-15-152336_www.kepfeltoltes.hu_.pngAndroid:自定義Listadapter中列表項目中ImageView上的OnClickListener

當我點擊一個列表項目,我想播放錄音,當我點擊信息按鈕,我想開始一個新的活動。 我在ImageView上設置了一個onClickListener(名爲detailsIcon),並在其上用記錄的ID設置一個標籤。問題是我以後無法檢測標籤,其他奇怪的是所有的ImageView都具有相同的ID。

這是日誌文件,當系統填充列表:

07-15 14:33:28.238: I/System.out(27753): Setting icon (ID: 2131296298) on view (ID: -1) tag to:8 
07-15 14:33:28.328: I/System.out(27753): Setting icon (ID: 2131296298) on view (ID: -1) tag to:7 
07-15 14:33:28.368: I/System.out(27753): Setting icon (ID: 2131296298) on view (ID: -1) tag to:6 
07-15 14:33:28.403: I/System.out(27753): Setting icon (ID: 2131296298) on view (ID: -1) tag to:5 
07-15 14:33:28.418: I/System.out(27753): Setting icon (ID: 2131296298) on view (ID: -1) tag to:4 
07-15 14:33:28.433: I/System.out(27753): Setting icon (ID: 2131296298) on view (ID: -1) tag to:3 
07-15 14:33:28.453: I/System.out(27753): Setting icon (ID: 2131296298) on view (ID: -1) tag to:2 
07-15 14:33:40.878: I/System.out(27753): Setting icon (ID: 2131296298) on view (ID: -1) tag to:1 
07-15 14:33:41.238: I/System.out(27753): Setting icon (ID: 2131296298) on view (ID: -1) tag to:8 

當我clcik在ImageView的,它與一個空指針異常崩潰。 id =(Integer)v.getTag()返回null。我怎麼解決這個問題?

這是我的CursorAdapter的有趣的部分:

@Override 
    public void bindView(View view, Context context, Cursor cursor) { 

     TextView title = (TextView) view.findViewById(R.id.title); 
     TextView date = (TextView) view.findViewById(R.id.date); 
     ImageView btn_play_pause = (ImageView) view 
       .findViewById(R.id.btn_play_pause); 
     TextView duration = (TextView) view.findViewById(R.id.length); 
     ImageView detailsIcon = (ImageView) view 
       .findViewById(R.id.icon_details); 

     rec = new RecordedObject(cursor); 

     view.setTag(R.id.recording_id, rec.getId()); 

     //////////////////////////////////////////////////////// 
     //here is the part, that is not working properly 
     detailsIcon.setTag(R.id.recording_id, rec.getId()); 
     System.out.println("Setting icon (ID: " + detailsIcon.getId() 
       + ") on view (ID: " + view.getId() + ") tag to:" + rec.getId()); 
     //////////////////////////////////////////////////////// 

     title.setText(rec.getTitle()); 
     date.setText(rec.getDateReadable()); 

     duration.setText(MyDateFormatter.formatDuration(rec.getLength())); 

     if (cursor.getPosition() == selectedRecording) { 
      view.setBackgroundDrawable(context.getResources().getDrawable(
        R.drawable.list_item_selected)); 
      title.setTextColor(0xFFFFFFFF); 
      date.setTextColor(0xFFFFFFFF); 
      duration.setTextColor(0xFFFFFFFF); 
      btn_play_pause.setVisibility(View.VISIBLE); 

     } else { 
      view.setBackgroundDrawable(context.getResources().getDrawable(
        R.drawable.list_item_normal)); 
      title.setTextColor(0xFF000000); 
      date.setTextColor(0xFF000000); 
      duration.setTextColor(0xFF000000); 
      btn_play_pause.setVisibility(View.GONE); 

     } 

     detailsIcon.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       int id; 
       id = (Integer) v.getTag(); 
       System.out.println("View (ID: " + v.getId() + ") "); 
      } 
     }); 
    } 

這是我的列表項的xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:padding="5dip" 
    android:descendantFocusability="blocksDescendants" > 

    <!-- ListRow Left side: play button --> 

    <LinearLayout 
     android:id="@+id/thumbnail" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_centerVertical="true" 
     android:layout_marginRight="5dip" 
     android:padding="3dip" > 

     <ImageView 
      android:id="@+id/icon_details" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@android:drawable/ic_menu_info_details" /> 

     <ImageView 
      android:id="@+id/btn_play_pause" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:contentDescription="@string/play" 
      android:src="@android:drawable/ic_media_play" 
      android:visibility="gone" /> 
    </LinearLayout> 

    <!-- File name --> 

    <LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@id/thumbnail" 
     android:layout_centerVertical="true" 
     android:layout_toRightOf="@id/thumbnail" 
     android:orientation="vertical" > 

     <TextView 
      android:id="@+id/title" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/title_of_recording" 
      android:textSize="17dip" 
      android:textStyle="bold" 
      android:typeface="sans" /> 

     <TextView 
      android:id="@+id/length" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="length of recording" /> 

    </LinearLayout> 

    <!-- Date --> 


    <!-- Rightend Duration --> 

    <TextView 
     android:id="@+id/length_old" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="5dip" 
     android:gravity="right" 
     android:textSize="9dip" 
     android:textStyle="normal" 
     android:visibility="gone" /> 

    <!-- Rightend Arrow --> 

    <TextView 
     android:id="@+id/date" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentBottom="true" 

     android:text="@string/date_of_recording" 
     android:textSize="12dip" /> 

</RelativeLayout> 

回答

1

更改OnClickListener以下幾點:

detailsIcon.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      int id; 
      id = (Integer) v.getTag(R.id.recording_id); 
      System.out.println("View (ID: " + id + ") "); 
     } 
    }); 

當您調用detailsIcon.setTag(R.id.recording_id, rec.getId());您將標籤的關鍵字設置爲R.id.recording_id。您必須使用此鍵從視圖中檢索標籤。如果您試圖設置視圖的ID,您可以調用detailsIcon.setId();.

+0

感謝人,這樣一個愚蠢的錯誤。 – czadam

相關問題