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

Обсуждение уроков
toxic_wower
Сообщения: 28
Зарегистрирован: 12 мар 2014, 12:06

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

Сообщение toxic_wower » 10 апр 2014, 11:37

Никак не получается сделать редактирование. Смог сделать только кнопку в контекстном меню для редактирования. Помогите с кодом.

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

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

Сообщение aleksbim » 18 апр 2014, 00:37

Подскажите пжл! Не знаю как создать простейший код.
Есть пункт списка.xml.
Задача: при каждом нажатии кнопки в списке должен добавляться новый пункт.
Все пункты будут одинаковы, никаких данных и текстов (пока) вносить не надо.
Какой адаптер использовать?
И что писать здесь:
public void onButtonClick(View v) {
// не могу понять из урока, если я ничего не вношу, т.е. все пункты одинаковы
// что тогда здесь будет добавлять новый пункт списка?
}
Вложения
Снимок.JPG
Снимок.JPG (10.69 КБ) 13476 просмотров

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 18 апр 2014, 11:31

ListView - это отображение данных, визуальный объект.
Adapter - это посредник между данными и этим отображением.
а вот данные - это самое главное. Посмотрите уроки, обращая внимание на каких данных основаны списки, выберите себе подходящий (тут любой подойдет) и организуйте по нажатию кнопки ДОБАВЛЕНИЕ ДАННЫХ. Тогда адаптер их отобразит в списке.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

toxic_wower
Сообщения: 28
Зарегистрирован: 12 мар 2014, 12:06

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

Сообщение toxic_wower » 22 апр 2014, 11:01

Сделал редактирование через диалог. Но данные выводится пока только в TextView.

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

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 не могу сделать т.к. не знаю метод который выводит данные в ListView. Помогите с кодом

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

public class MainActivity extends Activity {

	// элементы списка которые будут в него внесены
	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) {
				showDialog(DIALOG_TIME);
			}
		});
	}

	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;
			// lvMain.setFilterText("Time is " + myHour + " hours " + myMinute
			// + " minutes");
		}

	};
}

Sasha
Сообщения: 2
Зарегистрирован: 15 июл 2014, 11:44

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

Сообщение Sasha » 15 июл 2014, 11:49

всем привет подскажите как можно сделать редактирование хотя бы метод?

nazar_developer
Сообщения: 15
Зарегистрирован: 02 июл 2014, 15:26

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

Сообщение nazar_developer » 24 июл 2014, 11:29

как удалить Map из коллекции, используя кнопку а не контексное меню ?)

или другими словами как подругому реализовать вот етот код

public boolean onContextItemSelected(MenuItem item) {

if (item.getItemId() == CM_DELETE_ID) {

if (n==elhp){elhp=0;}
// получаем инфу о пункте списка
AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item.getMenuInfo();
// удаляем Map из коллекции, используя позицию пункта в списке
data.remove(acmi.position);
// уведомляем, что данные изменились
sAdapter.notifyDataSetChanged();
return true;
}
return super.onContextItemSelected(item);

}

не прибигая к используванию контексного меню а с помощю кнопки, я понимаю что нужно id позиции, как вот его получить етот id?

Viewer
Сообщения: 180
Зарегистрирован: 30 апр 2014, 11:42

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

Сообщение Viewer » 24 июл 2014, 12:44

Не знаю какая у вас коллекция используется, но помимо удаления по индексу у коллекций есть методы удаления по содержимому
java.util.Collection.remove(Object object) - метод просматривает коллекцию, находит первый же объект коллекции эквивалентный указанному аргументу(используя object.equals()) и удаляет его, т.е. индекс в данном случае не нужен.

nazar_developer
Сообщения: 15
Зарегистрирован: 02 июл 2014, 15:26

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

Сообщение nazar_developer » 24 июл 2014, 15:23

Viewer писал(а):Не знаю какая у вас коллекция используется, но помимо удаления по индексу у коллекций есть методы удаления по содержимому
java.util.Collection.remove(Object object) - метод просматривает коллекцию, находит первый же объект коллекции эквивалентный указанному аргументу(используя object.equals()) и удаляет его, т.е. индекс в данном случае не нужен.
я начинаю изучать только , будьте добри, обясните для чайника както по подробнее с примерами )
сначало изпользувать метод java.util.Collection.remove(Object ' <-- ето системное названи оставлять без изминений, а вместо етого вставлять --> ' object '?') тип object ето строка,перменая и т.д? object.equals() насколько хватает моих знаний "()" ето значит что оно чтото откудато читает , так вот , напиши мне чайнику в одну строчку правильний синтаксис с примером ) буду благодарен , делаю инвентарь для своей игри , уже неделю)))

Viewer
Сообщения: 180
Зарегистрирован: 30 апр 2014, 11:42

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

Сообщение Viewer » 24 июл 2014, 15:48

nazar_developer писал(а): я начинаю изучать только , будьте добри, обясните для чайника както по подробнее с примерами )
сначало изпользувать метод java.util.Collection.remove(Object ' <-- ето системное названи оставлять без изминений, а вместо етого вставлять --> ' object '?') тип object ето строка,перменая и т.д? object.equals() насколько хватает моих знаний "()" ето значит что оно чтото откудато читает , так вот , напиши мне чайнику в одну строчку правильний синтаксис с примером ) буду благодарен , делаю инвентарь для своей игри , уже неделю)))
[syntax=java]ArrayList<String> mistress = new ArrayList<String>();
mistress.add("Маша");
mistress.add("Катя");
mistress.add("Наташа");
mistress.add("Люба");
System.out.println("Список любовниц:");
for (String name : mistress) {
System.out.println(name);
}
//Поссорились с Катей, удаляем её из списка
mistress.remove("Катя");
System.out.println("Новый список любовниц:");
for (String name : mistress) {
System.out.println(name);
}[/syntax]

nazar_developer
Сообщения: 15
Зарегистрирован: 02 июл 2014, 15:26

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

Сообщение nazar_developer » 24 июл 2014, 16:02

Viewer писал(а):
nazar_developer писал(а): я начинаю изучать только , будьте добри, обясните для чайника както по подробнее с примерами )
сначало изпользувать метод java.util.Collection.remove(Object ' <-- ето системное названи оставлять без изминений, а вместо етого вставлять --> ' object '?') тип object ето строка,перменая и т.д? object.equals() насколько хватает моих знаний "()" ето значит что оно чтото откудато читает , так вот , напиши мне чайнику в одну строчку правильний синтаксис с примером ) буду благодарен , делаю инвентарь для своей игри , уже неделю)))
[syntax=java]ArrayList<String> mistress = new ArrayList<String>();
mistress.add("Маша");
mistress.add("Катя");
mistress.add("Наташа");
mistress.add("Люба");
System.out.println("Список любовниц:");
for (String name : mistress) {
System.out.println(name);
}
//Поссорились с Катей, удаляем её из списка
mistress.remove("Катя");
System.out.println("Новый список любовниц:");
for (String name : mistress) {
System.out.println(name);
}[/syntax]
ахах ) спасибо , походу понял)

nazar_developer
Сообщения: 15
Зарегистрирован: 02 июл 2014, 15:26

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

Сообщение nazar_developer » 25 июл 2014, 11:59

какой коструктор ArrayList использувать для метода data.add(int index, Map<String, Object> object) ?

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

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

Сообщение KamiSempai » 25 июл 2014, 12:34

Назар, пишите грамотно. То, что вы пишете, невозможно читать.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

nazar_developer
Сообщения: 15
Зарегистрирован: 02 июл 2014, 15:26

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

Сообщение nazar_developer » 25 июл 2014, 13:45

KamiSempai писал(а):Назар, пишите грамотно. То, что вы пишете, невозможно читать.
Російську мову погано знаю, але це і не дивно, бо я Українець !

чи ви мали на увазі сам код?) але це немає сенсу, я вже вирішив проблему, хто також з нею зустрічався, напишіть я тоді дам відповідь)

nazar_developer
Сообщения: 15
Зарегистрирован: 02 июл 2014, 15:26

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

Сообщение nazar_developer » 25 июл 2014, 15:40

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

SimpleAdapter sAdapter;
ArrayList  <  Map<String, Object>> data;
Map<String, Object> Map;
....

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

      String[] from = { ATTRIBUTE_NAME_TEXT, ATTRIBUTE_NAME_AMOUNT };
      int[] to = { R.id.tvText, R.id.txtAmount};

     sAdapter = new SimpleAdapter(this, data, R.layout.item, from, to);

            Map = new HashMap<String, Object>();
	    Map.put(ATTRIBUTE_NAME_TEXT, "Текст ");  
	    Map.put(ATTRIBUTE_NAME_AMOUNT, Amount);       
	      
	         data.add(Map);
                 int INDEX_MAP = data.indexOf(Map);
У меня Вопрос : как потом получить дание Amount ? зная INDEX_MAP ?;
есть же такой метод(мне так еклипс пишет) get(int index) : Map<String,Object> ArrayList
возможно ли с помощю етого метода получить Object ?

или я вот так обясню по другому, на уроке говорилось что удалять будем с помощю контексного меню, так вот ,ето хорошо, но мне надо чтоб еше изменялись кое какие дание , ето кусок из кода жирни обозначена переменная int Amount , мне нужно чтоб при нажатии она становилась = 0; но я никак немогу получить к ней доступ.
"
Map.put(ATTRIBUTE_NAME_AMOUNT, Amount);
"
возможно ли ето в Контексном меню?

жду ответа) зарание спасибо )
Последний раз редактировалось nazar_developer 25 июл 2014, 15:53, всего редактировалось 1 раз.

Viewer
Сообщения: 180
Зарегистрирован: 30 апр 2014, 11:42

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

Сообщение Viewer » 25 июл 2014, 15:52

есть же такой метод(мне так еклипс пишет) get(int index) : Map<String,Object> ArrayList
возможно ли с помощю етого метода получить Object ?
Из полученного этим методом HashMap можно получить ваш Object вызовом get(key) (в вашем случае Map.get(key))

ПС В JAVA принято с большой буквы именовать классы, а поля(переменные) желательно именовать с маленькой буквы, привыкайте сразу, потом будет меньше путаницы

nazar_developer
Сообщения: 15
Зарегистрирован: 02 июл 2014, 15:26

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

Сообщение nazar_developer » 25 июл 2014, 16:11

Viewer писал(а): Из полученного этим методом HashMap можно получить ваш Object вызовом get(key) (в вашем случае Map.get(key))

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

 int a = data.indexOf(acmi.position);   	          	      
   	                       	          	           	       
    	   Map= data.get(a);
    	   Object a = Map.get(key); 	      
    	      
   	     Toast.makeText(this,  a, Toast.LENGTH_SHORT).show();
    	      
в коде я получил index (3 строка), верно?
в 4 строке "Object a" екслипс ругаетса, говорит только может бить тип Object ((( кстате на key также ругаетса(

может в личку где нибуть напишу поможеш а? )

Viewer
Сообщения: 180
Зарегистрирован: 30 апр 2014, 11:42

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

Сообщение Viewer » 25 июл 2014, 17:01

key это то что задается первым аргументом в put (ATTRIBUTE_NAME_TEXT или ATTRIBUTE_NAME_AMOUNT в вашем коде)
"Object a" екслипс ругаетса
Наведите курсор на то на что ругается, Эклипс вам предложит варианты исправления, скорее всего нужно будет указать приведение к нужному типу
Object a = (Object)Map.get(key);

UnLimCHEg
Сообщения: 2
Зарегистрирован: 20 янв 2015, 13:41

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

Сообщение UnLimCHEg » 20 янв 2015, 13:56

Помогите справиться с проблемой:
Имеется список, аналогичный примеру. Есть ArrayList<Map<String, String>>. Адаптер - SimpleAdapter.
Проблема возникает при перевороте экрана: список обнуляется. Попробовал использовать onSaveInstanceState и onRestoreInstanceState. В Bundle записываю по отдельности два StringArrayList. Соответственно в onRestoreInstanceState считываю два этих StringArrayList и через объект типа HashMap<String, String> формирую ArrayList<Map<String, String>>. Однако как только адаптер начинает обрабатывать полученный ArrayList он почему-то всем полям присваивает значение последнего. Соответственно в списке после переворота видно требуемое количество строк, но все они одинаковые и равны последнему записанному значению из ArrayList :(((. Проверил в логах: в момент передачи из Bundle, в момент передачи данных в HashMap и в момент добавления записи в ArrayList всё выполняется правильно, а вот далее запара :(( Подскажите плиз в чем может быть дело

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

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

Сообщение KamiSempai » 20 янв 2015, 17:54

Без кода сложно, что-то сказать.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

UnLimCHEg
Сообщения: 2
Зарегистрирован: 20 янв 2015, 13:41

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

Сообщение UnLimCHEg » 20 янв 2015, 19:49

Попробую выложить ту часть, которая непосредственно касается проблемы:

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

public class InputActivity extends Activity {
...
ListView lvSimple;
private ArrayList<Map<String,String>> iList = new ArrayList<Map<String, String>>();
Map<String, String> m;
ArrayList<String> iinmas = new ArrayList<String>();
ArrayList<String> iinfmas = new ArrayList<String>();
String[] from = { I_NAME, I_INFO };
int[] to = {R.id.tvIname,R.id.tvIinfol };
...

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
....
lvSimple = (ListView) findViewById(R.id.lvSimple);
lvSimple.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
final SimpleAdapter adapter1 = new SimpleAdapter(inpact,  iList , R.layout.i_item_list,from, to);
lvSimple.setAdapter(adapter1);
....
OnClickListener oclBtninp = new OnClickListener() {                               //тут наполняю iList 
@Override
	       	 public void onClick(View v) {
	       	 // TODO Auto-generated method stub
	      	switch (v.getId()) {
	        	case R.id.inpbtn1:
                            ...
                           String sInput = edInputI.getText().toString();    //с одного эдиттекста беру одну строку
                           m = new HashMap<String, String>();
	        	   m.put(I_NAME, sInput);
                           String sst=edIinfo.getText().toString();          //со второго  эдиттекста беру вторую строку
	        	   m.put(I_INFO , sst);
                           iList .add(m);                                             //формирую  ArrayList с данными для Листвью
                           adapter1.notifyDataSetChanged();
                           iinmas.add(sInput);                                     //закидую те же данные в ArrayList'ы созданные для Биндла 
                           iinfmas.add(sst);
                            ...
           }
       }
   }

   ...
   
     protected void onSaveInstanceState(Bundle outState) {
		    super.onSaveInstanceState(outState);
		   
		    outState.putStringArrayList("mass1", iinmas);     //закидую данные из ArrayList'ов в Биндла
		    outState.putStringArrayList("mass2", iinfmas);
		  
		  }


      protected void onRestoreInstanceState(Bundle savedInstanceState) {
		    super.onRestoreInstanceState(savedInstanceState);
		    
		    iinmas=savedInstanceState.getStringArrayList("mass1");
		    iinfmas=savedInstanceState.getStringArrayList("mass2");
		    iList.clear();
		    HashMap<String, String> mmm = new HashMap<String, String>();
		       
		    for (int i = 0; i <= (iinmas.size()-1); i++) {
		    	 mmm.clear();
		    	 mmm.put(I_NAME, iinmas.get(i));
		    	 Log.i(TAG, "Element N = "+Integer.toString(i));
		    	 Log.i(TAG, "Name = "+iinmas.get(i));
		  	 mmm.put(I_INFO , iinfmas.get(i));
			 Log.i(TAG, "Text = "+iinfmas.get(i));
			 iList.add(i, mmm);
		         Log.i(TAG, "Name1 = "+iList.get(i).get(I_NAME));                           //пока всё ок 
                          }
                         for (int i = 0; i <= (ingredn.size()-1); i++) {                                   //делаю проверку содержимого ещё раз 
	    		 mmm=iList.get(i);
	    		 Log.i(TAG, "Element N = "+Integer.toString(i));                                //здесь уже все элементы iList такие же как элемент который был последним :(((
		    	 Log.i(TAG, "Name = "+mmm.get(I_NAME));
			 Log.i(TAG, "Text = "+mmm.get(I_INFO ));
		    }
         }
......
Примерно такой код

Ответить