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

ListView и Диалог - Android

Восстановить пароль Регистрация
 
toxic_wower
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 12
23.04.2014, 10:38     ListView и Диалог #1
Привет.
Редактирование TextView при помощи диалога.
Javascript
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
public class MainActivity extends Activity {
 
    final String LOG = "myLogs";
 
    final int DIALOG_EDIT = 1;
 
    final Context context = this;
 
    TextView text1;
 
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
 
        text1 = (TextView) findViewById(R.id.text1);
    }
 
    public void onclick(View v) {
        // вызываем диалог
        showDialog(DIALOG_EDIT);
 
    }
 
    protected Dialog onCreateDialog(int id) {
        if (id == DIALOG_EDIT) {
            AlertDialog.Builder adb = new AlertDialog.Builder(this);
 
            // !
            // get prompts.xml view
            LayoutInflater li = LayoutInflater.from(context);
            View promptsView = li.inflate(R.layout.promts, null);
 
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                    context);
 
            // set prompts.xml to alertdialog builder
            alertDialogBuilder.setView(promptsView);
 
            final EditText userInput = (EditText) promptsView
                    .findViewById(R.id.editTextDialogUserInput);
 
            // set dialog message
            alertDialogBuilder
                    .setCancelable(false)
                    .setPositiveButton("OK",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    // get user input and set it to result
                                    // edit text
                                    text1.setText(userInput.getText());
                                }
                            })
                    .setNegativeButton("Cancel",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    dialog.cancel();
                                }
                            });
 
            // create alert dialog
            AlertDialog alertDialog = alertDialogBuilder.create();
 
            // show it
            alertDialog.show();
 
        }
 
        // !
 
        return super.onCreateDialog(id);
    }
}
В чем вопрос. Можно ли сделать подобное только с ListView?

У меня вроде получалось, но кривовато, + данные которые редактировались я выводил в логи, по-другому сделать не могу.

Я так понимаю метод который выводит данные в TextView на экран вот этот:
Javascript
1
text1.setText(userInput.getText());
А как выглядит метод который выводит данные в ListView?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NiRamz
210 / 210 / 16
Регистрация: 26.12.2010
Сообщений: 691
23.04.2014, 10:45     ListView и Диалог #2
назначить OnItemClickListener, оттуда мы получим позицию элемента, меняем в исходном объекте значение (или в базе, если у вас CursorAdapter), вызываем у адаптера .notifydatasetchange();, список перерисуется
toxic_wower
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 12
23.04.2014, 12:23  [ТС]     ListView и Диалог #3
Вот что у меня получилось.

Javascript
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
public class MainActivity extends Activity {
 
    final String LOG_TAG = "myLogs";
 
    // элементы списка которые будут в него внесены
    String[] data = { "Click", "Click", "Ckick" };
 
    int DIALOG_TIME = 1;
    int myHour = 12;
    int myMinute = 00;
    ListView lvMain;
 
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        // Связываемся с ListView
        ListView lvMain = (ListView) findViewById(R.id.lvMain);
 
        // создаем адаптер
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, data);
 
        // устанавливаем адаптер списку
        lvMain.setAdapter(adapter);
 
        // public void onclick(View view) {
        // showDialog(DIALOG_TIME);
        lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Log.d(LOG_TAG, "itemClick: position = " + position + ", id = "
                        + id);
                showDialog(DIALOG_TIME);
            }
        });
 
        lvMain.setOnItemSelectedListener(new OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                Log.d(LOG_TAG, "itemSelect: position = " + position + ", id = "
                        + id);
            }
 
            public void onNothingSelected(AdapterView<?> parent) {
                Log.d(LOG_TAG, "itemSelect: nothing");
            }
        });
 
    }
 
    protected Dialog onCreateDialog(int id) {
        if (id == DIALOG_TIME) {
            TimePickerDialog tpd = new TimePickerDialog(this, myCallBack,
                    myHour, myMinute, true);
            return tpd;
        }
        return super.onCreateDialog(id);
    }
 
    OnTimeSetListener myCallBack = new OnTimeSetListener() {
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            myHour = hourOfDay;
            myMinute = minute;
            Log.d(LOG_TAG, "Time is " + myHour + " hours " + myMinute
                    + " minutes");
            // lvMain.setText("Time is " + myHour + " hours " + myMinute
            // + " minutes");
        }
 
    };
}
Вроде бы все нажимается, все хорошо.
Вот логи:

04-23 04:04:02.590: D/myLogs(2211): itemClick: position = 2, id = 2
04-23 04:04:06.820: D/myLogs(2211): Time is 12 hours 1 minutes
04-23 04:04:07.000: D/myLogs(2211): Time is 12 hours 1 minutes
04-23 04:04:12.580: D/myLogs(2211): itemClick: position = 0, id = 0
04-23 04:04:16.280: D/myLogs(2211): Time is 8 hours 1 minutes
04-23 04:04:16.360: D/myLogs(2211): Time is 8 hours 1 minutes

Но т.к я новичек, то не особо понимаю, что за исходный объект) Можно этот пример сделать "одноразовым"? Т.е. не заносить в базу данных, а просто поменять значения, чтобы они отобразились в ListView. (взял готовый кусок кода из примера с TimePickerDialog, но думаю это не так важно, смысл остается тот же.)

Вот пример с TextView:
Миниатюры
ListView и Диалог   ListView и Диалог  
NiRamz
210 / 210 / 16
Регистрация: 26.12.2010
Сообщений: 691
23.04.2014, 12:26     ListView и Диалог #4
Цитата Сообщение от toxic_wower Посмотреть сообщение
Можно этот пример сделать "одноразовым"? Т.е. не заносить в базу данных, а просто поменять значения, чтобы они отобразились в ListView.
Если вы просто смените текст в итеме, то когда проскроллите его за пределы экрана, а потом вернетесь он будет старым.

каким адаптером пользуетесь?
toxic_wower
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 12
23.04.2014, 13:25  [ТС]     ListView и Диалог #5
Цитата Сообщение от NiRamz
Если вы просто смените текст в итеме, то когда проскроллите его за пределы экрана, а потом вернетесь он будет старым.
Я просто хочу попробовать сделать именно так как объяснил, а потом уже отталкиваясь от этого пробовать с БД.

каким адаптером пользуетесь?
ArrayAdapter. Или я что-то не то говорю?)
NiRamz
210 / 210 / 16
Регистрация: 26.12.2010
Сообщений: 691
23.04.2014, 13:48     ListView и Диалог #6
Цитата Сообщение от toxic_wower Посмотреть сообщение
ArrayAdapter. Или я что-то не то говорю?
в него вы передаете массив данных, вот в нем нужный элемент и модифицируете, далее вызываете нотификацию
toxic_wower
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 12
24.04.2014, 09:51  [ТС]     ListView и Диалог #7
Цитата Сообщение от NiRamz
в него вы передаете массив данных, вот в нем нужный элемент и модифицируете, далее вызываете нотификацию
Попробую сделать как вы сказали, напишу что получилось.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2014, 12:55     ListView и Диалог
Еще ссылки по теме:

Android Диалог с флажками
Android Диалог выбора файла в Android
Диалог указания координаты на карте Android
Диалог с вводом текста Android
Android Не работает диалог

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

Или воспользуйтесь поиском по форуму:
toxic_wower
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 12
24.04.2014, 12:55  [ТС]     ListView и Диалог #8
В общем вот что у меня получилось.

Класс по работе с БД:
Javascript
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
public class DB {
 
    private static final String DB_NAME = "mydb";
    private static final int DB_VERSION = 1;
    private static final String DB_TABLE = "mytab";
 
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_IMG = "img";
    public static final String COLUMN_TXT = "txt";
 
    private static final String DB_CREATE = "create table " + DB_TABLE + "("
            + COLUMN_ID + " integer primary key autoincrement, " + COLUMN_IMG
            + " integer, " + COLUMN_TXT + " text" + ", " + ");";
 
    private final Context mCtx;
 
    private DBHelper mDBHelper;
    private SQLiteDatabase mDB;
 
    public DB(Context ctx) {
        mCtx = ctx;
    }
 
    // открыть подключение
    public void open() {
        mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
        mDB = mDBHelper.getWritableDatabase();
    }
 
    // закрыть подключение
    public void close() {
        if (mDBHelper != null)
            mDBHelper.close();
    }
 
    // получить все данные из таблицы DB_TABLE
    public Cursor getAllData() {
        return mDB.query(DB_TABLE, null, null, null, null, null, null);
    }
 
    // добавить запись в DB_TABLE
    public void addRec(String txt, int img) {
        ContentValues cv = new ContentValues();
        cv.put(COLUMN_TXT, txt);
        cv.put(COLUMN_IMG, img);
        mDB.insert(DB_TABLE, null, cv);
    }
 
    // удалить запись из DB_TABLE
    public void delRec(long id) {
        mDB.delete(DB_TABLE, COLUMN_ID + " = " + id, null);
    }
 
    // класс по созданию и управлению БД
    private class DBHelper extends SQLiteOpenHelper {
 
        public DBHelper(Context context, String name, CursorFactory factory,
                int version) {
            super(context, name, factory, version);
        }
 
        // создаем и заполняем БД
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(DB_CREATE);
 
            ContentValues cv = new ContentValues();
            for (int i = 1; i < 5; i++) {
                cv.put(COLUMN_TXT, "sometext " + i);
                cv.put(COLUMN_IMG, R.drawable.ic_launcher);
                db.insert(DB_TABLE, null, cv);
            }
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
 
}
класс MainActivity:
Javascript
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
public class MainActivity extends Activity {
 
    final Context context = this;
    final int DIALOG_EDIT = 1;
    private static final int CM_DELETE_ID = 1;
    ListView lvData;
    DB db;
    SimpleCursorAdapter scAdapter;
    Cursor cursor;
    TextView text1;
 
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        text1 = (TextView) findViewById(R.id.text1);
 
        // открываем подключение к БД
        db = new DB(this);
        db.open();
 
        // получаем курсор
        cursor = db.getAllData();
        startManagingCursor(cursor);
 
        // формируем столбцы сопоставления
        String[] from = new String[] { DB.COLUMN_IMG, DB.COLUMN_TXT };
        int[] to = new int[] { R.id.ivImg, R.id.tvText };
 
        // создааем адаптер и настраиваем список
        scAdapter = new SimpleCursorAdapter(this, R.layout.item, cursor, from,
                to);
        lvData = (ListView) findViewById(R.id.lvData);
        lvData.setAdapter(scAdapter);
 
        // добавляем контекстное меню к списку
        registerForContextMenu(lvData);
    }
 
    // обработка нажатия кнопки
    public void onButtonClick(View view) {
        showDialog(DIALOG_EDIT);
        // обновляем курсор
        cursor.requery();
    }
 
    protected Dialog onCreateDialog(int id) {
        if (id == DIALOG_EDIT) {
            AlertDialog.Builder adb = new AlertDialog.Builder(this);
 
            // !
            // get prompts.xml view
            LayoutInflater li = LayoutInflater.from(context);
            View promptsView = li.inflate(R.layout.promts, null);
 
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                    context);
 
            // set prompts.xml to alertdialog builder
            alertDialogBuilder.setView(promptsView);
 
            final EditText userInput = (EditText) promptsView
                    .findViewById(R.id.editTextDialogUserInput);
 
            // set dialog message
            alertDialogBuilder
                    .setCancelable(false)
                    .setPositiveButton("OK",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    EditText editTextDialogUserInput = userInput;
                                    db.addRec(editTextDialogUserInput.getText()
                                            .toString(), R.drawable.ic_launcher);
                                    editTextDialogUserInput.setText("");
                                    cursor.requery();
 
                                }
                            })
                    .setNegativeButton("Cancel",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    dialog.cancel();
                                }
                            });
 
            // create alert dialog
            AlertDialog alertDialog = alertDialogBuilder.create();
 
            // show it
            alertDialog.show();
 
        }
 
        // !
 
        return super.onCreateDialog(id);
    }
 
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, CM_DELETE_ID, 0, R.string.delete_record);
    }
 
    public boolean onContextItemSelected(MenuItem item) {
        if (item.getItemId() == CM_DELETE_ID) {
            // получаем из пункта контекстного меню данные по пункту списка
            AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item
                    .getMenuInfo();
            // извлекаем id записи и удаляем соответствующую запись в БД
            db.delRec(acmi.id);
            // обновляем курсор
            cursor.requery();
            return true;
        }
        return super.onContextItemSelected(item);
    }
 
    protected void onDestroy() {
        super.onDestroy();
        // закрываем подключение при выходе
        db.close();
    }
 
}
Миниатюры
ListView и Диалог   ListView и Диалог   ListView и Диалог  

Yandex
Объявления
24.04.2014, 12:55     ListView и Диалог
Ответ Создать тему
Опции темы

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