2013-02-28 57 views
2

我有一個ListView,我用SimpleCursorAdapter填充。對於我列表中的每個項目,按照以下順序:TextView> RatingBar> TextView> ImageView。我想補充的ImageView的一個按鈕,但我不知道如何將這種...SimpleCursorAdapter中的按鈕

我在哪裏填充ListView:

adapter = new SimpleCursorAdapter(this, R.layout.beerdrunk, cursor, 
      new String[] { "beers", "notes", "numbers" }, new int[] { 
        R.id.champName, R.id.champNote, R.id.champDrunk }); 
    adapter.setViewBinder(binder); 
    list = (ListView) findViewById(R.id.listMyBeers); 
    list.setItemsCanFocus(true); 
    list.setOnItemClickListener(onClickBeer); 
    list.setAdapter(adapter); 

的OnItemClickListener:

private OnItemClickListener onClickBeer = new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
      long arg3) { 
     System.out.println(""+ arg0); 
     System.out.println(""+ arg1); 
     System.out.println(""+arg2); 
     Intent newActivity = new Intent(MyBeers.this, DetailsBeer.class); 
     newActivity.putExtra("com.example.checkmybeer.DetailsBeer", "" 
       + arg3); 
     startActivityForResult(newActivity, 0); 
    } 
}; 

和XML的beerdrunk:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"> 

<TextView 
    android:id="@+id/champName" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="130" 
    android:gravity="center_vertical" 
    android:layout_gravity="center_vertical" 
    android:maxLines="3" 
    android:padding="5dp" 
    android:paddingRight="20dp" 
    android:singleLine="false" 
    android:text="@string/beerBook" 
    android:textColor="@color/black1" 
    android:textSize="20sp" 
    android:textStyle="bold" > 
</TextView> 

<View 
    android:layout_width="1.5dip" 
    android:layout_height="fill_parent" /> 

<RatingBar 
    android:id="@+id/champNote" 
    style="@style/beerRatingSmall" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:isIndicator="true"   
    android:numStars="5" 
    android:layout_margin="1.5dp" 
    android:rating="5" 
    android:stepSize="0.10" > 
</RatingBar> 

<View 
    android:layout_width="1.5dip" 
    android:layout_height="fill_parent" /> 

<TextView 
    android:id="@+id/champDrunk" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:layout_weight="30" 
    android:gravity="right|center_vertical" 
    android:padding="5dp" 
    android:layout_marginLeft="5dp" 
    android:text="200" 
    android:textColor="@color/black1" 
    android:textSize="20sp" 
    android:textStyle="bold" /> 

<View 
    android:layout_width="1.5dip" 
    android:layout_height="fill_parent" /> 

<ImageView 
    android:id="@+id/champPlusone" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical|right" 
    android:layout_margin="5dp" 
    android:layout_weight="30" 
    android:gravity="right|center_vertical" 
    android:clickable="false" 
    android:src="@drawable/plus2" /> 
</LinearLayout> 

我已經試過類似:

if(arg2 instanceof ImageView){ 
    //do some stuff 
    } 

但它不工作...我怎麼能知道哪些視圖被點擊我的「行」裏面?

+0

「我怎麼知道我的」行「裏面點擊了哪個視圖?」您需要創建一個自定義適配器並在每個視圖中設置您想要執行特殊操作的OnClickListeners。 – Sam 2013-02-28 22:37:24

+0

快速問題,爲什麼你想添加一個按鈕到你的列表視圖?與只讓用戶點擊行本身相反? – 2013-02-28 22:38:56

+0

@BrentHronik我假設作者希望RatingsBar做一件事,按鈕做另一件事,可能是行本身做不同的事情。 – Sam 2013-02-28 22:41:34

回答

2

如果要單擊圖像,請使用ImageButton而不是ImageView。
然後,您可以在調用Activity中的方法的按鈕上設置onClick屬性。

擴展SimpleCursorAdapter並在bindView方法中爲每個按鈕添加onClick偵聽器。 (也許使它調用一個方法在您的活動...... public void buttonClicked(int position, View v)...所以你知道點擊了哪個行,這樣視圖

下面是一個例子實施CursorAdapter你可以使用

class CustomCursorAdapter extends CursorAdapter{ 
    LayoutInflater inflater; 

    public CustomCursorAdapter(Context context, Cursor c, int flags){ 
     super(context,c,flags); 
     inflater = LayoutInflater.from(context); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor){ 
     int row_id = cursor.get('_id'); //Your row id (might need to replace) 
     ImageButton button = (ImageButton) view.findViewById(R.id.champPlusone); 
     button.setOnClickListener(new OnClickListener(){ 
      @Override 
      public void onClick(View v){ 
       //ADD STUFF HERE you know which row is clicked. and which button 
      } 
     }); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent){ 
     LayoutInflater inflater = LayoutInflater.from(context); 
     View v = inflater.inflate(R.layout.beerdrunk, parent, false); 
     bindView(v,context,cursor); 
     return v; 
    } 

} 

;)

+1

這和Sam的評論幫了我很多! :) – user2121458 2013-02-28 22:51:14