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

Обсуждение уроков
Аватара пользователя
River
Сообщения: 4
Зарегистрирован: 23 окт 2013, 01:57

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

Сообщение River » 24 окт 2013, 14:50

Вобщем, тот вариант рабочий, ошибка была в другом. Впрочем, нашлось более подходящее решение:
Drawable background = new ColorDrawable(0xFF484848);
Drawable progress new ColorDrawable(0xFF00B01B);
ClipDrawable clipProgress = new ClipDrawable(progress, Gravity.LEFT, ClipDrawable.HORIZONTAL);
LayerDrawable layerlist = new LayerDrawable(new Drawable[] { background, clipProgress });
layerlist.setId(0, android.R.id.background);
layerlist.setId(1, android.R.id.progress);
progressBar.setProgressDrawable(layerlist);
Источник - http://dev.androidteam.ru/

smt005
Сообщения: 3
Зарегистрирован: 20 окт 2013, 00:33

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

Сообщение smt005 » 28 окт 2013, 21:56

К примеру, есть функция:
private void ShowRes(int Pos, int Button)
{
if (Button == 0) Toast.makeText(MainActivity.this, "Нажат элемент списка под номером " + Pos, Toast.LENGTH_SHORT).show();
else Toast.makeText(MainActivity.this, "Нажата кнопка в списке под номером " + Pos, Toast.LENGTH_SHORT).show();
}
Которая находится в классе MainActivity.
Где Pos - порядковый номер элемента списка. Button - если нажата кнопка = 1, не нажата = 0.

На основе кода примера который выше, полный код будет таким:

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

package com.example.prg_list_button;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
 
public class MainActivity extends Activity {
 
	final String TAG = "mylog";
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        ListView listView = (ListView) findViewById(R.id.list_data);
 
        CustomAdapter customAdapter = new CustomAdapter();
 
        listView.setAdapter(customAdapter);
  
    }
    
    private void ShowRes(int Pos, int Button)
    {
         if (Button == 0) Toast.makeText(MainActivity.this, "Нажат элемент списка под номером " + Pos, Toast.LENGTH_SHORT).show();
         else Toast.makeText(MainActivity.this, "Нажата кнопка в списке под номером " + Pos, Toast.LENGTH_SHORT).show();
    }  
}
Что надо сделать чтобы при нажатии на элемент списка или кнопку списка вызвать эту функцию?
Последний раз редактировалось smt005 29 ноя 2013, 23:13, всего редактировалось 1 раз.

Superoleg
Сообщения: 5
Зарегистрирован: 21 ноя 2013, 12:20

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

Сообщение Superoleg » 21 ноя 2013, 12:22

В конце обработки выскакивает такая ошибка
application google services framework in process com google process gapps is not responding
Как устранить её не знаю, спасибо )

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

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

Сообщение trew » 21 ноя 2013, 15:05

Superoleg писал(а):В конце обработки выскакивает такая ошибка
application google services framework in process com google process gapps is not responding
Как устранить её не знаю, спасибо )
решение
Ещё пример.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Superoleg
Сообщения: 5
Зарегистрирован: 21 ноя 2013, 12:20

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

Сообщение Superoleg » 21 ноя 2013, 15:28

Superoleg писал(а):В конце обработки выскакивает такая ошибка
application google services framework in process com google process gapps is not responding
Как устранить её не знаю, спасибо )
Решено переустановкой AVD

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

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

Сообщение Sebler » 29 апр 2014, 15:22

Здравствуйте. А как можно передать такой объект ArrayList<Map<String, Object>> другой активити? Наткнулся на тему parcelable, но по-моему в моём случае это не обязательно т.к. я в ArrayList-е передаю не свои объекты, а хешмяп. Значения хешмяпов простые строковые переменные.

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

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

Сообщение Sebler » 29 апр 2014, 23:34

С передачей данных разобрался. Просто брал всю инфу из своей модели. Столкнулся с другой проблемой. Есть listview и есть item.xml для этого листа, состоящий из картинки и двух textview. Повесил на listview onItemClickListener. Вопрос: как теперь в методе onItemClick() добраться до конкретного textview, чтобы считать его значение?
Вот мой 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:orientation="horizontal" >

    <ImageView
        android:id="@+id/ivLocationImg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_marginLeft="5dp" >
    </ImageView>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="5dp" >

        <TextView
            android:id="@+id/tvLocationName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top|left"
            android:layout_marginLeft="5dp"
            android:textSize="18sp" >
        </TextView>

        <TextView
            android:id="@+id/tvLocationStreet"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|left"
            android:layout_marginLeft="5dp" >
        </TextView>
    </FrameLayout>

</LinearLayout>

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

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

Сообщение Sebler » 30 апр 2014, 00:11

Извиняюсь. Наверное поторопился с вопросом. Вот как это делается на примере приведённого мною выше item.xml

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

			@Override
			public void onItemClick(AdapterView<?> parent, View view, int posotion, long id) {
				FrameLayout fl = (FrameLayout) ((ViewGroup) view).getChildAt(1);
				String locName = (String) ((TextView)fl.getChildAt(0)).getText();
			}
		});

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

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

Сообщение Viewer » 30 апр 2014, 12:05

(TextView)fl.findViewById(R.id.tvLocationName) для нахождения вьюхи во FrameLayout не лучше будет?
Если вы будете изменять свой item.xml в будущем, вам придется каждый раз править свой хардкод getChildAt(0)

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

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

Сообщение klblk » 30 апр 2014, 13:16

зато getChildAt быстрее=)
(в процессорном времени)

ну а вообще нужно было и вовсе вот так:
[syntax=java](TextView)view.findViewById(R.id.tvLocationName)[/syntax]
Последний раз редактировалось klblk 30 апр 2014, 13:20, всего редактировалось 1 раз.

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

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

Сообщение Viewer » 30 апр 2014, 13:20

klblk писал(а):зато getChildAt быстрее=)
(в процессорном времени)
Для обработки кликов это не имеет большого значения т.к. это одиночные вызовы.

А вот для биндеров и других переопределенных методов адаптера, которые могут часто вызываться, это может тормозить интерфейс, в этом случае используется ViewHolder

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

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

Сообщение Sebler » 30 апр 2014, 23:51

(TextView)fl.findViewById(R.id.tvLocationName)
(TextView)view.findViewById(R.id.tvLocationName)

Первый вариант работает, но потому что он использует переменную fl, а она содержит layout который я получаю через getChild().
Второй вариант получает значение TextView, которое находится самым первым в списке. Т.е. вариант не рабочий.
Т.е. чтобы получить значение именно кликнутого TextView нужно использовать аргумент View view метода onItemClick(). А тут без getChild() не обойтись.

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

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

Сообщение KamiSempai » 01 май 2014, 21:20

Sebler писал(а):Вопрос: как теперь в методе onItemClick() добраться до конкретного textview, чтобы считать его значение?
Не делайте так! НИ КОГДА ТАК НЕ ДЕЛАЙТЕ!!!
UI компоненты ни кода не должны использоваться для хранения значений. Подчеркиваю, НИКОГДА.
У вас должен быть список строк или объектов которые содержат строку отображаемую в этом TextView. Из них и нужно брать значения.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

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

Сообщение Sebler » 03 май 2014, 18:52

KamiSempai писал(а):
Sebler писал(а): UI компоненты ни кода не должны использоваться для хранения значений.
Я и не использую их для хранения. Я использую их для отображения информации, которая, в свою очередь, хранится, допустим в БД. А в моём примере я имею список который заполняется данными из, допустим БД. Далее по клику на сроке списка мне нужно что-то делать в зависимости от того, какой объект списка был нажат. По айди это сделать не получается.

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

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

Сообщение KamiSempai » 04 май 2014, 11:50

Sebler писал(а):
KamiSempai писал(а):
Sebler писал(а): UI компоненты ни кода не должны использоваться для хранения значений.
Я и не использую их для хранения. Я использую их для отображения информации, которая, в свою очередь, хранится, допустим в БД. А в моём примере я имею список который заполняется данными из, допустим БД. Далее по клику на сроке списка мне нужно что-то делать в зависимости от того, какой объект списка был нажат. По айди это сделать не получается.
Видимо, я что-то не понимаю. Каким образом значение из TextView может помочь? Почему не воспользоваться getItem?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

andruk
Сообщения: 2
Зарегистрирован: 03 июл 2014, 13:40

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

Сообщение andruk » 03 июл 2014, 13:46

Привет!
Можно ли, и как сделать свой ViewBinder для SimpleExpandableListAdapter? Если можно, то с примером кода. Спасибо!

evgen_dndz
Сообщения: 11
Зарегистрирован: 28 окт 2014, 14:43

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

Сообщение evgen_dndz » 30 ноя 2014, 19:38

Здравствуйте.
Пытаюсь отловить нажатие на элемент списка:

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

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.rest_list);

        ImageView ivImg = (ImageView) findViewById(R.id.ivImg);
        ImageButton imButton = (ImageButton) findViewById(R.id.imButton);
        lvSimple = (ListView) findViewById(R.id.lvSimple);

        ut = new UpdateTask(this);
        ut.execute("url");

            JSONObject jsonData = ut.get();
           
        String[] from = { NAME, ADDRESS, PHONE, IMAGE, GEO};
     
        int[] to = { R.id.tvName, R.id.tvAddress, R.id.tvPhone,R.id.ivImg, R.id.imButton};

       sAdapter = new SimpleAdapter(this, data_menu, R.layout.item_rest, from, to);

       sAdapter.setViewBinder(new MyViewBinder());

        lvSimple.setAdapter(sAdapter);

        lvSimple.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                Log.d(LOG_TAG, "itemClick: position = " + position + ", id = "
                        + id);
            }
        });
    }
Список строится, но пункты не кликабельны. Проблема в том, что добавил кнопку в элемент списка, а при наличии в элементе списка ImageButton ее ClickListener входит в конфликт с ClickListener для ListView.
Подскажите пожалуйста как их можно подружить и получать нажатие кнопки отдельно от пункта списка используя именно эту реализацию(SimpleAdapter и ListView)?
И как можно присвоить кнопке данные GEO. это переменная String.

кнопку описываю через биндер.

finberg
Сообщения: 51
Зарегистрирован: 11 мар 2013, 14:20

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

Сообщение finberg » 01 дек 2014, 09:37

Честно говоря не совсем понял, но если у вас в item-e списка есть кнопка, которую вы хотите слушать, но необходимо в адаптере (в методе getView()) присваивать кнопке обработчик и и делать button.setTag(position).
А в обработчике вытегивать тэг.

Гуру, поправьте ,если что попутал.

evgen_dndz
Сообщения: 11
Зарегистрирован: 28 окт 2014, 14:43

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

Сообщение evgen_dndz » 01 дек 2014, 19:20

Использую setViewBinder. Вопрос решен. спасибо. Решение убрать у кнопки фокус и присвоить слушатель при определении кнопки в методе.

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

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

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

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

Ответить