Урок 51. SimpleAdapter, добавление и удаление записей

Обсуждение уроков
Defender77
Сообщения: 3
Зарегистрирован: 24 сен 2013, 17:29

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение Defender77 » 24 сен 2013, 18:29

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение KamiSempai » 25 сен 2013, 12:03

Defender77 писал(а):А на будущее: существует какой-нибудь способ получить текущий элемент по view?
Планировалось сделать как в списке контактов: при нажатии на поле - открывается элемент на просмотр, а на кнопке справа - какое-то действие (звонок и т.п.)
Нужно делать как я описал. В getView искать кнопку при помощи findViewById, запретить ей получать фокус, через setTag передать в кнопку информацию о текущей строке, затем в onClick вытащить эту информацию при помощи getTag. Ну а дальше все просто.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение Isaev » 22 окт 2013, 12:36

Сделал редактирование... Отдельное Activity с полем ввода, в него при нажатии пункта меню посылаются данные о текущей записи через intent там строка принимается и прописывается в Edit для дальнейшего изменения... потом так же через intent посылается назад новая...
Вот думаю, Activity это такое же ресурсоёмкое понятие, как в delphi форма например? Не слишком ли жирно для редактирования новое Activity делать каждый раз? Это можно избежать или это для Androida вполне нормальное решение?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение KamiSempai » 22 окт 2013, 12:58

Для редактирования обычно используют диалоги.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение Isaev » 22 окт 2013, 13:47

KamiSempai писал(а):Для редактирования обычно используют диалоги.
а, просто они дальше по урокам, пока не изучил) спс

talantar
Сообщения: 5
Зарегистрирован: 03 ноя 2013, 11:14

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение talantar » 03 ноя 2013, 11:17

подскажите, пожалуйста, как можно сохранять и выводить список из файла? Спасибо.

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение trew » 03 ноя 2013, 11:57

talantar писал(а):подскажите, пожалуйста, как можно сохранять и выводить список из файла? Спасибо.
Набирайте в google.com следующие ключевые фразы:
android save listview to file
android read file to listview
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

talantar
Сообщения: 5
Зарегистрирован: 03 ноя 2013, 11:14

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение talantar » 17 ноя 2013, 14:45

записываю и читаю список из файла, но столкнулся с такой проблемой, в чем причина
Вложения
affirmation_error.PNG
affirmation_error.PNG (127.15 КБ) 13201 просмотр

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение trew » 17 ноя 2013, 15:11

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

talantar
Сообщения: 5
Зарегистрирован: 03 ноя 2013, 11:14

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение talantar » 18 ноя 2013, 14:14

trew писал(а):Набирать ваш код со скриншота - нет желания.
Как получается переменная FILENAME - не видно.
извиняюсь за неудобства, брал за основу код этого урока и добавил туда запись/чтение из файла:

Код: Выделить всё

public class MainActivity extends Activity {

  private static final int CM_DELETE_ID = 1;

  // имена атрибутов для Map
  final String LOG_TAG = "myLogs";
  final String ATTRIBUTE_NAME_TEXT = "text";
  final String ATTRIBUTE_NAME_IMAGE = "image";
  final String FILENAME = "file.txt";
  
  public EditText editText;
  public String message;

  ListView lvSimple;
  SimpleAdapter sAdapter;
  ArrayList<Map<String, Object>> data;
  Map<String, Object> m;
  
  /** Called when the activity is first created. */
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // упаковываем данные в понятную для адаптера структуру

    data = new ArrayList<Map<String, Object>>();
    m = new HashMap<String, Object>();

    try {
		BufferedReader br = new BufferedReader(new InputStreamReader(
		          openFileInput(FILENAME)));
		String line = null;
	    while ((line = br.readLine()) != null) {
	    	m.put(ATTRIBUTE_NAME_TEXT, line.split("\r"));
	    	m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.ic_launcher);
	    	data.add(m);
	    }
    } catch (FileNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
    
    // массив имен атрибутов, из которых будут читаться данные
    String[] from = { ATTRIBUTE_NAME_TEXT, ATTRIBUTE_NAME_IMAGE };
    // массив ID View-компонентов, в которые будут вставлять данные
    int[] to = { R.id.tvText, R.id.ivImg };

    // создаем адаптер
    sAdapter = new SimpleAdapter(this, data, R.layout.item, from, to);

    // определяем список и присваиваем ему адаптер
    lvSimple = (ListView) findViewById(R.id.lvSimple);
    lvSimple.setAdapter(sAdapter);
    registerForContextMenu(lvSimple);
  }

  public void onButtonClick(View v) {
	  editText = (EditText) findViewById(R.id.edit_add);
	  message = editText.getText().toString();
	  editText.getText().clear();
	  // создаем новый Map
    m = new HashMap<String, Object>();
 //   m.put(ATTRIBUTE_NAME_TEXT, "sometext " + (data.size() + 1));
    m.put(ATTRIBUTE_NAME_TEXT, message);
    m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.ic_launcher);
    // добавляем его в коллекцию
    data.add(m);
    // уведомляем, что данные изменились
    sAdapter.notifyDataSetChanged();
    
    try {
	      // отрываем поток для записи
	      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
	          openFileOutput(FILENAME, MODE_APPEND)));
	      // пишем данные
	      bw.write(message);
	      bw.newLine();
	 //     bw.newLine();
	      // закрываем поток
	      bw.close();
	      Log.d(LOG_TAG, message + " Файл записан");
	    } catch (FileNotFoundException e) {
	      e.printStackTrace();
	    } catch (IOException e) {
	      e.printStackTrace();
	    }
  }
  
  public void RemoveAll(View v) {
	  try {
	      // отрываем поток для записи
	      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
	          openFileOutput(FILENAME, MODE_PRIVATE)));
	      // закрываем поток
	      bw.close();
	    } catch (FileNotFoundException e) {
	      e.printStackTrace();
	    } catch (IOException e) {
	      e.printStackTrace();
	    }

	  Context context = getApplicationContext();
	  CharSequence text = "data saved";
	  int duration = Toast.LENGTH_SHORT;
	  Toast toast = Toast.makeText(context, text, duration);
	  toast.show();
  }

}

aleksbim
Сообщения: 81
Зарегистрирован: 02 фев 2013, 02:52

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение aleksbim » 21 ноя 2013, 13:45

Почему у меня это окно не активно? OnClick можно добавить только в коде.
Вложения
Снимок.JPG
Снимок.JPG (26.76 КБ) 13179 просмотров

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение trew » 21 ноя 2013, 14:40

talantar
Вот пример, как я проверял:
[syntax=java]int i =1;
String line = null;
while (i < 3){
//((line = br.readLine()) != null) {
//m.put(ATTRIBUTE_NAME_TEXT, line.split("\r"));
m.put(ATTRIBUTE_NAME_TEXT, " test ");
m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.ic_launcher);
data.add(m);
i = i+1;
} [/syntax]
Отображается правильно.

Из этой стоки line.split("\r") ты получаешь массив String !
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

talantar
Сообщения: 5
Зарегистрирован: 03 ноя 2013, 11:14

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение talantar » 21 ноя 2013, 15:36

trew, извини, но я не понял.. считаю себя чайником, поэтому, возможно, имеет смысл просто сказать, что нужно поправить)
trew писал(а):talantar
Вот пример, как я проверял:
[syntax=java]int i =1;
String line = null;
while (i < 3){
//((line = br.readLine()) != null) {
//m.put(ATTRIBUTE_NAME_TEXT, line.split("\r"));
m.put(ATTRIBUTE_NAME_TEXT, " test ");
m.put(ATTRIBUTE_NAME_IMAGE, R.drawable.ic_launcher);
data.add(m);
i = i+1;
} [/syntax]
Отображается правильно.

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

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение trew » 21 ноя 2013, 15:38

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

Larsen
Сообщения: 3
Зарегистрирован: 09 ноя 2013, 02:12

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение Larsen » 22 ноя 2013, 04:54

Код: Выделить всё

package com.example.todolist;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class ToDoListActivity extends Activity {
	private static final int DELETE = 1;
	ArrayList <String> todoItems;
	TextView myText;
	ArrayAdapter aa;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		ListView myListView=(ListView) findViewById(R.id.myListView);
		final EditText myEditText=(EditText) findViewById(R.id.myEditText);
		final ArrayList<String> todoItems=new ArrayList<String>();
		final TextView myText=(TextView) findViewById(R.id.myText);
		final ArrayAdapter<String> aa;
		aa=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,todoItems);
		myListView=(ListView) findViewById(R.id.myListView);
		myListView.setAdapter(aa);
		registerForContextMenu(myListView);
				
		myEditText.setOnKeyListener(new View.OnKeyListener() {
			public boolean onKey(View v, int keyCode, KeyEvent event){
				if(event.getAction()==KeyEvent.ACTION_DOWN)
					if((keyCode==KeyEvent.KEYCODE_ENTER)){
						todoItems.add(0, myEditText.getText().toString());
						aa.notifyDataSetChanged();
						myEditText.setText("");
						return true;
											
					}
				return false;
			}
		});
		
	
		
	   } 
	
	   @Override
	   public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
	    menu.add(0,DELETE,0,"delete");
	    super.onCreateContextMenu(menu, v, menuInfo);
	    }
	   @Override
	   public boolean onContextItemSelected(MenuItem item) {
		   //int selectedPos = selectedItem.getSelectedPosition();
		   if (item.getItemId() == DELETE) {
	       // получаем инфу о пункте списка
	       AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item.getMenuInfo();
	       // удаляем Map из коллекции, используя позицию пункта в списке
	       todoItems.remove(acmi.position);
	       // уведомляем, что данные изменились
	       aa.notifyDataSetChanged();
	       return true;
	     }
	     return super.onContextItemSelected(item);
	   }
	   //public void onItemClick(AdapterView<?> parent, View itemClicked, int position,
					//long id) { int i = itemClicked.getId();
						
						//final TextView myText=(TextView) findViewById(R.id.myText);	
					//	Toast.makeText(getApplicationContext(), ((TextView) itemClicked).getText(),Toast.LENGTH_SHORT).show();
					//	myText.setText(((TextView) itemClicked).getText());
						
		//}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		//getMenuInflater().inflate(R.menu.to_do_list, menu);
		//return true;
		  menu.add("menu1");
	      menu.add("menu2");
	      menu.add("menu3");
	      menu.add("menu4");
	      return super.onCreateOptionsMenu(menu);
	}
	
}
Хочу сделать так, чтобы ListView заполнялся из EditText, а при удержании на какой-нибудь строке-появлялось контекстное меню и с его помощью можно было бы удалить эту самую выделенную строку, на шаге "Нажатие delete в контекстном меню" происходит крэш. уже часов 6 серфю инет и манулы-ничего не выходит,помогите,пожалуйста.
в коде много комментов-прощу прощения

talantar
Сообщения: 5
Зарегистрирован: 03 ноя 2013, 11:14

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение talantar » 10 дек 2013, 16:30

trew писал(а):Вместо line.split("\r") пиши line
ясность постепенно приходит, тем не менее..
использую newLine для записи:

Код: Выделить всё

try {
	      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
	          openFileOutput(FILENAME, MODE_APPEND)));
	      bw.write(message);
	      bw.newLine();
НО readLine читает только последнюю запись, т.е. не распознает разделитель строк:

Код: Выделить всё

try {
		BufferedReader br = new BufferedReader(new InputStreamReader(
		          openFileInput(FILENAME)));
		String line = null;
	    while ((line = br.readLine()) != null) {
	    	m.put(ATTRIBUTE_NAME_TEXT, line);
	    }

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение IgNa » 10 дек 2013, 22:05

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

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

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

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

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение IgNa » 10 дек 2013, 22:07

Только мне это нужно в SimpleCursorAdapter
Так как он работает с базой данных
Изображение

grosha
Сообщения: 2
Зарегистрирован: 13 фев 2014, 11:21

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение grosha » 13 фев 2014, 11:25

Помогите плз, ни как не могу сделать updateList((

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение klblk » 13 фев 2014, 11:49

*вангую* adapter.notifydatasetchanged()

Ответить