Урок 50. SimpleAdapter. Используем ViewBinder

Обсуждение уроков
Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение doter.ua » 09 апр 2015, 18:17

Titannet писал(а):При запуске приложения, в логи сыпется такой текст:
"Skipped X frames - too much work inside main thread"
Думаю, это не есть хорошо. Т.е. получается содержимое метода setViewValue(...) оказывается слишком тяжелым. Как с этим бороться?
вынести в фоновый поток.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Titannet
Сообщения: 2
Зарегистрирован: 09 апр 2015, 18:06

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение Titannet » 10 апр 2015, 10:12

А как можно вынести в фоновый поток, если мы работаем с элементами UI: view.setBackgroundColor(...)?

Кошки Рулят
Сообщения: 9
Зарегистрирован: 15 мар 2016, 03:10

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение Кошки Рулят » 26 мар 2016, 03:16

Как достучаться до Layout в setViewValue(View view, Cursor cursor, int columnIndex) при использовании своего биндера?
Хочу покрасить весь Layout, но так как в уроке
view.setBackgroundColor(colors[...]);
меняется цвет только самого view, а не всего Layout'а
(Речь, правда, про SimpleCursorAdapter, но я думаю, что это не суть ...)

mdm
Сообщения: 5
Зарегистрирован: 23 июн 2016, 11:55

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение mdm » 23 июн 2016, 12:18

Здравствуйте

Вопрос такой, у каждой строки ListView есть по 2 кнопки и при нажатию на одну надо делать другую недоступной.
Никак не могу добраться до второй кнопки из клика первой или наоборот, вылетает на setEnabled(true)

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:id="@+id/DataRow"
    android:background="@color/clear"
    android:orientation="vertical">

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:background="@color/white"
        android:padding="5dp"
        android:orientation="horizontal">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/btnStart"
            android:text="Start"
            android:layout_weight="1">
        </Button>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/btnEnd"
            android:text="Stop"
            android:layout_weight="1">
        </Button>
    </LinearLayout>
</LinearLayout>
JAVA

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

class MyViewBinder implements SimpleAdapter.ViewBinder {
        @Override
        public boolean setViewValue(View view, final Object data, final String textRepresentation) {
            switch (view.getId()) {
                case R.id.btnStart:
                    Button buttonStart = (Button)view.findViewById(R.id.btnStart);
                    Button buttonEnd2 = (Button)view.findViewById(R.id.btnEnd);
                    buttonStart.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                            buttonEnd2.setEnabled(false);
                            // при нажатии делать другую кнопку (buttonEnd) setEnabled(false);
                        }
                    });
                    return true;
                case R.id.btnEnd:
		    Button buttonEnd = (Button)view.findViewById(R.id.btnEnd);	
		    Button buttonStart2 = (Button)view.findViewById(R.id.btnStart);	
                    buttonEnd.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                            buttonStart2.setEnabled(false);
                            // при нажатии делать другую кнопку (buttonStart) setEnabled(false);
                        }
                    });
                    return true;
            }
            return false;
        }
    }
Последний раз редактировалось mdm 23 июн 2016, 12:54, всего редактировалось 2 раза.

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

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение klblk » 23 июн 2016, 12:52

Что-то не так у вас id у кнопок
[syntax=java5]Button buttonStart = (Button)view.findViewById(R.id.btnStart);
Button buttonEnd2 = (Button)view.findViewById(R.id.btnStart);

Button buttonEnd = (Button)view.findViewById(R.id.btnEnd);
Button buttonStart2 = (Button)view.findViewById(R.id.btnEnd); [/syntax]

mdm
Сообщения: 5
Зарегистрирован: 23 июн 2016, 11:55

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение mdm » 23 июн 2016, 12:56

klblk писал(а):Что-то не так у вас id у кнопок
Ошибся когда сюда писал, поправил вопрос, спс за неточности

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

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение klblk » 23 июн 2016, 13:18

Скорее всего не получится так сделать, пробуйте кастомный адаптер. В setViewValue() в качетве View приходит кнопка и получить из него вторую кнопку не получится.

mdm
Сообщения: 5
Зарегистрирован: 23 июн 2016, 11:55

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение mdm » 23 июн 2016, 13:34

klblk писал(а):Скорее всего не получится так сделать, пробуйте кастомный адаптер. В setViewValue() в качетве View приходит кнопка и получить из него вторую кнопку не получится.
Да я понимаю. я думал может быть есть что то типа, не java ListView.item[0].getChild() и через такое добраться

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

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение klblk » 23 июн 2016, 13:39

Посмотрите на 54 урок. Но вообще конечно лучше использовать RecyclerView (уроков по нему тут нет)

mdm
Сообщения: 5
Зарегистрирован: 23 июн 2016, 11:55

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение mdm » 23 июн 2016, 14:27

RecyclerView не подходит, нужно минимум для 4.1

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

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение klblk » 24 июн 2016, 05:07

mdm писал(а):RecyclerView не подходит, нужно минимум для 4.1
RecyclerView в support library, и еще можно использовать на старых версиях

mdm
Сообщения: 5
Зарегистрирован: 23 июн 2016, 11:55

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение mdm » 24 июн 2016, 05:57

Спасибо будем пробовать

Vilagra
Сообщения: 1
Зарегистрирован: 28 дек 2016, 20:29

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение Vilagra » 28 дек 2016, 20:38

Не пойму зачем в item.xml нужен первый LinearLayout в котором по сути лежит другой LinearLayout и больше ничего, я его убрал вроде все так же работает.

Droidoc
Сообщения: 7
Зарегистрирован: 23 дек 2016, 07:52

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение Droidoc » 09 янв 2017, 08:08

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

FATAL EXCEPTION: main
01-09 07:47:57.783 9649 9649 E     AndroidRuntime                               Process: com.aide.trainer.myapp, PID: 9649
01-09 07:47:57.783 9649 9649 E     AndroidRuntime                               java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
01-09 07:47:57.783 9649 9649 E     AndroidRuntime                               at com.aide.trainer.myapp.MainActivity$100000001$CustomBinder.setViewValue(MainActivity.java:146)
То есть почему то не может получить integer значение из dat.

Фрагмент кода:

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

ArrayList<Map<String,Object>>ARL=new ArrayList<>();
		Map<String,Object>m3;
		for(int i=0;i<s.length;i++)
		{
			m3=new HashMap<String,Object>();
			m3.put("word",s[i]);
			m3.put("size",((i+1)*5));
			ARL.add(m3);
		}
		SimpleAdapter sad=new SimpleAdapter
		(this,ARL,android.R.layout.simple_list_item_1,
		 new String[]{"word","size"},new int[]{android.R.id.text1});
		
		class CustomBinder implements ViewBinder
		{
			public boolean setViewValue(View v,Object dat,String text)
			{
				int i=((Integer)dat).intValue();
				switch(v.getId())
				{
					case android.R.id.text1: ((TextView)v).setTextSize(i);
					return true;
				}
				return false;
			}
		}
		sad.setViewBinder(new CustomBinder());
		ListView lvb=(ListView)findViewById(R.id.bindev);
		lvb.setAdapter(sad);
	}
}
Если закоментить класс CustomBinder (и соответственно присвоение этого биндера адаптеру) , то всё работает

Аватара пользователя
Foxy
Сообщения: 13
Зарегистрирован: 15 дек 2016, 14:57
Откуда: Volgograd
Контактная информация:

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение Foxy » 09 янв 2017, 11:41

Я что-то не совсем понял, зачем нужен этот Binder.. Почему нельзя было просто как в прошлом уроке сделать MySimpleAdapter? Если можно было, то каково вообще предназначение этого Binder'a на практике?
Или весь смысл именно в конвертировании в Integer?

Droidoc
Сообщения: 7
Зарегистрирован: 23 дек 2016, 07:52

Re: Урок 50. SimpleAdapter. Используем ViewBinder

Сообщение Droidoc » 09 янв 2017, 20:35

Переопределение методов setViewText() и setViewImage() из прошлого урока позволяют настроить только отображение текста и картинок (так как эти методы принимают на вход только параметры типа TextView и ImageView соответственно) , но они не позволяют изменять отображение других видов view (например "заполненность" ProgressBar'а) - вообщем-то изменить размер текста можно было и с помощью setViewText() - просто я выбрал не очень наглядный пример для самопроверки темы урока , но это не меняет того что пример почему-то выдаёт ту же ошибку , даже если переписать код:

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

ArrayList<Map<String,Object>>ARL=new ArrayList<Map<String,Object>>();
		Map<String,Object>m3;
		for(int i=0;i<s.length;i++)
		{
			m3=new HashMap<String,Object>();
			m3.put("word",s[i]);
			m3.put("size",((i+1)*5));
			ARL.add(m3);
		}
		SimpleAdapter sad=new SimpleAdapter
		(this,ARL,R.layout.secac, new String[]{"word","size"},
		new int[]{R.id.sectex,R.id.secacPG});
		
		class CustomBinder implements ViewBinder
		{
			public boolean setViewValue(View v,Object dat,String text)
			{
				int i=((Integer)dat).intValue();
				switch(v.getId())
				{
					case R.id.secacPG: ((ProgressBar)v).setProgress(i);
										return true;
				}
				return false;
			}
		}
		sad.setViewBinder(new CustomBinder());
		ListView lvb=(ListView)findViewById(R.id.bindev);
		lvb.setAdapter(sad);
	}
}
Очень странно вроде бы всё как в уроке: в Map помещаю сначала String-значение , а потом int , затем помещаю Map в коллекцию , извлекаю значение из dat также как в уроке , но вместо int почему то извлекается String и получается ошибка преобразования типов

Ответить