Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

android ListView с кнопками. Как получить _id строки, на которой кликнута кнопка

#java #android


В общем есть список ListView, который я заполняю через SimpleCursorAdapter.
Инициализируется вот так:

String[] from = new String[] {"client_tel","timeToWashStart"};
int[] to = new int[] {R.id.client_tel,R.id.timeToWashStart};


scAdapter = new SimpleCursorAdapter(MainActivity.this, R.layout.item, null, from, to, 0);
lvData.setAdapter(scAdapter);

getSupportLoaderManager().initLoader(0, null, MainActivity.this);


Данные получаю через CursorLoader с MySQL, список формируется, все нормально.
Но в каждой строке списка есть кнопки, на которые нужно кликать.

Вот сам вопрос: как узнать _id или позицию строки, где была кликнута кнопка?

причем метод 

lvData.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "position = " + position + " id= " + id, Toast.LENGTH_SHORT).show();
}
});


почему-то не работает...
и я никак не пойму как прописать метод getView() для адаптера.

Скажите в какую сторону думать, я уже запарился на месте топтаться)
Заранее благодарен за советы

ПС: весь код у меня реализован в одном классе, может это важно

public class MainActivity extends FragmentActivity implements CompoundButton.OnCheckedChangeListener,LoaderManager.LoaderCallbacks {

    


Ответы

Ответ 1



То, что не работает setOnItemClickListener, можно только догадываться. Выгрузите код, тогда будет ответ. Узнать позицию и id при нажатии на кнопку (cursorloader), можно разными вариантами, самый очевидный и простой на мой взгляд: Делаем кастомный SimpleCursorAdapter, находим нашу кнопку, вешаем слушатель. Далее получаем его родителя (элемент в списке) у этого элемента получаем родителя это и есть наш список и относительно их находим позицию в списке. Зная позицию получаем id: MyAdapter.class public class MyAdapter extends SimpleCursorAdapter { public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { super(context, layout, c, from, to, flags); } @Override public void bindView(View view, Context context, final Cursor cursor) { Button btn = (Button) view.findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { View parent_row = (View) v.getParent(); ListView lv = (ListView) parent_row.getParent(); final int position = lv.getPositionForView(parent_row); Log.d("...", "position = " + position); Log.d("...", "id = " + getItemId(position)); } }); super.bindView(view, context, cursor); } }

Ответ 2



Если подытожить, рабочий кусок кода: public class MainActivity extends FragmentActivity { public String LOG_TAG = "LOG_TAG"; public ListView lvData; public MyAdapter scAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); lvData = (ListView) findViewById(R.id.lvData); ///попробую тут адаптер инициализировать String[] from = new String[] {"client_tel","timeToWashStart"}; int[] to = new int[] {R.id.client_tel,R.id.timeToWashStart}; Log.d(LOG_TAG,"формируем адаптер"); // создааем адаптер и настраиваем список /// scAdapter = new SimpleCursorAdapter(MainActivity.this, R.layout.item, null, from, to, 0); scAdapter = new MyAdapter(MainActivity.this, R.layout.item, null, from, to, 0); lvData.setAdapter(scAdapter); // создаем лоадер для чтения данных http://startandroid.ru/ru/uroki/vse-uroki-spiskom/278-urok-136-cursorloader.html // по этой ссылке описано что делает следующая строка, это получение данных getSupportLoaderManager().initLoader(0, null, MainActivity.this); } И, как рекомендовал shwarz-andrei, создаем отдельный класс для адаптера public class MyAdapter extends SimpleCursorAdapter { public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { super(context, layout, c, from, to, flags); } @Override public void bindView(View view, Context context, final Cursor cursor) { final ImageView img = (ImageView) view.findViewById(R.id.ivImg); img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { View parent_row = (View) v.getParent(); ListView lv = (ListView) parent_row.getParent(); final int position = lv.getPositionForView(parent_row); Log.d("...", "position = " + position); Log.d("...", "id = " + getItemId(position)); } }); super.bindView(view, context, cursor); } }

Комментариев нет:

Отправить комментарий