Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
#1

Получить id записи в бд при нажатии на пункт списка - Программирование Android

25.05.2013, 19:27. Просмотров 1144. Ответов 16
Метки нет (Все метки)

У меня такой вопрос:

Есть список ListView который заполняется данными из Базы (SQLite). Мне нужно при нажатии на пункт списка получить не просто id-item этой записи, а получить ещё и id этой записи в базе данных. После чего, чтобы я мог использовать полученный id. Подскажите, как поступить? на ум приходит только мысль сделать SetText на item, сделать её невидимой, а после уже получить данные как то так String selection = l.getItemAtPosition(position).toString(); Но уверен, что это неправильный способ и должен быть другой правильный вариант.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2013, 19:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получить id записи в бд при нажатии на пункт списка (Программирование Android):

При нажатии на пункт меню скрыть его, и показать другой пункт меню - Программирование Android
Прошу помощи, как можно допустим при нажатии на пункт меню, его скрыть, и показать другой пункт меню? я делаю так : public boolean...

Нажатием на пункт списка в ListView получить значение - Программирование Android
Как при нажатии на пункт списка в ListView получить то что там написано (написана одна строчка). Пробую так, но выводит адрес ссылки: ...

Ошибка при запуске AsyncTask при нажатии на пункт ActionBar - Программирование Android
Здравствуйте, почему при нажатии на пункт Action Bar'а вылетает ошибка? @Override public boolean onCreateOptionsMenu(Menu menu)...

При нажатии на пункт меню открыть новое активити - Программирование Android
Как сделать на андроид 4.0 чтобы при нажатии на пункт меню открывалось новое активити? Всплывающий Toast я смог сделать. но надо сделать...

Как при нажатии на пункт ListView перейти на другую форму - Программирование Android
Здравствуйте! У меня возникла проблема при работе с ListView. Суть проблему заключается в следующем при нажатии одного из пункта нужно...

ListView: сбивается содержимое ImageView элемента при скроллинге + как сделать выделение пункта списка при нажатии? - Программирование Android
1. Есть свой класс ContactsSimpleCursorAdapter, в методе public void bindView(View view, Context context, Cursor c) которого происходит...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 19:50 #2
покажите свой код, а мы уже подскажем что куда добавить.
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 20:15  [ТС] #3
Класс(Fragment) расширяющий ListFragment:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
public class Fragment2 extends ListFragment {
 
    private static final String TABLE_MY_DB_TOP = "myDBTop";
    private static final String KEY_ID = "id_top";
    private static final String KEY_CATEGORY = "category";
    private static final String KEY_TITLE = "title";
    private static final String CATEGORY_CINEMA = "Cinema";
    
    private SQLiteDatabase database;
    private ListView listView;
    private ArrayList<String> values = new ArrayList<String>();
    private ListView mListView;
        
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ListTopImageAdapter mAdapter = new ListTopImageAdapter(getActivity(), values);
        mListView.setAdapter(mAdapter);
        super.onActivityCreated(savedInstanceState);
}
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
 
        View myView = inflater.inflate(R.layout.fragment_screen2,
                container, false);
        mListView = (ListView) myView.findViewById(android.R.id.list);
        return myView;
    }
        
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
}
 
    private void fillCinema() {
            DBHelperSqLite dbOpenHelper = new DBHelperSqLite(getActivity());
            database = dbOpenHelper.getReadableDatabase();
            
            values = new ArrayList<String>();
            Cursor valuesCursor = database.query(TABLE_MY_DB_TOP,
                                                 new String[] 
                                                 {KEY_ID, KEY_CATEGORY, KEY_TITLE},
                                                 KEY_CATEGORY + "= ?", new String[] {CATEGORY_CINEMA}, null, null
                                                 , KEY_TITLE);
            
            
            valuesCursor.moveToFirst();
            if(!valuesCursor.isAfterLast()) {
                do {
                    String name = valuesCursor.getString(2);
                    values.add(name);
                } while (valuesCursor.moveToNext());
            }
            valuesCursor.close();
            dbOpenHelper.close();
            database.close();
            
            ListTopImageAdapter mAdapter = new ListTopImageAdapter(getActivity(),
                    values);
            mListView.setAdapter(mAdapter);
            
        }
 
@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        
        String selection = l.getItemAtPosition(position).toString();
        Toast.makeText(getActivity(), selection, Toast.LENGTH_LONG).show();
        }
код adaptera:
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
public class ListTopImageAdapter extends ArrayAdapter<String> {
    private final Context context;
     
    private final ArrayList<String> friends;
    
    public ListTopImageAdapter(Context context, ArrayList<String> friends) {super(context, R.layout.item_fragment2, friends);
    this.context = context;
    this.friends = friends;
}
 
 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
        View rowView = inflater.inflate(R.layout.item_fragment2, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.label);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
 
        textView.setText(friends.get(position) );
 
        String s = friends.get(position);
 
        System.out.println(s);
        
        if (s.equals("About App")) {
            imageView.setImageResource(R.drawable.button_in);
        } else if (s.equals("Tools Tutorial")) {
            imageView.setImageResource(R.drawable.button_on);
        } else if (s.equals("About App Seen")) {
            imageView.setImageResource(android.R.drawable.btn_minus);
        } else if (s.equals("App Technical Contact")) {
            imageView.setImageResource(R.drawable.button_in_on);
         }
 
        return rowView;
    }
}
0
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 20:45 #4
создайте класс с полями которые вам нужны и используйте его вместо String.
вместо ArrayList<String> friends используйте ArrayList<MyClass> friends
в getView
Java
1
2
3
String s = friends.get(position).getS();
int id = friends.get(position).getId();
rowView.setTag(id);
в onListItemClick
Java
1
int id = (Integer)v.getTag();
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 20:51  [ТС] #5
ооо, спасибо за ответ. А не могли бы привести подробней пример. Просто мне кажется, что я не понимаю, что нужно сделать, хотя вроде необходимо мало что написать.
0
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 20:53 #6
все что нужно я уже написал, а с созданием дополнительного класса для передачи данных думаю вы справитесь.
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 21:23  [ТС] #7
создал класс модель с полями:

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 class ModelDBFrag2 {
 
    // private variables
    String id_top;
    String name_category;
 
    // Empty constructor
    public ModelDBFrag2() {
 
    }
 
    // constructor
    public ModelDBFrag2(String id_top, String name_category) {
        this.id_top = id_top;
        this.name_category = name_category;
    }
 
    public String getId_top() {
        return id_top;
    }
 
    public void setId_top(String id_top) {
        this.id_top = id_top;
    }
 
    public String getName_category() {
        return name_category;
    }
 
    public void setName_category(String name_category) {
        this.name_category = name_category;
    }
}
а дальше что делать?

получать данные из таблицы так же нужно?:
Java
1
2
                                        String id = valuesCursor.getString(1);
                    String name = valuesCursor.getString(2);
и добавлять по прежнему так?:
Java
1
2
                    values.add(id);
                    values.add(name);
Меняю ArrayList<String> friends на ArrayList<ModelDBFrag2 > friends , но куче ошибок. Не пойму что в классе адаптере менять нужно, везде ArrayList<String> friends на ArrayList<ModelDBFrag2 > friends ?? если да, то не получается, как надо?
0
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 21:28 #8
да, вы все правильно поняли. что именно не получается?
кстати нумерация начинается с 0, судя по коду который вы выложили нужно писать
Java
1
 String id = valuesCursor.getString(0);
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 21:47  [ТС] #9
Цитата Сообщение от V0v1k Посмотреть сообщение
кстати нумерация начинается с 0, судя по коду который вы выложили нужно писать
да. я знаю, что с нуля. Мне просто нужно получить не Id записи, а ID записи который я ей сам присвоил. и это как раз вторая колонка.

изменил код адаптера так:
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
public class ListTopImageAdapter extends ArrayAdapter<ModelDBFrag2> {
    private final Context context;
   // private final String[] values;
    
    private final ArrayList<ModelDBFrag2> friends;
    
    public ListTopImageAdapter(Context context, ArrayList<ModelDBFrag2> friends) {super(context, R.layout.item_fragment2, friends);
    this.context = context;
    this.friends = friends;
}
    
    
//    public ListTopImageAdapter(Context context, String[] values) {super(context, R.layout.item_fragment2, values);
//        this.context = context;
//        this.values = values;
//    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
        View rowView = inflater.inflate(R.layout.item_fragment2, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.label);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
  
        
       textView.setText((CharSequence) friends.get(position) ); // было так textView.setText(friends.get(position) );, а стало так
 
        
       String s = friends.get(position).getName_category();
       String id = friends.get(position).getId_top();
       rowView.setTag(id);
               
        System.out.println(s);
        
        if (s.equals("About App")) {
            imageView.setImageResource(R.drawable.button_in);
        } else if (s.equals("Tools Tutorial")) {
            imageView.setImageResource(R.drawable.button_on);
        } else if (s.equals("App Technical Contact")) {
            imageView.setImageResource(android.R.drawable.btn_minus);
        } else if (s.equals("App Technical Contact")) {
            imageView.setImageResource(R.drawable.button_on);
         }
 
        return rowView;
    }
}
но подчёркивает в методе извлечения элементов из базы данных fillCinema() :

values.add(id);
values.add(name);

и пишет The method add(ModelDBFrag2) in the type ArrayList<ModelDBFrag2> is not applicable for the arguments (String)
0
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 21:56 #10
примерно так
Java
1
2
ModelDBFrag2 value = new ModelDBFrag2(id, name);
values.add(value);
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 22:02  [ТС] #11
а так можно?:
Java
1
2
3
String id = valuesCursor.getString(1);
String name = valuesCursor.getString(2);
ModelDBFrag2 model = new ModelDBFrag2(id, name);
или нужно так:

Java
1
2
3
4
5
String id = valuesCursor.getString(1);
String name = valuesCursor.getString(2);
ModelDBFrag2 model = new ModelDBFrag2();
model.setId_top(id);
model.setName_category(name);
или нужно как вы написали?
0
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 22:06 #12
здесь без разницы.
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 22:31  [ТС] #13
почему то сыпятся ошибки:

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
05-25 18:27:47.891: E/AndroidRuntime(23232): FATAL EXCEPTION: main
05-25 18:27:47.891: E/AndroidRuntime(23232): java.lang.ClassCastException: by.my.project.ModelDBFrag2
05-25 18:27:47.891: E/AndroidRuntime(23232):    at by.appetitsoft.mevolution.ListTopImageAdapter.getView(ListTopImageAdapter.java:39)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.AbsListView.obtainView(AbsListView.java:1315)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.ListView.measureHeightOfChildren(ListView.java:1198)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.ListView.onMeasure(ListView.java:1109)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.RelativeLayout.measureChild(RelativeLayout.java:563)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:378)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1249)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:578)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:362)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:381)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:578)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:362)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.View.measure(View.java:8171)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewRoot.performTraversals(ViewRoot.java:801)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.os.Looper.loop(Looper.java:123)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at android.app.ActivityThread.main(ActivityThread.java:4627)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at java.lang.reflect.Method.invokeNative(Native Method)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at java.lang.reflect.Method.invoke(Method.java:521)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-25 18:27:47.891: E/AndroidRuntime(23232):    at dalvik.system.NativeStart.main(Native Method)
0
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 22:33 #14
Цитата Сообщение от Stylish2013 Посмотреть сообщение
ListTopImageAdapter.java:39
что в этой строчке?
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
25.05.2013, 22:39  [ТС] #15
в этой строчке
Java
1
textView.setText((CharSequence) friends.get(position));
а до того как внедрили класс Model, было так
Java
1
textView.setText(friends.get(position));
оно высветило ошибку и я нажал исправить и оно исправило на то как есть сейчас.

к тому же я подебажил и да, на этом месте вываливается.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2013, 22:39
Привет! Вот еще темы с ответами:

Выделить строку кастомного списка при нажатии на нее - Программирование Android
Имеется кастомный ListView, строки у которого выводятся через TextView. Требуется при нажатии на строку списка выделять ее жирным. ...

Как изменить цвет пункта ListView при нажатии на него и сохранять его цвет при проматывании списка? - Программирование Android
Здравствуйте, подскажите, пожалуйста, как изменить цвет пункта ListView при нажатии на него и сохранять его цвет при проматывании списка? ...

получить data из Списка при нажатии - jQuery
список из ссылок &lt;a class=&quot;selector&quot; data-item=&quot;1&quot;&gt;1&lt;/a&gt; &lt;a class=&quot;selector&quot; data-item=&quot;2&quot;&gt;2&lt;/a&gt; &lt;a class=&quot;selector&quot;...

Действие при нажатии на пункт TTreeView - C++ Builder
Здравствуйте, на форме есть компонент TreeView и как пример записанные разделы: Десерт первый второй третий Напитки


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.05.2013, 22:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru