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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Lers
12 / 12 / 3
Регистрация: 27.05.2012
Сообщений: 202
#1

Чтение данных из бд в listview - Android

13.08.2014, 23:23. Просмотров 1425. Ответов 7
Метки нет (Все метки)

Здесь listview с контекстным меню. В меню 2 пункта. По клику на пункт, запись из listview'a должна добавляться в определенную таблицу.
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package info.androidhive.tabsswipe;
 
import java.util.ArrayList;
 
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
 
public class MoviesFragment extends Fragment {
    
ListView lw1;
ArrayAdapter <String> adapter;
ArrayList <String> label = new ArrayList <String>();
DataBase sqh;
SQLiteDatabase sqdb;
Cursor cursor;
ContentValues cv;
public static String s1 = new String();
public static final int IDM_A = 101;
public static final int IDM_B = 102;
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        
        View rootView = inflater.inflate(R.layout.fragment_movies, container, false);
        lw1 = (ListView) rootView.findViewById(R.id.listrdy);
                
        sqh = new DataBase(getActivity().getApplicationContext());
        sqdb = sqh.getWritableDatabase();
        
            
            
            
            
        registerForContextMenu(lw1);
        
        return rootView;
    }
    
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(Menu.NONE, IDM_A, Menu.NONE, "WIN");
        menu.add(Menu.NONE, IDM_B, Menu.NONE, "LOSE");
    }
    
 
    public boolean onContextItemSelected(MenuItem item) {
        lw1.setOnItemClickListener(new OnItemClickListener() {
              public void onItemClick(AdapterView<?> parent, View view,
                  int position, long id) {
                  
                   s1 = lw1.getItemAtPosition(position).toString();    
        
              }
            });
        switch (item.getItemId()) {
        case IDM_A:
            Toast.makeText(getActivity(), "Добавлено в раздел Выполнено", Toast.LENGTH_LONG)
                    .show();
            cv = new ContentValues();
            cv.put(DataBase.WIN, s1);
              sqdb.insert(DataBase.TABLE_NAME3, DataBase.WIN, cv);
            
            return true;
            
        case IDM_B:
            Toast.makeText(getActivity(), "Добавлено в раздел провалено:(", Toast.LENGTH_LONG)
                    .show();
            ContentValues cv1 = new ContentValues();
            cv1.put(DataBase.LOSE, s1);
              sqdb.insert(DataBase.TABLE_NAME2, DataBase.LOSE, cv1);
            return true;
        }
        return super.onContextItemSelected(item);
    }

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
package info.androidhive.tabsswipe;
 
import java.util.ArrayList;
 
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
 
public class TopRatedFragment extends Fragment {
    
    DataBase sqh;
    SQLiteDatabase sqdb;
    ListView lw2;
    ArrayAdapter <String> adapter;
    ArrayList <String> label = new ArrayList <String>();
    Cursor cursor;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
 
        View rootView = inflater.inflate(R.layout.fragment_top_rated, container, false);
    
        lw2 = (ListView) rootView.findViewById(R.id.lw2);
        sqh = new DataBase(getActivity().getApplicationContext());
          sqdb = sqh.getWritableDatabase();
         
            
        return rootView;
    }
    
 
    @Override
    public void onResume(){
        super.onResume();
        sqh = new DataBase(getActivity().getApplicationContext());
        sqdb = sqh.getWritableDatabase();
         cursor = sqdb.query(DataBase.TABLE_NAME3, new String[] {
                DataBase._ID, DataBase.WIN }, null,null,null,null,null);
     
        while (cursor.moveToNext()) {
            int id = cursor.getInt(cursor.getColumnIndex(DataBase._ID));
            String name = cursor.getString(cursor.getColumnIndexOrThrow(DataBase.WIN));
            label.add(name);
        
        } 
        
        if (label != null) {adapter = new ArrayAdapter <String> (getActivity(),android.R.layout.simple_list_item_1,label);
        lw2.setAdapter(adapter);  } 
        //cursor.close();
    }
    @Override
    public void onStop() {
        super.onStop();
 
        sqdb.close();
        sqh.close();
    }
Соответственно, в этом фрагменте я считываю данных из таблицы и вывожу в listview. Проблема в том, что появляются пустые поля.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
14.08.2014, 08:28     Чтение данных из бд в listview #2
А s1 точно не пустая? Вот пример получения нажатого элемента ListView
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        AdapterContextMenuInfo aMenuInfo = (AdapterContextMenuInfo) menuInfo;
 
        // Получаем позицию элемента в списке
        int position = aMenuInfo.position;
 
        // Получаем данные элемента списка, тип данных здесь вы должны указать свой!
        final AdapterData data = adapter.getItem(aMenuInfo.position);
 
        menu.setHeaderTitle("Заголовок");
        menu.add("Первый элемент").setOnMenuItemClickListener(new OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                // дествия по клику меню
                return true;
            }
        });
    }
Lers
12 / 12 / 3
Регистрация: 27.05.2012
Сообщений: 202
14.08.2014, 13:10  [ТС]     Чтение данных из бд в listview #3
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
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    AdapterContextMenuInfo aMenuInfo = (AdapterContextMenuInfo) menuInfo;
 
    // Получаем позицию элемента в списке
    int position = aMenuInfo.position;
 
    // Получаем данные элемента списка, тип данных здесь вы должны указать свой!
    final String data = adapter.getItem(aMenuInfo.position);
    
    menu.add("Win").setOnMenuItemClickListener(new OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            // дествия по клику меню
            
            cv = new ContentValues();
            cv.put(DataBase.LOSE,data);
              sqdb.insert(DataBase.TABLE_NAME3, DataBase.WIN, cv);
             
            
            return true;
        }
    });
    
    final String data1  = adapter.getItem(aMenuInfo.position);
    menu.add("Lose").setOnMenuItemClickListener(new OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            // дествия по клику меню
            
            ContentValues cv1 = new ContentValues();
            cv1.put(DataBase.WIN,data1);
              sqdb.insert(DataBase.TABLE_NAME2, DataBase.LOSE, cv1);
            return true;
        }
    });
Написал так, не работает. Хелп

Добавлено через 21 минуту
cv.put(DataBase.LOSE,data); не заметил что не туда добавляю, поправил.
sqdb.insert(DataBase.TABLE_NAME3, DataBase.WIN, cv);

Теперь добавляет только в таблицу WIN, а во вторую не добавляет.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
14.08.2014, 13:19     Чтение данных из бд в listview #4
Попробуйте поменять местами функции добавления, что будет?
Lers
12 / 12 / 3
Регистрация: 27.05.2012
Сообщений: 202
14.08.2014, 13:30  [ТС]     Чтение данных из бд в listview #5
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
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    AdapterContextMenuInfo aMenuInfo = (AdapterContextMenuInfo) menuInfo;
 
    // Получаем позицию элемента в списке
    int position = aMenuInfo.position;
 
    // Получаем данные элемента списка, тип данных здесь вы должны указать свой!
    final String data = adapter.getItem(aMenuInfo.position);
    
    menu.add("Win").setOnMenuItemClickListener(new OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            // дествия по клику меню
            
            cv = new ContentValues();
            cv.put(DataBase.WIN,data);
              sqdb.insert(DataBase.TABLE_NAME3, DataBase.WIN, cv);
             
            
            return true;
        }
    });
    
    final String data1  = adapter.getItem(aMenuInfo.position);
    menu.add("Lose").setOnMenuItemClickListener(new OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            // дествия по клику меню
            
            ContentValues cv1 = new ContentValues();
            cv1.put(DataBase.LOSE,data1);
              sqdb.insert(DataBase.TABLE_NAME2, DataBase.LOSE, cv1);
            return true;
        }
    });
Вот так сделал все работает, но только при добавление во 2 таблицу LOSE, сразу не отображает изменения listview'a на другом фрагменте. Запись появляется, но позже(По другим фрагментам походил, вернулся, запись уже видна). С первой таблицей WIN все сразу появляется.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
14.08.2014, 13:36     Чтение данных из бд в listview #6
А обновление?
Java
1
2
3
adapter.notifyDataSetChanged();
// или
adapter.changeCursor(cursor);
Lers
12 / 12 / 3
Регистрация: 27.05.2012
Сообщений: 202
14.08.2014, 13:44  [ТС]     Чтение данных из бд в listview #7
не было, сейчас попробую.

Добавлено через 5 минут
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override
    public void onResume(){
        super.onResume();
        sqh = new DataBase(getActivity().getApplicationContext());
        sqdb = sqh.getWritableDatabase();
         cursor = sqdb.query(DataBase.TABLE_NAME2, new String[] {
                DataBase._ID, DataBase.LOSE }, null,null,null,null,null);
     
        while (cursor.moveToNext()) {
            int id = cursor.getInt(cursor.getColumnIndex(DataBase._ID));
            String name = cursor.getString(cursor.getColumnIndexOrThrow(DataBase.LOSE));
            label.add(name);
        
        } 
        
        if (label != null) {
               adapter = new ArrayAdapter <String> (getActivity(),android.R.layout.simple_list_item_1,label);
        lw2.setAdapter(adapter); 
               adapter.notifyDataSetChanged();  }
Добавил, проблема осталась.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2014, 14:27     Чтение данных из бд в listview
Еще ссылки по теме:

Способы хранения данных для expandable listview Android
ListView, База данных и SimpleCursorAdapter - onItemClick срабатывает только после добавления данных Android
Android SQLite and ListView. Ввод и вывод данных
Вывод из базы данных в ListView через SimpleCursorAdapter Android
Передача данных между ListView Android

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

Или воспользуйтесь поиском по форуму:
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
14.08.2014, 14:27     Чтение данных из бд в listview #8
У меня в приложении, при выборе элемента из контекстного меню ListView, удалятся запись из БД. Изменения сразу видны.
Делаю так:
Java
1
2
3
4
5
6
7
8
9
10
public boolean onContextItemSelected(MenuItem item) {   
    // получаем из пункта контекстного меню данные по пункту списка
    AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item.getMenuInfo();
    // получить из БД в избранном ли (1/0)
    int i = item.getTitle().equals(getString(R.string.add_to_favorite)) ? 1 : 0;
    MainActivity.db.addRemoveFromFavorite(acmi.id, i); // добавить/удалить в избранное
    cursor = MainActivity.db.getData(pageNumber); // обновление списка
    scAdapter.changeCursor(cursor);
    return super.onContextItemSelected(item);
}
Yandex
Объявления
14.08.2014, 14:27     Чтение данных из бд в listview
Ответ Создать тему
Опции темы

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