Google Android - это несложно • Просмотр темы - Урок 51. SimpleAdapter, добавление и удаление записей

Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 16 авг 2018, 17:28

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 90 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
СообщениеДобавлено: 24 сен 2013, 18:29 

Зарегистрирован: 24 сен 2013, 17:29
Сообщений: 3
Благодарил (а): 1 раз.
Поблагодарили: 1 раз.
KamiSempai писал(а):
Скорее всего это из за кнопки.
Нужно запретить ей получать фокус. Это свойство android:focusable.


Спасибо, действительно не работало из-за кнопки. Удалил ее и все нажимается.
А на будущее: существует какой-нибудь способ получить текущий элемент по view?
Планировалось сделать как в списке контактов: при нажатии на поле - открывается элемент на просмотр, а на кнопке справа - какое-то действие (звонок и т.п.)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 25 сен 2013, 12:03 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Defender77 писал(а):
А на будущее: существует какой-нибудь способ получить текущий элемент по view?
Планировалось сделать как в списке контактов: при нажатии на поле - открывается элемент на просмотр, а на кнопке справа - какое-то действие (звонок и т.п.)
Нужно делать как я описал. В getView искать кнопку при помощи findViewById, запретить ей получать фокус, через setTag передать в кнопку информацию о текущей строке, затем в onClick вытащить эту информацию при помощи getTag. Ну а дальше все просто.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 окт 2013, 12:36 
Аватар пользователя

Зарегистрирован: 03 сен 2013, 09:39
Сообщений: 145
Откуда: Германия
Благодарил (а): 18 раз.
Поблагодарили: 1 раз.
Сделал редактирование... Отдельное Activity с полем ввода, в него при нажатии пункта меню посылаются данные о текущей записи через intent там строка принимается и прописывается в Edit для дальнейшего изменения... потом так же через intent посылается назад новая...
Вот думаю, Activity это такое же ресурсоёмкое понятие, как в delphi форма например? Не слишком ли жирно для редактирования новое Activity делать каждый раз? Это можно избежать или это для Androida вполне нормальное решение?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 окт 2013, 12:58 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Для редактирования обычно используют диалоги.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 окт 2013, 13:47 
Аватар пользователя

Зарегистрирован: 03 сен 2013, 09:39
Сообщений: 145
Откуда: Германия
Благодарил (а): 18 раз.
Поблагодарили: 1 раз.
KamiSempai писал(а):
Для редактирования обычно используют диалоги.

а, просто они дальше по урокам, пока не изучил) спс


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 03 ноя 2013, 11:17 

Зарегистрирован: 03 ноя 2013, 11:14
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
подскажите, пожалуйста, как можно сохранять и выводить список из файла? Спасибо.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 03 ноя 2013, 11:57 
Аватар пользователя

Зарегистрирован: 28 сен 2013, 17:34
Сообщений: 450
Благодарил (а): 8 раз.
Поблагодарили: 110 раз.
talantar писал(а):
подскажите, пожалуйста, как можно сохранять и выводить список из файла? Спасибо.

Набирайте в google.com следующие ключевые фразы:
android save listview to file
android read file to listview

_________________
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 ноя 2013, 14:45 

Зарегистрирован: 03 ноя 2013, 11:14
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
записываю и читаю список из файла, но столкнулся с такой проблемой, в чем причина


Вложения:
affirmation_error.PNG
affirmation_error.PNG [ 127.15 KiB | Просмотров: 4844 ]
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 ноя 2013, 15:11 
Аватар пользователя

Зарегистрирован: 28 сен 2013, 17:34
Сообщений: 450
Благодарил (а): 8 раз.
Поблагодарили: 110 раз.
Набирать ваш код со скриншота - нет желания.
Как получается переменная FILENAME - не видно.

_________________
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 ноя 2013, 14:14 

Зарегистрирован: 03 ноя 2013, 11:14
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
trew писал(а):
Набирать ваш код со скриншота - нет желания.
Как получается переменная FILENAME - не видно.


извиняюсь за неудобства, брал за основу код этого урока и добавил туда запись/чтение из файла:

Код: [ Загрузить ] [ Скрыть ]
  1. public class MainActivity extends Activity { 
  2.  
  3.   private static final int CM_DELETE_ID = 1; 
  4.  
  5.   // имена атрибутов для Map 
  6.   final String LOG_TAG = "myLogs"; 
  7.   final String ATTRIBUTE_NAME_TEXT = "text"; 
  8.   final String ATTRIBUTE_NAME_IMAGE = "image"; 
  9.   final String FILENAME = "file.txt"; 
  10.    
  11.   public EditText editText; 
  12.   public String message; 
  13.  
  14.   ListView lvSimple; 
  15.   SimpleAdapter sAdapter; 
  16.   ArrayList<Map<String, Object>> data; 
  17.   Map<String, Object> m; 
  18.    
  19.   /** Called when the activity is first created. */ 
  20.   public void onCreate(Bundle savedInstanceState) { 
  21.     super.onCreate(savedInstanceState); 
  22.     setContentView(R.layout.main); 
  23.     // упаковываем данные в понятную для адаптера структуру 
  24.  
  25.     data = new ArrayList<Map<String, Object>>(); 
  26.     m = new HashMap<String, Object>(); 
  27.  
  28.     try { 
  29.         BufferedReader br = new BufferedReader(new InputStreamReader( 
  30.                   openFileInput(FILENAME))); 
  31.         String line = null; 
  32.         while ((line = br.readLine()) != null) { 
  33.             m.put(ATTRIBUTE_NAME_TEXT, line.split("\r")); 
  34.             m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.ic_launcher); 
  35.             data.add(m); 
  36.         } 
  37.     } catch (FileNotFoundException e) { 
  38.         // TODO Auto-generated catch block 
  39.         e.printStackTrace(); 
  40.     } catch (IOException e) { 
  41.         // TODO Auto-generated catch block 
  42.         e.printStackTrace(); 
  43.     } 
  44.      
  45.     // массив имен атрибутов, из которых будут читаться данные 
  46.     String[] from = { ATTRIBUTE_NAME_TEXT, ATTRIBUTE_NAME_IMAGE }; 
  47.     // массив ID View-компонентов, в которые будут вставлять данные 
  48.     int[] to = { R.id.tvText, R.id.ivImg }; 
  49.  
  50.     // создаем адаптер 
  51.     sAdapter = new SimpleAdapter(this, data, R.layout.item, from, to); 
  52.  
  53.     // определяем список и присваиваем ему адаптер 
  54.     lvSimple = (ListView) findViewById(R.id.lvSimple); 
  55.     lvSimple.setAdapter(sAdapter); 
  56.     registerForContextMenu(lvSimple); 
  57.   } 
  58.  
  59.   public void onButtonClick(View v) { 
  60.       editText = (EditText) findViewById(R.id.edit_add); 
  61.       message = editText.getText().toString(); 
  62.       editText.getText().clear(); 
  63.       // создаем новый Map 
  64.     m = new HashMap<String, Object>(); 
  65. //   m.put(ATTRIBUTE_NAME_TEXT, "sometext " + (data.size() + 1)); 
  66.     m.put(ATTRIBUTE_NAME_TEXT, message); 
  67.     m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.ic_launcher); 
  68.     // добавляем его в коллекцию 
  69.     data.add(m); 
  70.     // уведомляем, что данные изменились 
  71.     sAdapter.notifyDataSetChanged(); 
  72.      
  73.     try { 
  74.           // отрываем поток для записи 
  75.           BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( 
  76.               openFileOutput(FILENAME, MODE_APPEND))); 
  77.           // пишем данные 
  78.           bw.write(message); 
  79.           bw.newLine(); 
  80.      //     bw.newLine(); 
  81.           // закрываем поток 
  82.           bw.close(); 
  83.           Log.d(LOG_TAG, message + " Файл записан"); 
  84.         } catch (FileNotFoundException e) { 
  85.           e.printStackTrace(); 
  86.         } catch (IOException e) { 
  87.           e.printStackTrace(); 
  88.         } 
  89.   } 
  90.    
  91.   public void RemoveAll(View v) { 
  92.       try { 
  93.           // отрываем поток для записи 
  94.           BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( 
  95.               openFileOutput(FILENAME, MODE_PRIVATE))); 
  96.           // закрываем поток 
  97.           bw.close(); 
  98.         } catch (FileNotFoundException e) { 
  99.           e.printStackTrace(); 
  100.         } catch (IOException e) { 
  101.           e.printStackTrace(); 
  102.         } 
  103.  
  104.       Context context = getApplicationContext(); 
  105.       CharSequence text = "data saved"; 
  106.       int duration = Toast.LENGTH_SHORT; 
  107.       Toast toast = Toast.makeText(context, text, duration); 
  108.       toast.show(); 
  109.   } 
  110.  


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 ноя 2013, 13:45 

Зарегистрирован: 02 фев 2013, 02:52
Сообщений: 81
Благодарил (а): 28 раз.
Поблагодарили: 0 раз.
Почему у меня это окно не активно? OnClick можно добавить только в коде.


Вложения:
Снимок.JPG
Снимок.JPG [ 26.76 KiB | Просмотров: 4822 ]
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 ноя 2013, 14:40 
Аватар пользователя

Зарегистрирован: 28 сен 2013, 17:34
Сообщений: 450
Благодарил (а): 8 раз.
Поблагодарили: 110 раз.
talantar
Вот пример, как я проверял:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. int i =1;
  2.           String line = null;
  3.           while (i < 3){
  4.                   //((line = br.readLine()) != null) {
  5.               //m.put(ATTRIBUTE_NAME_TEXT, line.split("\r"));
  6.               m.put(ATTRIBUTE_NAME_TEXT, " test ");
  7.               m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.ic_launcher);
  8.               data.add(m);
  9.               i = i+1;
  10.           }

Отображается правильно.

Из этой стоки line.split("\r") ты получаешь массив String !

_________________
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 ноя 2013, 15:36 

Зарегистрирован: 03 ноя 2013, 11:14
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
trew, извини, но я не понял.. считаю себя чайником, поэтому, возможно, имеет смысл просто сказать, что нужно поправить)

trew писал(а):
talantar
Вот пример, как я проверял:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. int i =1;
  2.           String line = null;
  3.           while (i < 3){
  4.                   //((line = br.readLine()) != null) {
  5.               //m.put(ATTRIBUTE_NAME_TEXT, line.split("\r"));
  6.               m.put(ATTRIBUTE_NAME_TEXT, " test ");
  7.               m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.ic_launcher);
  8.               data.add(m);
  9.               i = i+1;
  10.           }

Отображается правильно.

Из этой стоки line.split("\r") ты получаешь массив String !


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 ноя 2013, 15:38 
Аватар пользователя

Зарегистрирован: 28 сен 2013, 17:34
Сообщений: 450
Благодарил (а): 8 раз.
Поблагодарили: 110 раз.
Вместо line.split("\r") пиши line

_________________
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 ноя 2013, 04:54 

Зарегистрирован: 09 ноя 2013, 02:12
Сообщений: 3
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Код: [ Загрузить ] [ Скрыть ]
  1. package com.example.todolist; 
  2.  
  3. import java.util.ArrayList; 
  4.  
  5. import android.app.Activity; 
  6. import android.os.Bundle; 
  7. import android.view.ContextMenu; 
  8. import android.view.ContextMenu.ContextMenuInfo; 
  9. import android.view.KeyEvent; 
  10. import android.view.Menu; 
  11. import android.view.MenuItem; 
  12. import android.view.View; 
  13. import android.widget.AdapterView; 
  14. import android.widget.AdapterView.AdapterContextMenuInfo; 
  15. import android.widget.ArrayAdapter; 
  16. import android.widget.EditText; 
  17. import android.widget.ListView; 
  18. import android.widget.TextView; 
  19. import android.widget.Toast; 
  20.  
  21. public class ToDoListActivity extends Activity { 
  22.     private static final int DELETE = 1; 
  23.     ArrayList <String> todoItems; 
  24.     TextView myText; 
  25.     ArrayAdapter aa; 
  26.     @Override 
  27.     protected void onCreate(Bundle savedInstanceState) { 
  28.         super.onCreate(savedInstanceState); 
  29.         setContentView(R.layout.main); 
  30.         ListView myListView=(ListView) findViewById(R.id.myListView); 
  31.         final EditText myEditText=(EditText) findViewById(R.id.myEditText); 
  32.         final ArrayList<String> todoItems=new ArrayList<String>(); 
  33.         final TextView myText=(TextView) findViewById(R.id.myText); 
  34.         final ArrayAdapter<String> aa; 
  35.         aa=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,todoItems); 
  36.         myListView=(ListView) findViewById(R.id.myListView); 
  37.         myListView.setAdapter(aa); 
  38.         registerForContextMenu(myListView); 
  39.                  
  40.         myEditText.setOnKeyListener(new View.OnKeyListener() { 
  41.             public boolean onKey(View v, int keyCode, KeyEvent event){ 
  42.                 if(event.getAction()==KeyEvent.ACTION_DOWN) 
  43.                     if((keyCode==KeyEvent.KEYCODE_ENTER)){ 
  44.                         todoItems.add(0, myEditText.getText().toString()); 
  45.                         aa.notifyDataSetChanged(); 
  46.                         myEditText.setText(""); 
  47.                         return true; 
  48.                                              
  49.                     } 
  50.                 return false; 
  51.             } 
  52.         }); 
  53.          
  54.      
  55.          
  56.        }  
  57.      
  58.        @Override 
  59.        public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) { 
  60.         menu.add(0,DELETE,0,"delete"); 
  61.         super.onCreateContextMenu(menu, v, menuInfo); 
  62.         } 
  63.        @Override 
  64.        public boolean onContextItemSelected(MenuItem item) { 
  65.            //int selectedPos = selectedItem.getSelectedPosition(); 
  66.            if (item.getItemId() == DELETE) { 
  67.            // получаем инфу о пункте списка 
  68.            AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item.getMenuInfo(); 
  69.            // удаляем Map из коллекции, используя позицию пункта в списке 
  70.            todoItems.remove(acmi.position); 
  71.            // уведомляем, что данные изменились 
  72.            aa.notifyDataSetChanged(); 
  73.            return true; 
  74.          } 
  75.          return super.onContextItemSelected(item); 
  76.        } 
  77.        //public void onItemClick(AdapterView<?> parent, View itemClicked, int position, 
  78.                     //long id) { int i = itemClicked.getId(); 
  79.                          
  80.                         //final TextView myText=(TextView) findViewById(R.id.myText);     
  81.                     //    Toast.makeText(getApplicationContext(), ((TextView) itemClicked).getText(),Toast.LENGTH_SHORT).show(); 
  82.                     //    myText.setText(((TextView) itemClicked).getText()); 
  83.                          
  84.         //} 
  85.     @Override 
  86.     public boolean onCreateOptionsMenu(Menu menu) { 
  87.         // Inflate the menu; this adds items to the action bar if it is present. 
  88.         //getMenuInflater().inflate(R.menu.to_do_list, menu); 
  89.         //return true; 
  90.           menu.add("menu1"); 
  91.           menu.add("menu2"); 
  92.           menu.add("menu3"); 
  93.           menu.add("menu4"); 
  94.           return super.onCreateOptionsMenu(menu); 
  95.     } 
  96.      


Хочу сделать так, чтобы ListView заполнялся из EditText, а при удержании на какой-нибудь строке-появлялось контекстное меню и с его помощью можно было бы удалить эту самую выделенную строку, на шаге "Нажатие delete в контекстном меню" происходит крэш. уже часов 6 серфю инет и манулы-ничего не выходит,помогите,пожалуйста.
в коде много комментов-прощу прощения


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 дек 2013, 16:30 

Зарегистрирован: 03 ноя 2013, 11:14
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
trew писал(а):
Вместо line.split("\r") пиши line


ясность постепенно приходит, тем не менее..
использую newLine для записи:
Код: [ Загрузить ] [ Скрыть ]
  1. try { 
  2.           BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( 
  3.               openFileOutput(FILENAME, MODE_APPEND))); 
  4.           bw.write(message); 
  5.           bw.newLine(); 

НО readLine читает только последнюю запись, т.е. не распознает разделитель строк:
Код: [ Загрузить ] [ Скрыть ]
  1. try { 
  2.         BufferedReader br = new BufferedReader(new InputStreamReader( 
  3.                   openFileInput(FILENAME))); 
  4.         String line = null; 
  5.         while ((line = br.readLine()) != null) { 
  6.             m.put(ATTRIBUTE_NAME_TEXT, line); 
  7.         } 


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 дек 2013, 22:05 
Аватар пользователя

Зарегистрирован: 30 сен 2013, 12:18
Сообщений: 345
Благодарил (а): 22 раз.
Поблагодарили: 4 раз.
Isaev писал(а):
Сделал редактирование... Отдельное Activity с полем ввода, в него при нажатии пункта меню посылаются данные о текущей записи через intent там строка принимается и прописывается в Edit для дальнейшего изменения... потом так же через intent посылается назад новая...
Вот думаю, Activity это такое же ресурсоёмкое понятие, как в delphi форма например? Не слишком ли жирно для редактирования новое Activity делать каждый раз? Это можно избежать или это для Androida вполне нормальное решение?


Это бред какой то имхо
Создавать еще активити для редактирования

Я бы сделал так - по нажатию на запись в листвью - содержимое этой записи передается едиттекстам ( через которые производился ввод данных)

Там всё редактируется и нажимаем кнопку Save

Какой тупой мудак придумал решение с двумя активити
Теперь у меня еще долго не будет редактирования * хнык

_________________
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 дек 2013, 22:07 
Аватар пользователя

Зарегистрирован: 30 сен 2013, 12:18
Сообщений: 345
Благодарил (а): 22 раз.
Поблагодарили: 4 раз.
Только мне это нужно в SimpleCursorAdapter
Так как он работает с базой данных

_________________
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 13 фев 2014, 11:25 

Зарегистрирован: 13 фев 2014, 11:21
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Помогите плз, ни как не могу сделать updateList((


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 13 фев 2014, 11:49 
Аватар пользователя

Зарегистрирован: 18 окт 2012, 11:17
Сообщений: 1098
Откуда: г. Красноярск
Благодарил (а): 26 раз.
Поблагодарили: 279 раз.
*вангую* adapter.notifydatasetchanged()


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 90 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB