Урок 54. Кастомизация списка. Создаем свой адаптер

Обсуждение уроков
Аватара пользователя
shtil
Сообщения: 27
Зарегистрирован: 04 июл 2013, 10:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение shtil » 18 фев 2014, 15:22

Здравствуйте. Раньше для заполнения ListView использовал SimpleCursorAdapter. Отдельно запускал Service, он заполнял мою базу и изменения сразу появлялись в ListView. Потом необходимо было изменить представление записей в ListView написал MyNotesListCursorAdapter extends SimpleCursorAdapter. Теперь данные выводятся , но не обновляются при работе сервиса. Подскажите, как правильно сделать обновление. Пытался прикрутить LoaderCallbacks<Cursor>, но не знаю, как сделать, чтобы он срабатывал после работы сервиса.


Аватара пользователя
shtil
Сообщения: 27
Зарегистрирован: 04 июл 2013, 10:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение shtil » 18 фев 2014, 19:21

Как раз по этому уроку и делал. Но после работы сервиса, который добавил записи в БД, ListView все равно не изменяется.

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

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 18 фев 2014, 19:33

значит неправильно реализован контент-провайдер.
R.id.team

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

Аватара пользователя
shtil
Сообщения: 27
Зарегистрирован: 04 июл 2013, 10:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение shtil » 18 фев 2014, 19:43

Сорри за офф-топ, по этому примеру как в уроке 136 CursorLoader - он самостоятельно следит за изменениями в БД и в случаи изменения обновляет курсор, или только самому вызывать через getSupportLoaderManager().getLoader(0).forceLoad(); ?

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

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 18 фев 2014, 19:56

нет, самостоятельно вызывать эту штуку не нужно. нужно правильно огранизовать контент-провайдер и курсор-лоадер.
R.id.team

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

Аватара пользователя
shtil
Сообщения: 27
Зарегистрирован: 04 июл 2013, 10:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение shtil » 18 фев 2014, 20:03

Foenix писал(а):нет, самостоятельно вызывать эту штуку не нужно. нужно правильно огранизовать контент-провайдер и курсор-лоадер.
Спасибо, сейчас будем детальнее разбирать эту тему.

Аватара пользователя
shtil
Сообщения: 27
Зарегистрирован: 04 июл 2013, 10:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение shtil » 18 фев 2014, 21:04

Foenix, все правильно. Ошибку допустил с курсор-лоадере. Все заработало как нужно. Спасибо

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

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 18 фев 2014, 21:11

пожалуйста
R.id.team

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

iandryxa
Сообщения: 58
Зарегистрирован: 23 янв 2014, 20:40

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение iandryxa » 26 фев 2014, 21:24

а как сделать так что бы у каждого товара была своя картинка?

farads
Сообщения: 2
Зарегистрирован: 26 фев 2014, 22:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение farads » 26 фев 2014, 22:12

Как сделать, что бы цена была привязана но не отображалась в Listwiev

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

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 27 фев 2014, 06:32

farads писал(а):Как сделать, что бы цена была привязана но не отображалась в Listwiev
листвью это средство показа данных, самим данным от этого не тепло и не холодно. Не хочешь - не показывай.
R.id.team

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

farads
Сообщения: 2
Зарегистрирован: 26 фев 2014, 22:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение farads » 27 фев 2014, 09:05

Foenix писал(а):
farads писал(а):Как сделать, что бы цена была привязана но не отображалась в Listwiev
листвью это средство показа данных, самим данным от этого не тепло и не холодно. Не хочешь - не показывай.
Можно пример или как это реализовать.

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

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 27 фев 2014, 12:51

а тут уроки есть :)
R.id.team

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

razmus
Сообщения: 82
Зарегистрирован: 26 мар 2013, 10:47

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение razmus » 07 мар 2014, 15:49

Здравствуйте! Подскажите пожалуйста, сделал свой адаптер на примере урока, забирает данные из EditText, все работает нормально, пока фокус не будет снят с поля ввода значение не запишется, возможен вариант когда пользователь не завершил ввод и нажал корзина, то в таком случае последний ввод так и не завершится. Можно ли как-то принудительно переключить фокус, чтоб завершить ввод по нажатию кнопки корзина?
Заранее благодарен!

код моего адаптера

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

public class BoxAdapter extends BaseAdapter {
  Context ctx;
  LayoutInflater lInflater;
  ArrayList<Product> objects;

  BoxAdapter(Context context, ArrayList<Product> products) {
    ctx = context;
    objects = products;
    lInflater = (LayoutInflater) ctx
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  }

  // кол-во элементов
  @Override
  public int getCount() {
    return objects.size();
  }

  // элемент по позиции
  @Override
  public Object getItem(int position) {
    return objects.get(position);
  }

  // id по позиции
  @Override
  public long getItemId(int position) {
    return position;
  }

@Override
  public View getView(int position, View convertView, ViewGroup parent) {
    // используем созданные, но не используемые view
    View view = convertView;
    ViewHolder holder;
    Product p = getProduct(position);
    if (view == null) {
    	holder = new ViewHolder();
      view = lInflater.inflate(R.layout.item, null);
      holder.name = (TextView) view.findViewById(R.id.tvDescr);
      holder.price = (TextView) view.findViewById(R.id.tvPrice);
      holder.image = (ImageView) view.findViewById(R.id.ivImage);
      holder.number = (EditText) view.findViewById(R.id.etNumber);
      view.setTag(holder);
    }else{
    	
    	holder = (ViewHolder) view.getTag();
    }
    holder.name.setText(objects.get(position).name + "");
    holder.name.setId(position);
    holder.price.setText(objects.get(position).price + "");
    holder.price.setId(position);
    holder.image.setImageResource(objects.get(position).image);
    holder.image.setId(position);
    holder.number.setText(objects.get(position).number + "");
    holder.number.setId(position);

    holder.number.setOnFocusChangeListener(Edit);
    return view;
  }

  // товар по позиции
  Product getProduct(int position) {
    return ((Product) getItem(position));
  }

  // содержимое корзины
  ArrayList<Product> getBox() {
    ArrayList<Product> box = new ArrayList<Product>();
    for (Product p : objects) {

    	if(!p.number.equals(""))
    		box.add(p);
    }
    return box;
  }

   class ViewHolder {
	  TextView name;
	  TextView price;
	  ImageView image;
	  EditText number;
  }
  
    OnFocusChangeListener Edit = new OnFocusChangeListener() {
	  public void onFocusChange(View v, boolean gainFocus) {
    if (gainFocus) {
     ((View) v.getParent()).setBackgroundColor(Color.rgb(255, 248, 220));
	  }
    else {
       final int position = v.getId();
        final EditText Caption = (EditText) v;
        getProduct((Integer) position).number = Caption.getText().toString();
	      ((View) v.getParent()).setBackgroundColor(Color.rgb(255, 255, 255));
	     }
	  } 	
};
}

С медом TextWatcher подружится не получилось, данные возвращаются и прыгают по списку, заносятся в другие поля после скрола... разобраться не получилось.

вызов

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

holder.number.addTextChangedListener(new MyTextWatcher(position));
сам класс

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

  class MyTextWatcher implements TextWatcher {
      private int position;

      public MyTextWatcher(int position) {
              this.position = position;
      }

      public void afterTextChanged(Editable s) {
    	  getProduct((Integer) position).number = s.toString();
      }
      
	@Override
	public void beforeTextChanged(CharSequence s, int start, int count,
			int after) {}
	@Override
	public void onTextChanged(CharSequence s, int start, int before, int count) {}
 }

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

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 07 мар 2014, 15:56

надо сделать отдельный метод по обработке того, что у тебя там записывается и куда (т.е. то, что у тебя тут OnFocusChangeListener Edit = new OnFocusChangeListener() { )
затем просто сделать вызов этого метода в OnFocusChangeListener и в обработчик нажатия кнопки его прикрутить.
R.id.team

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

razmus
Сообщения: 82
Зарегистрирован: 26 мар 2013, 10:47

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение razmus » 07 мар 2014, 16:43

Насколько понял, сделал.

вызов

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

    holder.number.setOnFocusChangeListener(new MyFocus());
класс

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

     class MyFocus implements OnFocusChangeListener{

	@Override
		public void onFocusChange(View v, boolean hasFocus) {
			if (hasFocus) {
				((View) v.getParent()).setBackgroundColor(Color.rgb(255, 248, 220));
			} else {
				// set the row background white
				final int position = v.getId();
				final EditText Caption = (EditText) v;
				getProduct((Integer) position).number = Caption.getText().toString();
				((View) v.getParent()).setBackgroundColor(Color.rgb(255, 255, 255));
			}
		}
		public void unFocus(View v)
		{
			v.requestFocus();
		}
	}

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

  public void showResult(View v) {
    String result = "Товары в корзине:";
    for (Product p : boxAdapter.getBox()) {
    	new MyFocus().unFocus(v);
    	if (!p.number.equals(""))
        result += "\n" + p.number;
    }
    Toast.makeText(this, result, Toast.LENGTH_LONG).show();
  }
я видно не совсем понял Вашу идею.
выпадает со словами
java.lang.IllegalStateException: Could not execute method of the activity
По чему то я понимаю, но как сделать по другому нет.
Я хочу просто снять или перевести фокус. Передать все необходимые параметры из другого класса для нахождения необходимой вьюшки я честно говоря даже не представляю как.

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

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 07 мар 2014, 16:56

ИЗвини, нету времени вообще смотреть код. Еще раз повторюсь. Берешь и делаешь у данной активити отдельный метод, который делает с гипотетической строкой то, что тебе нужно, а на вход принимает эту строку. А потом просто этот метод вызываешь там, где тебе нужно, передав туда нужные буквы (строку).
R.id.team

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

razmus
Сообщения: 82
Зарегистрирован: 26 мар 2013, 10:47

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение razmus » 07 мар 2014, 17:45

Сделал в классе адаптера такой метод

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

 
public void unFocus(){
  this.notifyDataSetChanged();
  }
Все бы хорошо, но кнопка "забрать" срабатывает правильно по чему-то только со второго нажатия на кнопку, хотя видно как ListView меняет фокус

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

  public void showResult(View v) {
    String result = "Товары в корзине:";
    boxAdapter.unFocus();
    for (Product p : boxAdapter.getBox()) {
    	if (!p.number.equals(""))
        result += "\n" + p.number;
    }
    Toast.makeText(this, result, Toast.LENGTH_LONG).show();
  }

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

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 07 мар 2014, 18:58

я ж тебе сказала - в этот метод нужно строку целевую передавать и мурыжить ее, или что ты там с ней делаешь.
Может быть я, конечно, неправильно поняла твое первое сообщение?
метод должен быть вида

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

PRIVATE void AddStringToSomeWhere(String myData){ 
  //Тут добавляем допустим строку в бд
  } 
из других мест вызываем его

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

public void onFocusChange(View v, boolean hasFocus) { 
            if (hasFocus) { 
                ((View) v.getParent()).setBackgroundColor(Color.rgb(255, 248, 220)); 
            } else { 
                // set the row background white 
                final int position = v.getId(); 
                final EditText Caption = (EditText) v; 
               AddStringToSomeWhere(Caption.getText().toString())
            } 
        } 
и аналогично по клику на кнопке вызываем тоже самое, тока юзаем .getText().toString() по названию твоей текстовой вьюшки
R.id.team

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

Ответить