2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
1

Как найти id записи в SQlite таблице при клике на кнопку расположенную в Listview item?

09.12.2014, 12:40. Показов 1494. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
привет !

подскажите пожалуйста решение(((
Кейс: у меня есть листвью , который выводит записи из локальной БД.
На каждом айтеме так я вывожу две кнопки для кликанья (положительный/отрицательный рейтинг)

Проблема : хочу при клике на кнопку (например "отличный отзыв") система записывала этот клик как +1 в бд в значение "рейтинг" поля. Но не могу понять как определить при таком клике , какой ИД у записи , которая отображена в данном листвью айтеме(((
как это сделать?
Большое спасибо!!!

вот куски кода задействованные:


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    // Get User records from SQLite DB
    final ArrayList<HashMap<String, String>> recordList = controller.getAllRecords();
    // If users exists in SQLite DB
    //System.out.println("amount" + recordList.size());
    if (recordList.size() != 0) {
 
 
        // Set the User Array list in ListView
        ListAdapter adapter = new SimpleAdapter(MainActivity.this, recordList, R.layout.view_user_entry, new String[] {"mestext", "mesdate", "mesrating", "mestype" },
                new int[] {  R.id.mestext, R.id.mesdate, R.id.mesrating, R.id.imageView4 }){
 
            public View getView(int position, View convertView, ViewGroup parent){
                View row =super.getView(position, convertView, parent);
 
                View rateup=row.findViewById(R.id.thumb_up);
                rateup.setTag(position);
                rateup.setOnClickListener(MainActivity.this);
                View ratedown=row.findViewById(R.id.thumb_down);
                ratedown.setTag(position);
                ratedown.setOnClickListener(MainActivity.this);
                View favor=row.findViewById(R.id.favor);
                favor.setTag(position);
                favor.setOnClickListener(MainActivity.this);
 
                return row;
            }
        };
 
        ListView myList = (ListView) findViewById(android.R.id.list);
 
        myList.setAdapter(adapter);
 
 public void onClick(View v) {
switch (v.getId()){
    case R.id.thumb_up:
        Toast.makeText(getApplicationContext(),"Спасибо! Ваш голос учтен", Toast.LENGTH_LONG).show();
        System.out.println("Up" + v.getTag());
 
//Здесь , как я понимаю должен быть какая-то строка, которая должна вызывать значение Mesid для данной записи , //для которой кликнули thumb_up иконку.
 
 break;
    case R.id.thumb_down:
        Toast.makeText(getApplicationContext(),"Спасибо! Ваш голос учтен", Toast.LENGTH_LONG).show();
        System.out.println("down"+v.getTag());
        break;
    case R.id.favor:
 
        break;
 
}
}
Добавлено через 2 часа 5 минут
т.е. цель - записать значение (клик на "понравилось") клика в запись в базе данных для именно этой отображаемой записи.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2014, 12:40
Ответы с готовыми решениями:

ListView, ToggleButton, SQLite, CursorAdapter. Как найти idItem в ListView, где была нажата ToggleButton?
Добрый день. Затрудняюсь понять один момент: У меня есть ListView, который заполнен Items. ...

Цвет фокуса при клике на Item
Здравствуйте друзья!) Есть ListBox в который добавляются Items таким способом: ItemStyle item...

Как при двойном клике - удалить эту строку из ListView ?
Программно сформирован ListView. Как при двойном клике - удалить эту строку из ListView ?

При клике на Item в ListBox показать всплывающую подсказку
Здравствуйте! Подскажите пожалуйста, как реализовать всплывающую подсказку при клике на Item в...

11
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
09.12.2014, 12:44 2
У меня так реализовано:
Java
1
2
3
4
5
6
7
lv = (ListView) view.findViewById(R.id.listview1);
lv.setAdapter(scAdapter);
lv.setOnItemClickListener(new OnItemClickListener() {        
    public void onItemClick(AdapterView<?> parent, View itemClicked, int position, long id) {
        
    }
});
0
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
09.12.2014, 13:40  [ТС] 3
да, верно - у меня так же реализовано тоже (просто код не вставил ). Но это реализовано для реакции на нажатие на сам лист айтем.
Т.е. нажал на пункт списка - получил реакцию.

А я описываю кейс, когда юзер нажимает не на сам лист айтем, а на кнопку внутри этого лист айтема.

Добавлено через 29 минут
т.е. в случае использования :
Java
1
2
3
4
v.setOnItemClickListener(new OnItemClickListener() {        
    public void onItemClick(AdapterView<?> parent, View itemClicked, int position, long id) {
        
    }
тут я знаю как получить значение из массива : mesid = parent.getPosition("message id").toString;
а вот для кейса клика OnClick для кнопок внутри итема - там нет parent.getPostion (((
0
390 / 336 / 82
Регистрация: 17.10.2014
Сообщений: 1,005
09.12.2014, 13:47 4
bakhman, сталкивался с похожей проблемой, но не было времени сидеть над ней и отказался от данной реализации.
Но как вариант решения был в setOnItemClickListener вешать слушатели на эти button'ы. Результат был, но с одним "НО" - сначала необходимо было нажать на айтем, что бы слушатели повесить, а затем они уже как полагается отрабатывали.
Так же как вариант думал вешать слушатели в кастомном адаптере, но это есть не хорошо.
0
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
09.12.2014, 13:53  [ТС] 5
(((. проблема еще в том, что на стаковерфлоу не могу нормально сформулировать вопрос на инглише((( не понимает народ , что хочу получить...
0
390 / 336 / 82
Регистрация: 17.10.2014
Сообщений: 1,005
09.12.2014, 14:00 6
bakhman, посмотрите тут вроде как подходящая формулировка
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
09.12.2014, 14:04 7
bakhman, если сделать кастомный адаптер, то проблема отпадёт сама собой =)
0
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
09.12.2014, 14:27  [ТС] 8
YuraAAA, как же неохота теперь разбираться с кастомными адаптерами еще

вроде всё так просто должно быть: кликнул на кнопку "голосую за васю" -> получил значение позиции для айтема, кликнув на кнопку в этом айтеме->потом запросил из массива значение "message id" для этой позиции.-> потом на основании этого значения мессадж айди - обновил в SQL значение поля "кол-во голосов" для "Васи"
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
09.12.2014, 15:34 9
Цитата Сообщение от bakhman Посмотреть сообщение
HashMap<String, String
модельки нету user-а? Что контроллер возвращает? где id юзера?
0
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
09.12.2014, 20:36  [ТС] 10
YuraAAA,
Контроллер выдает в массив вот эти значения:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public ArrayList<HashMap<String, String>> getAllRecords() {
        ArrayList<HashMap<String, String>> recordList;
        recordList = new ArrayList<HashMap<String, String>>();
        String selectQuery = "SELECT  * FROM record";
        SQLiteDatabase database = this.getWritableDatabase();
        Cursor cursor = database.rawQuery(selectQuery, null);
        if (cursor.moveToFirst()) {
            do {
                HashMap<String, String> map = new HashMap<String, String>();
                map.put("mesid", cursor.getString(0));
                map.put("mestext", cursor.getString(1));
                map.put("mesdate", cursor.getString(2));
 
 
                if(cursor.getString(3).contains("Это было позитивненько")){
                    map.put("mestype", Integer.toString(R.drawable.smile_up));
                }
                else{
                    map.put("mestype", Integer.toString(R.drawable.smile_down));
                }
 
                map.put("messtime", cursor.getString(4));
                map.put("mesetime", cursor.getString(5));
                map.put("mestzone", cursor.getString(6));
                map.put("mesuser", cursor.getString(7));
                map.put("mesrating", cursor.getString(8));
                map.put("meslastname", cursor.getString(9));
                map.put("mesfirstname", cursor.getString(10));
                map.put("mesage", cursor.getString(11));
                map.put("mescity", cursor.getString(12));
                recordList.add(map);
            } while (cursor.moveToNext());
        }
        database.close();
        return recordList;
    }
я соответсвенно хочу получить "mesid", чтобы знать , в какой "mesrating" записать полученное при клике на кнопку значение.

Для Обычного onItemClick - я легко получаю это значение таким "макаром":

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
myList.setOnItemClickListener(new OnItemClickListener() {
 
 
                                              @Override
                                              public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 
                                              AlertDialog.Builder adb = new AlertDialog.Builder(MainActivity.this);
                                              // заголовок
                                              adb.setTitle("Подробная информация");
                                              // сообщение
 
 
                                                 HashMap idname = (HashMap) parent.getItemAtPosition(position);
                                                  String dtext = (String)idname.get("mestext");
                                                  String dsatime = (String)idname.get("messtime");
                                                  String dlname = (String)idname.get("meslastname");
                                                  String dfname = (String)idname.get("mesfirstname");
                                                  String dcity = (String)idname.get("mescity");
                                               //System.out.println(idname.get("mesid"));
 
 
                                                  adb.setMessage("Впечатление:" + "\n" +dtext + "\n" + "\n" + "Период времени: " +dsatime  + "\n" + "Город: " + dcity + "\n" + "Автор: " + dlname + " " + dfname );
                                              // кнопка положительного ответа
                                              adb.setPositiveButton("Назад", myClickListener);
                                              // создаем диалог
                                              adb.show();
                                          }
                OnClickListener myClickListener = new OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                            // положительная кнопка
                            case Dialog.BUTTON_NEUTRAL:
                                break;
                        }
                    }
                };
            });
Добавлено через 3 часа 28 минут
вопрос решен! всё гениальное просто как обычно ! - вынес переменную Адаптер. потом сделал при нажатии рейтинг кнопки adapter.getItem((integer)v.getTag());
по принтлн выдает как раз все значения выбранного айтема подгруженные из SQL базы!

Добавлено через 43 секунды
и никакие кастомные адаптеры не нужны)
всем спасибо за участие!
1
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
09.12.2014, 22:07 11
Вот и молодец, а если бы еще решение в коде оформил то вообще б
0
2 / 2 / 0
Регистрация: 03.11.2014
Сообщений: 21
10.12.2014, 09:08  [ТС] 12
Вот так выглядит решение кейса: "хочу ставить лайки по кнопке в листвью айтеме и допустим обновлять рейтинг этого сообщения на сервере"

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
  public void onClick(View v) {
    switch (v.getId()){
        case R.id.thumb_up:
            Toast.makeText(getApplicationContext(),"Спасибо! Ваш голос учтен", Toast.LENGTH_LONG).show();
            System.out.println("Up" + v.getTag());
            String m = String.valueOf(v.getTag());
            System.out.println(m);
            ArrayList<HashMap<String,String>> newrating;
            newrating = new ArrayList<HashMap<String,String>>();
 
 
            HashMap<String,String> record = (HashMap<String,String>)ad.getItem((Integer) v.getTag());
            System.out.println("mesid" + record.get("mesid") + "mestext" + record.get("mestext"));
            HashMap<String,String> mesrating;
            mesrating = new HashMap<String,String>();
            mesrating.put("mesid",record.get("mesid"));
            mesrating.put("mesuser",record.get("mesuser"));
            mesrating.put("mesrating","1");
            //controller.updaterating(mesrating);
            newrating.add(mesrating);
            Gson gson=new Gson();
            String sendrating=gson.toJson(newrating);
            AsyncHttpClient client=new AsyncHttpClient();
            RequestParams params=new RequestParams();
            params.put("updrating",sendrating);
            client.post("http://10.0.2.2/mysqlsqlitesync/updaterating.php", params, new AsyncHttpResponseHandler(){
 
            });
 
            break;
        case R.id.thumb_down:
            Toast.makeText(getApplicationContext(),"Спасибо! Ваш голос учтен", Toast.LENGTH_LONG).show();
            System.out.println("down"+v.getTag());
+учесть верхушка кода из начального сообщения в треде.

Добавлено через 9 часов 53 минуты
в строке

Java
1
ad.getItem
ad = adapter (из первого куска кода в начале)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2014, 09:08
Помогаю со студенческими работами здесь

При дабл-клике на Item в ListBox совершить действие
Ну, собственно, по сабжу...

Как убрать рамку при клике на кнопку?
ещё один глупый вопрос: как убрать рамку при клике на кнопку? Имеется такое решение, но появляется...

Как передать информацию при клике на кнопку?
Добрый вечер! Как в функцию &quot;cros&quot; передать Tag от groupBox_p? Получается что на форме много...

Проверка записи в таблице sqlite
У меня есть функция, которая делает проверка на наличие записи в таблице. Если записи нет, то...

Создание записи в таблице SQlite
Учусь использовать SQLite, но никак не выходит создать запись. SQLcommand.CommandText = &quot;CREATE...

Как в Delphi при клике на кнопку создать Edit
Как в Delphi при клике на кнопку создать Edit или еще что то? помогите очень надо) зараниэ спасибо)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru