Проблема регистрации кликов на кнопке на CustomCursorAdapter в ListView - PullRequest
2 голосов
/ 01 декабря 2010

То, что я пытаюсь сделать, это поймать нажатие кнопки внутри ListView, управляемого CustomCursorAdapter.при нажатии мне нужно сделать кнопку невидимой и обновить значение в базе данных.Вот код, который я использую для ListActivity и CursorAdapter.

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);
 }

Я уже установил кнопку для нажатия (true) и фокусировки(ложный).

с помощью этого кода я могу добиться того, чего хочу, но щелкнув строку listView (регистрирует только щелчки элементов на LinearLayout, который удерживает кнопку. Как сделать так, чтобы кнопка получала нажатие кнопки точно так же, как LinearLayout?

вот расположение строк:

 <?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 ]

2 голосов
/ 01 декабря 2010

вам нужен новый подход, как это описано в документации к кнопке .

Однако вместо применения OnClickListener к кнопке в вашей деятельности вы можете назначить метод для вашей кнопки в макете XML с помощью атрибута android: onClick. Например:

<Button
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
     android:text="@string/self_destruct"
     android:onClick="selfDestruct" />

Теперь, когда пользователь нажимает кнопку, система Android вызывает метод selfDestruct (View) действия. Чтобы это работало, метод должен быть общедоступным и принимать View как единственный параметр. Например:

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

Представление, переданное в метод, является ссылкой на виджет, по которому щелкнули. Вы можете setTag() в представлении в адаптере, чтобы узнать, какая кнопка была нажата.

0 голосов
/ 01 декабря 2010

Попробуйте добавить следующую строку в XML-файл макета элемента. Это должно быть добавлено в корневой макет.

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

Оттуда вы можете установить свой onClickListener кнопки в методе getView вашего адаптера.

...