Страница 3 из 5

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

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

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

Добавлено: 25 сен 2013, 12:03
KamiSempai
Defender77 писал(а):А на будущее: существует какой-нибудь способ получить текущий элемент по view?
Планировалось сделать как в списке контактов: при нажатии на поле - открывается элемент на просмотр, а на кнопке справа - какое-то действие (звонок и т.п.)
Нужно делать как я описал. В getView искать кнопку при помощи findViewById, запретить ей получать фокус, через setTag передать в кнопку информацию о текущей строке, затем в onClick вытащить эту информацию при помощи getTag. Ну а дальше все просто.

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

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

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

Добавлено: 22 окт 2013, 12:58
KamiSempai
Для редактирования обычно используют диалоги.

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

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

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

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

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

Добавлено: 03 ноя 2013, 11:57
trew
talantar писал(а):подскажите, пожалуйста, как можно сохранять и выводить список из файла? Спасибо.
Набирайте в google.com следующие ключевые фразы:
android save listview to file
android read file to listview

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

Добавлено: 17 ноя 2013, 14:45
talantar
записываю и читаю список из файла, но столкнулся с такой проблемой, в чем причина

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

Добавлено: 17 ноя 2013, 15:11
trew
Набирать ваш код со скриншота - нет желания.
Как получается переменная FILENAME - не видно.

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

Добавлено: 18 ноя 2013, 14:14
talantar
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();
  }

}

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

Добавлено: 21 ноя 2013, 13:45
aleksbim
Почему у меня это окно не активно? OnClick можно добавить только в коде.

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

Добавлено: 21 ноя 2013, 14:40
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 !

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

Добавлено: 21 ноя 2013, 15:36
talantar
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 !

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

Добавлено: 21 ноя 2013, 15:38
trew
Вместо line.split("\r") пиши line

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

Добавлено: 22 ноя 2013, 04:54
Larsen

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

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 серфю инет и манулы-ничего не выходит,помогите,пожалуйста.
в коде много комментов-прощу прощения

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

Добавлено: 10 дек 2013, 16:30
talantar
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);
	    }

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

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

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

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

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

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

Добавлено: 10 дек 2013, 22:07
IgNa
Только мне это нужно в SimpleCursorAdapter
Так как он работает с базой данных

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

Добавлено: 13 фев 2014, 11:25
grosha
Помогите плз, ни как не могу сделать updateList((

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

Добавлено: 13 фев 2014, 11:49
klblk
*вангую* adapter.notifydatasetchanged()