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

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

25.05.2013, 19:27. Просмотров 1284. Ответов 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):

При нажатии на пункт меню скрыть его, и показать другой пункт меню
Прошу помощи, как можно допустим при нажатии на пункт меню, его скрыть, и...

Нажатием на пункт списка в ListView получить значение
Как при нажатии на пункт списка в ListView получить то что там написано...

Ошибка при запуске AsyncTask при нажатии на пункт ActionBar
Здравствуйте, почему при нажатии на пункт Action Bar'а вылетает ошибка? ...

При нажатии на пункт меню открыть новое активити
Как сделать на андроид 4.0 чтобы при нажатии на пункт меню открывалось новое...

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

ListView: сбивается содержимое ImageView элемента при скроллинге + как сделать выделение пункта списка при нажатии?
1. Есть свой класс ContactsSimpleCursorAdapter, в методе public void...

16
V0v1k
1160 / 984 / 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
1160 / 984 / 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
1160 / 984 / 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
1160 / 984 / 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
1160 / 984 / 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
1160 / 984 / 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
1160 / 984 / 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
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.05.2013, 22:41 #16
Java
1
textView.setText(friends.get(position).getNameCategory());
советую вам почитать книгу по основам Java.
1
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
26.05.2013, 03:43  [ТС] #17
Надо сделать так?
Java
1
 textView.setText(friends.get(position).getName_category());
только так сделал и вы написали.

Цитата Сообщение от V0v1k Посмотреть сообщение
советую вам почитать книгу по основам Java.
это не помешает, но не углядел этот момент.

Добавлено через 5 часов 0 минут
V0v1k, Спасибо Вам, всё получилось, помогли решить данную задачу!
0
26.05.2013, 03:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2013, 03:43
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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