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

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

Войти
Регистрация
Восстановить пароль
 
TanaTiX
Модератор
2761 / 1609 / 156
Регистрация: 19.02.2011
Сообщений: 5,842
#1

Значение в БД не изменяется - Программирование Android

11.09.2016, 13:46. Просмотров 224. Ответов 4
Метки нет (Все метки)

При клике по кнопке должны вноситься изменения в локальную БД, что сразу должно отразиться на экране.
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 com.tanatix.checkinternetresourceschanges;
 
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
 
import java.util.List;
 
/**
 * Created by TanaTiX on 28.08.2016.
 */
public class ResourceListAdapter extends ArrayAdapter<Resource> {
 
    private UpdateController controller = new UpdateController();
    private List<Resource> list = null;
 
    public ResourceListAdapter(Context context, List<Resource> list){
        super(context, R.layout.list_item_main, list);
        this.list = list;
        setNotifyOnChange(true);
    }
    static class ViewHolder{
        protected Button button;
        protected TextView name;
        protected TextView html;
        protected TextView date;
        protected TextView root;
        protected TextView link;
    }
 
    @Override
    public View getView(final int position, View convertView, ViewGroup parent){
        Log.w("adapter", "getView update");
        final Resource resource = getItem(position);
 
        if(convertView == null){
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_main, null);
        }
        final ViewHolder viewHolder = new ViewHolder();
 
        viewHolder.name = (TextView)convertView.findViewById(R.id.name);
        viewHolder.date = (TextView)convertView.findViewById(R.id.date);
        viewHolder.root = (TextView)convertView.findViewById(R.id.root);
        viewHolder.link = (TextView)convertView.findViewById(R.id.link);
        viewHolder.html = (TextView)convertView.findViewById(R.id.html);
        viewHolder.button = (Button)convertView.findViewById(R.id.updateResourceButton);
 
        viewHolder.name.setText(resource.get_name());
        viewHolder.root.setText(resource.get_root());
        viewHolder.link.setText(resource.get_link());
        viewHolder.html.setText(resource.get_html());
        //viewHolder.html.setText(Integer.toString(resource.get_id()));
        Log.w("list adapter", "constructor " + resource);
 
 
        if(resource.get_update() == DatabaseHelper.UP_PROGRESS || resource.get_update() == DatabaseHelper.UP_WAIT){
            viewHolder.button.setClickable(false);
            viewHolder.button.setText("locked");
        }else{
            viewHolder.button.setClickable(true);
            viewHolder.button.setText("update");
        }
 
        viewHolder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.w("click", "test button click " + position + " " + resource);
                ContentValues data = new ContentValues();
                data.put(DatabaseHelper.UP, DatabaseHelper.UP_PROGRESS);//происходит изменение одного int значения
                DatabaseHelper db = DatabaseSingleton.getInstance().getDataBase();
                db.updateData(resource, data);
 
                clear();
                list = DatabaseSingleton.getInstance().getDataBase().getAllResources();
                addAll(list);
                notifyDataSetChanged();
            }
        });
        return convertView;
    }
 
}
Ошибок никаких нет. Почему не происходят изменения не понятно. Впечатление, что упускаю что-то простое. Заранее спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2016, 13:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Значение в БД не изменяется (Программирование Android):

Иконка приложения не изменяется - Программирование Android
Добрый день! Хотел бы поставить свою иконку вместо стандартной. смотрел данную тему: ...

Не изменяется текст в TextView - Программирование Android
...А возможно беда в чем - то другом Собственно простецкая программа. Не могу и проверить на работоспособность, т.к все хорошо, но при...

Не изменяется стиль текста - Программирование Android
Здравствуйте. Хочу спросить, может кто сталкивался с таким. Есть два вот таких кода 1. if (mCheckI.isChecked()) { ...

Не изменяется текст в TextView при звонке - Программирование Android
Здравствуйте. Пытаюсь реализовать следующее: Есть activity, где проигрывается аудио. Хочу чтобы при входящем звонке в TextView появлялась...

Вычислить значение функции a = b ^2 sin (b), причем b изменяется от 0,9 до 1,7 с шагом 0,2. Найти среднее значение разности между элементами - C++
Доброго времени суток ! Помогите решить задачу ! Нужно написать в цикле с постусловием следующее : Вычислить значение функции...

Не изменяется значение Checkbox - VBA
Добрый день!Сделал пользовательскую форму ввода данных в БД на листе с использованием Form Control и не могу изменить значение checkbox...

4
REALIST07
Автор FAQ
Автор FAQ
178 / 178 / 13
Регистрация: 11.06.2010
Сообщений: 943
11.09.2016, 14:27 #2
1) Можно попробовать переопределить обновление списка:
Java
1
2
3
4
@Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }
2) Можно попробовать вынести логику за пределы адаптера, и обновлять список непосредственно в Activity
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
private View.OnClickListener listener = null;
public ResourceListAdapter(Context context, List<Resource> list,View.OnClickListener listener){
        super(context, R.layout.list_item_main, list);
        this.list = list;
        this.listener = listener;
        setNotifyOnChange(true);
    }
 
 
viewHolder.button.setOnClickListener(listener);
        return convertView;
    }
 
// а это объявить в активити и передавать в конструктор
View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.w("click", "test button click " + position + " " + resource);
                ContentValues data = new ContentValues();
                data.put(DatabaseHelper.UP, DatabaseHelper.UP_PROGRESS);//происходит изменение одного int значения
                DatabaseHelper db = DatabaseSingleton.getInstance().getDataBase();
                db.updateData(resource, data);
 
                clear();
                list = DatabaseSingleton.getInstance().getDataBase().getAllResources();
                addAll(list);
                notifyDataSetChanged();
            }
        };
3) Если это все не помогает, то можно унаследоваться не от ArrayAdapter,а от BaseAdapter, если вы выбираете этот вариант,то вам нужно будет вручную добавлять методы модификации, напишите мне об этом, если надумаете, если вам это нужно и я выдерну код с рабочего проекта на продакшне, удачи!
1
TanaTiX
Модератор
2761 / 1609 / 156
Регистрация: 19.02.2011
Сообщений: 5,842
12.09.2016, 08:30  [ТС] #3
REALIST07, спасибо за отзыв, но похоже дело не в обновлении списка, а в изменении данных в БД. Пока сам покумекаю, не получится - отпишусь.

Добавлено через 51 минуту
Да, тема названа не совсем корректно.
В общем данные не изменяются
Собственно обработчик клика, в котором должно запускать обновление записи.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
viewHolder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Log.w("click", "test button click " + position + " " + resource);
                ContentValues data = new ContentValues();
                data.put(DatabaseHelper.UP, DatabaseHelper.UP_PROGRESS);
                DatabaseHelper db = DatabaseSingleton.getInstance().getDataBase();
                Log.w(">>>adapter", ""+list);
                db.updateData(resource, data);
                Log.w(">>>adapter", ""+list);
                clear();
                list = DatabaseSingleton.getInstance().getDataBase().getAllResources();
                addAll(list);
                notifyDataSetChanged();
                //Log.w(">>>adapter", ""+list);
            }
        });
И метод, в котором происходит обновление (при этом значение countChanges становится равным 1)
Java
1
2
3
4
5
6
7
8
public void updateData(Resource resource, ContentValues values){
        Log.w("update item", "id: "+BaseColumns._ID + " old value ");
        db = this.getWritableDatabase();
        int countChanges = db.update(DATABASE_TABLE, values, BaseColumns._ID + "= ?", new String[]{Integer.toString(resource.get_id())});
        //int countChanges = db.update(DATABASE_TABLE, values, BaseColumns._ID + "= " + resource.get_id() , null);
        Log.w("update item", "id: "+BaseColumns._ID + " new value " + countChanges);
 
    }
И еще фрагмент
Java
1
 public static final int UP_PROGRESS = 2;
Нужное поле в БД по умолчанию имеет 0.
Вроде делаю все по написанному в уроках, но в консоль выходят не обновленные данные. Куда копать?

Добавлено через 13 часов 30 минут
Все еще актуально. Хотя бы направление.
0
vxg
Модератор
3199 / 2002 / 230
Регистрация: 13.01.2012
Сообщений: 7,750
12.09.2016, 08:46 #4
TanaTiX, изменится должен только тот элемент на котором вы кликнули или другой? Если тот же - просто устанавливайте значения прямо в обработчике. Чтобы обработчик знал чей он храните холдер в теге кнопки
0
TanaTiX
Модератор
2761 / 1609 / 156
Регистрация: 19.02.2011
Сообщений: 5,842
12.09.2016, 10:55  [ТС] #5
vxg, нет, я думал, что проблема в изменении, а дело оказалось в том, что значение в БД не изменяется (по хорошему можно было бы тему переименовать). А БД нужно в любом случае менять. В доках читаю, что у меня все должно шуршать правильно, а включаешь - не работает.
0
12.09.2016, 10:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2016, 10:55
Привет! Вот еще темы с ответами:

Изменяется значение щетчика - C++
програма читает с файлов числа, и выводит на екран. Не могу понять, почему щетчики i,j после исполнения цыкла увеличиваются на 1? Пишу в VS...

Не изменяется значение в DataGridView - C#
Имею следующий код, label1 просто для проверки того что, значение выбирается. Дак вот данные в датагрид не изменяются в зависимости от...

Изменяется значение переменной - C#
Привет, не понятно почему меняется значение переменной Theme.ID, в первой форме принимает значение 1,а после перехода на вторую по не...

Не изменяется значение типизированной константы - PascalABC.NET
Если я константу объявляю, как &lt;идентификатор&gt; : &lt;тип&gt; = &lt;значение&gt; в блоке const, то я могу её изменять по ходу выполнения программы (по...


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

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

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