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

Обсуждение уроков
dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 28 окт 2012, 15:20

Решил, что негоже иметь два чекбокса, может из-за этого вылетает ошибка, поэтому инкорпорировал save и load методы в адаптер. Нормально работает, только одно, очень существенное, но. У меня два списка: в Main activity и в Child activity. Если я чекаю в строке 1 пункта 1 (position=1) Child activity, и после выхода в Main activity, захожу в Child activity еще раз, но уже в пункт 2, то сохраненная position=1 отчекивает первую строку в обоих пунктах 1 и 2.
Понятно, что сохранение состояния checkbox происходит по position, а position в обоих случаях =1. Есть ли возможность обойти это препятствие?

|пункт 1 строка 1 position 1 checked
строка 2 position 2
строка 3 position 3

|пункт 2 строка 1 position 1 checked
строка 2 position 2
строка 3 position 3

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

    // пункт списка
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // используем созданные, но не используемые view
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.childitem, parent, false);
        }

        Product p = getProduct(position);

        // заполняем View в пункте списка данными из товаров: наименование, цена
        // и картинка
        ((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
        ((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + "");
        ((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);

        CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
        // пишем позицию
        cbBuy.setTag(position);
        
        // заполняем данными из товаров: в корзине или нет
        cbBuy.setChecked(p.box);
        
        // загружаем сохраненный checkbox
        cbBuy.setChecked(load(position));
        
        // присваиваем чекбоксу обработчик
        cbBuy.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                Log.d("Check", "Changing position to" + position + " " + isChecked);
                mIsChecked[position] = isChecked;
                savebox(position, isChecked);
                // меняем данные товара (в корзине или нет)
                getProduct((Integer) buttonView.getTag()).box = isChecked;
            }
        });

        return view;
    }

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

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

Сообщение Foenix » 15 ноя 2012, 00:06

Уже вовсю кастомизирую с вашей помощью разные списки, спасибо!!
Вопрос такой по xml, в которой описывается одна строчка кастомного списка.
Есть по-простому два textview. В одном, допустим, название, а в другом, допустим (рядышком, напротив названия) - цена. Примерно так(чуть-чуть криво получилось):

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

Пирожок с капустой           100.0
Ваннна металлическая       10 000.0
Еще-что-то-там-такое
-не помещающееся            3 000.0
Никак не могу добиться того, чтоб цене, выровненной по правому краю, определить ширину столько, сколько ей надо для отображения данных без wrap(!) (например может быть 100р. а может быть 10000), а названию - все оставшееся в строчке место.
Вот наоборот, чтоб первому ширину задать, а второй все место занимал - у меня как-то получилось, а вот пришпилить это к правому краю никак не получается, разве что задавать пропорции, но мне совсем не это надо.
Я названию делаю fill_parent, задав жестко ширину цены, а оно уменя кудато за границы экрана шурует цену.
Короче, вот мой xml (только там две строчки, а не одна, но они должны бытьв се равно одинаковыми)

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <TextView
                android:id="@+id/tvName1"
                android:layout_width="209dp"
                android:layout_height="wrap_content"
                android:layout_gravity="right|center_vertical"
                android:layout_weight="0.53"
                android:text="Medium Text"
                android:textAppearance="?android:attr/textAppearanceMedium" />

            <TextView
                android:id="@+id/tvSklad"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Small Text"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:width="100dp" />
        </LinearLayout>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <TextView
                android:id="@+id/tvName2"
                android:layout_width="208dp"
                android:layout_height="wrap_content"
                android:layout_weight="0.88"
                android:text="Small Text"
                android:textAppearance="?android:attr/textAppearanceSmall" />

            <TextView
                android:id="@+id/tvPrice"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right|center_vertical"
                android:text="Small Text"
                android:textAppearance="?android:attr/textAppearanceSmall"
               android:width="100dp" />
        </LinearLayout>

    </LinearLayout>

</LinearLayout>
R.id.team

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 15 ноя 2012, 00:32

вариантов как такое сделать куча, например:
1) использовать не LinearLayout, а RelativeLayout и там вы спокойно можете свой TextView разместить по правому краю, и соответственно ширина и высота wrap_content.
2) сделать так как вы сделали но поиграться с layout_weight
R.id.team
Политика на форуме запрещена

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

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

Сообщение Foenix » 15 ноя 2012, 11:33

я с весами уже пробовала, не получается, это не то, если я хочу чтобы цена помещалась на 100%. Какое вообще должно быть свойство, чтобы варьировать ширину по тексту, чтоб он не сворачивался в другую строчку?
R.id.team

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 15 ноя 2012, 11:52

я ж говорю используйте тогда RelativeLayout, и будет вам счастье =)
R.id.team
Политика на форуме запрещена

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

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

Сообщение Foenix » 20 ноя 2012, 13:46

может кому-то понадобится
переделала взяв пример отсюда http://developer.android.com/guide/topi ... ative.html, т.к. там более-менее похоже
- все получилось
R.id.team

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

heluvet
Сообщения: 8
Зарегистрирован: 20 дек 2012, 09:48

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

Сообщение heluvet » 09 янв 2013, 12:24

Добрый день, господа!

Есть цель вставить в элемент списка миниатюру фотографии. Даже не фотографии, а части фотографии. Как, например, при добавлении нового контакта - выбираешь фотографию, и открывается активити с возможностью выбора зоны отображения.

Так вот, каким образом можно реализовать выбор области отображения?

shatl
Сообщения: 32
Зарегистрирован: 04 мар 2013, 17:03

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

Сообщение shatl » 07 мар 2013, 14:40

Всем привет!Не могу запустить данный код, выдает 1 ошибку /** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); <----- main подчеркнуто красной линией и не запускаеться.Зачем это здесь вообще, я уже новый лэйаут создал с id main, подскажите пожалуйста, в чем ошибка.

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

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

Сообщение Foenix » 07 мар 2013, 14:45

Посмотри в логах ошибок, красным будет написано. Скоре всего у тебя ошибка в xml - файле каком-нибудь.
R.id.team

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

shatl
Сообщения: 32
Зарегистрирован: 04 мар 2013, 17:03

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

Сообщение shatl » 07 мар 2013, 15:05

Я открыл логкэт, там он ни чего не пише.Запускаю код в эмулятор, не пускает пишет: Your project contains errors, plz fix them before running your application. Зачем вообще тут этот main, если в проекте всего два лэйаута и они у меня есть и id там есть, а он та откуда взялся этот main?=\

PS так вроде понял я думал здесь нужен ID, вообщем переименовал XML

shatl
Сообщения: 32
Зарегистрирован: 04 мар 2013, 17:03

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

Сообщение shatl » 10 мар 2013, 13:19

В коде ни каких ошибок не выдает, при запуске в эмуляторе не запускаеться.Что делать? Может ни тот дивайс, если да то какой нужен?=\

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

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

Сообщение Foenix » 10 мар 2013, 13:22

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

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

shatl
Сообщения: 32
Зарегистрирован: 04 мар 2013, 17:03

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

Сообщение shatl » 10 мар 2013, 13:33

03-10 10:18:30.149: D/AndroidRuntime(352): Shutting down VM
03-10 10:18:30.149: W/dalvikvm(352): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-10 10:18:30.190: E/AndroidRuntime(352): FATAL EXCEPTION: main
03-10 10:18:30.190: E/AndroidRuntime(352): java.lang.ClassCastException: android.widget.LinearLayout
03-10 10:18:30.190: E/AndroidRuntime(352): at ru.example.df.BoxAdapter.getView(BoxAdapter.java:62)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.AbsListView.obtainView(AbsListView.java:1430)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.ListView.makeAndAddView(ListView.java:1745)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.ListView.fillDown(ListView.java:670)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.ListView.fillFromTop(ListView.java:727)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.ListView.layoutChildren(ListView.java:1598)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.AbsListView.onLayout(AbsListView.java:1260)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.View.layout(View.java:7175)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.View.layout(View.java:7175)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.View.layout(View.java:7175)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.View.layout(View.java:7175)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.View.layout(View.java:7175)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.ViewRoot.performTraversals(ViewRoot.java:1140)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.os.Handler.dispatchMessage(Handler.java:99)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.os.Looper.loop(Looper.java:123)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.app.ActivityThread.main(ActivityThread.java:3683)
03-10 10:18:30.190: E/AndroidRuntime(352): at java.lang.reflect.Method.invokeNative(Native Method)
03-10 10:18:30.190: E/AndroidRuntime(352): at java.lang.reflect.Method.invoke(Method.java:507)
03-10 10:18:30.190: E/AndroidRuntime(352): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-10 10:18:30.190: E/AndroidRuntime(352): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-10 10:18:30.190: E/AndroidRuntime(352): at dalvik.system.NativeStart.main(Native Method)

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

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

Сообщение Foenix » 10 мар 2013, 18:57

ЭТо называется нет ошибок?
да там же прямая ссылка на строку с ошибкой в программе. Щелкай туда два раза.
R.id.team

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

erNesto
Сообщения: 4
Зарегистрирован: 18 фев 2013, 20:06

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

Сообщение erNesto » 24 мар 2013, 22:21

доброго вермени суток) столкнулся вот с такой проблемой: у меня есть адаптер, в котором 2 текст вьюва и 1 кнопка... по нажатию на кнопку, нужно удалить именно тот елемент, которому пренадлежит эта кнопка... каким образом это делаеться?) заранее спасибо)

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 24 мар 2013, 22:38

erNesto писал(а):доброго вермени суток) столкнулся вот с такой проблемой: у меня есть адаптер, в котором 2 текст вьюва и 1 кнопка... по нажатию на кнопку, нужно удалить именно тот елемент, которому пренадлежит эта кнопка... каким образом это делаеться?) заранее спасибо)
1) вешается обработчик на кнопку, в кнопку помещается в тег номер позиции в списке, после нажатия вытаскиваем с тега позицию и по ней удаляем запись
2) или используем класс ViewHolder в котором по принципу первого варианта делаем поле в котором храним позицию
R.id.team
Политика на форуме запрещена

Artem
Сообщения: 4
Зарегистрирован: 15 мар 2013, 17:18

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

Сообщение Artem » 03 апр 2013, 17:10

Добрый день!

Спасибо за урок, все понятно.

Подскажите, как реализовать в таком списке с кастомным адаптером обработку нажатия на элемент списка. Простая установка обработчика для списка через setOnItemClickListener к результату не приводит. При этом элемент даже не подсвечивается при нажатии. Пробовал устанавливать

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

android:clickable="true"
для элемента в item.xml, тоже безрезультатно...

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

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

Сообщение KamiSempai » 04 апр 2013, 00:54

rezak90 писал(а):показывайте код, то что вы пытались не о чём не говорит
Пост в будущее? Я подозревал, что ты не простой человек)
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Artem
Сообщения: 4
Зарегистрирован: 15 мар 2013, 17:18

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

Сообщение Artem » 04 апр 2013, 16:19

показывайте код, то что вы пытались не о чём не говорит
MainActivity.java

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

package com.example.tmp;

import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {

  ArrayList<Product> products = new ArrayList<Product>();
  BoxAdapter boxAdapter;

  /** Called when the activity is first created. */
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // создаем адаптер
    fillData();
    boxAdapter = new BoxAdapter(this, products);

    // настраиваем список
    ListView lvMain = (ListView) findViewById(R.id.lvMain);
    lvMain.setAdapter(boxAdapter);
    lvMain.setOnItemClickListener(new OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
				long arg3) {
			
			showMessage();
		}
    	
    });
  }

  public void showMessage() {
	  String msg = "Нажатие на элемент списка";
	  Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}

// генерируем данные для адаптера
  void fillData() {
    for (int i = 1; i <= 20; i++) {
      products.add(new Product("Product " + i, i * 1000,
          R.drawable.ic_launcher, false));
    }
  }

  // выводим информацию о корзине
  public void showResult(View v) {
    String result = "Товары в корзине:";
    for (Product p : boxAdapter.getBox()) {
      if (p.box)
        result += "\n" + p.name;
    }
    Toast.makeText(this, result, Toast.LENGTH_LONG).show();
  }
}
item.xml

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:clickable="true"
     android:orientation="horizontal">
    <CheckBox
         android:id="@+id/cbBox"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content">
    </CheckBox>
    <LinearLayout
         android:id="@+id/linearLayout1"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_marginLeft="5dp"
         android:layout_weight="1"
         android:orientation="vertical">
       <TextView
             android:id="@+id/tvDescr"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="5dp"
             android:text=""
             android:textSize="20sp">
        </TextView>
        <TextView
             android:id="@+id/tvPrice"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="right"
             android:layout_marginRight="10dp"
             android:text="">
        </TextView>
    </LinearLayout>
    <ImageView
         android:id="@+id/ivImage"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:src="@drawable/ic_launcher">
    </ImageView>
</LinearLayout>

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 05 апр 2013, 16:01

показывайте код, то что вы пытались не о чём не говорит
R.id.team
Политика на форуме запрещена

Ответить