2010-12-01 10 views
2

私がしようとしているのは、CustomCursorAdapterによって管理されるListViewの中にあるボタンのクリックをキャッチすることです。クリックすると、ボタンを非表示にしてデータベースの値を更新する必要があります。ここでは、私はListActivityとCursorAdapterのために使用しているコードです。ListViewのCustomCursorAdapterのButtonのクリック登録に関する問題

public class MainTabView extends ListActivity{ 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    fillListData(); 
} 


private void fillListData(){ 
DataBaseNamesHelper myDbNamesHelper = new DataBaseNamesHelper(this); 
myDbNamesHelper.openDataBase(); 
Cursor cursor = myDbNamesHelper.getCursorQueryWithAllTheTaxiStations(); 
startManagingCursor(cursor); 
    // the desired columns to be bound 
    String[] columns = new String[] { DataBaseNamesHelper.COLUMN_NAME, DataBaseNamesHelper.COLUMN_PEOPLE}; 
    // the XML defined views which the data will be bound to 
    int[] to = new int[] { R.id.name_entry, R.id.number_entry }; 

    // create the adapter using the cursor pointing to the desired data as well as the layout information 
    CustomCursorAdapter mAdapter = new CustomCursorAdapter(this, R.layout.list_entry, cursor, columns, to); 
    // set this adapter as your ListActivity's adapter 
    this.setListAdapter(mAdapter); 
    this.getListView().setOnItemClickListener(mAdapter); 
    myDbNamesHelper.close(); 

} 

とアダプタ:

public class CustomCursorAdapter extends SimpleCursorAdapter implements SectionIndexer,Filterable, 
    android.widget.AdapterView.OnItemClickListener{ 

private Context context; 
private int layout; 
private AlphabetIndexer alphaIndexer; 

public CustomCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to) { 
    super(context, layout, c, from, to); 
    this.context = context; 
    this.layout = layout; 
    alphaIndexer=new AlphabetIndexer(c, c.getColumnIndex(DataBaseNamesHelper.COLUMN_NAME), " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 

    Cursor c = getCursor(); 

    final LayoutInflater inflater = LayoutInflater.from(context); 
    View v = inflater.inflate(layout, parent, false); 

    int nameCol = c.getColumnIndex(DataBaseNamesHelper.COLUMN_NAME); 

    String name = c.getString(nameCol); 

    /** 
    * Next set the name of the entry. 
    */ 
    TextView name_text = (TextView) v.findViewById(R.id.name_entry); 
    if (name_text != null) { 
     name_text.setText(name); 
    } 

    int favCol = c.getColumnIndex(DataBaseNamesHelper.COLUMN_FAVOURITED); 
    int fav = c.getInt(favCol); 

    Button button = (Button) v.findViewById(R.id.Button01); 
    if(fav==1){ 
    button.setVisibility(View.INVISIBLE); 
    } 

    return v; 
} 

@Override 
public void bindView(View v, Context context, Cursor c) { 

    int nameCol = c.getColumnIndex(DataBaseNamesHelper.COLUMN_NAME); 

    String name = c.getString(nameCol); 

    /** 
    * Next set the name of the entry. 
    */ 
    TextView name_text = (TextView) v.findViewById(R.id.name_entry); 
    if (name_text != null) { 
     name_text.setText(name); 
    } 
    int favCol = c.getColumnIndex(DataBaseNamesHelper.COLUMN_FAVOURITED); 
    int fav = c.getInt(favCol); 

    Button button = (Button) v.findViewById(R.id.Button01); 
    Log.e("fav",String.valueOf(fav)); 
    if(fav==1){ 
    button.setVisibility(View.INVISIBLE); 
    } 
} 

@Override 
public int getPositionForSection(int section) { 
    return alphaIndexer.getPositionForSection(section); 
} 

@Override 
public int getSectionForPosition(int position) { 
    return alphaIndexer.getSectionForPosition(position); 
} 

@Override 
public Object[] getSections() { 
    return alphaIndexer.getSections(); 
} 
@Override 
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
    Log.e("item Click", arg1.toString()+ " position> " +arg2); 
} 

私はすでに(偽)クリッカブル(真)とフォーカス可能であることを、ボタンを設定しています。このコードで

私は私が望むものを達成したが、リストビューの行をクリックしてすることができます(ログのみの項目がボタンを保持しているのLinearLayoutをクリックする。どのように私はボタンを受け取る作るかのLinearLayoutは?

をするとまったく同じをクリックします ここ

が行レイアウトです:。これはbutton documentationに記載されているように、あなたが新しいaproachが必要

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
     android:layout_height="wrap_content" android:orientation="horizontal" android:focusable="false"> 
<TextView 
    android:id="@+id/name_entry" 
    android:layout_height="wrap_content" 
    android:textSize="28dip" android:layout_width="wrap_content" android:layout_weight="1" android:layout_gravity="center_vertical"/> 
     <Button android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Fav" android:layout_gravity="center_vertical" android:layout_marginRight="10dp" android:focusable="false" android:clickable="true"></Button><TextView 
    android:id="@+id/number_entry" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textSize="28dip" /> 


</LinearLayout> 

答えて

2

しかし、代わりにあなたの活動のボタンにOnClickListenerを適用するには、アッシすることができますandroid:onClick属性を使用して、XMLレイアウトのボタンにメソッドを追加します。例:

ユーザーがボタンをクリックすると、AndroidシステムはアクティビティのselfDestruct(View)メソッドを呼び出します。これを機能させるには、メソッドをpublicにして、唯一のパラメータとしてViewを受け入れる必要があります。例:

public void selfDestruct(View view) { 
    // Kabloey 
} 

このメソッドに渡されるビューは、クリックされたウィジェットへの参照です。どのボタンがクリックされたかを認識するために、アダプタ内のビューでsetTag()を実行できます。

+0

はい、私は既にそれを試みましたが、その場合の問題は、私がリスト内のクリックされた項目の位置を知らないことでした。私はちょうど投稿http://stackoverflow.com/questions/1709166/android-listview-elements-with-multiple-clickable-buttonsを見つけました。今私はアダプタのボタンにonClickListenerを設定し、そのタグを列の行の_idに設定します。今私はそれを動作させることができます。基本的にあなたの答えは全く同じです。 Tnx。 – DArkO

0

アイテムレイアウトxmlファイルに次の行を追加してみてください。これは、ルートレイアウトに追加する必要があります。

<LinearLayout ..... 
       android:descendantFocusability="beforeDescendants" 
       ..... /> 

そこから、アダプタのgetViewメソッドのボタンのonClickListenerを設定できます。

関連する問題