Урок 50. SimpleAdapter. Используем ViewBinder
Re: Урок 50. SimpleAdapter. Используем ViewBinder
Вобщем, тот вариант рабочий, ошибка была в другом. Впрочем, нашлось более подходящее решение:
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/
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/
Re: Урок 50. SimpleAdapter. Используем ViewBinder
К примеру, есть функция:
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.
На основе кода примера который выше, полный код будет таким:
Что надо сделать чтобы при нажатии на элемент списка или кнопку списка вызвать эту функцию?
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 раз.
Re: Урок 50. SimpleAdapter. Используем ViewBinder
В конце обработки выскакивает такая ошибка
application google services framework in process com google process gapps is not responding
Как устранить её не знаю, спасибо )
application google services framework in process com google process gapps is not responding
Как устранить её не знаю, спасибо )
Re: Урок 50. SimpleAdapter. Используем ViewBinder
решениеSuperoleg писал(а):В конце обработки выскакивает такая ошибка
application google services framework in process com google process gapps is not responding
Как устранить её не знаю, спасибо )
Ещё пример.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.
Свои сообщения можно редактировать - кнопка edit.
Re: Урок 50. SimpleAdapter. Используем ViewBinder
Решено переустановкой AVDSuperoleg писал(а):В конце обработки выскакивает такая ошибка
application google services framework in process com google process gapps is not responding
Как устранить её не знаю, спасибо )
Re: Урок 50. SimpleAdapter. Используем ViewBinder
Здравствуйте. А как можно передать такой объект ArrayList<Map<String, Object>> другой активити? Наткнулся на тему parcelable, но по-моему в моём случае это не обязательно т.к. я в ArrayList-е передаю не свои объекты, а хешмяп. Значения хешмяпов простые строковые переменные.
Re: Урок 50. SimpleAdapter. Используем ViewBinder
С передачей данных разобрался. Просто брал всю инфу из своей модели. Столкнулся с другой проблемой. Есть listview и есть item.xml для этого листа, состоящий из картинки и двух textview. Повесил на listview onItemClickListener. Вопрос: как теперь в методе onItemClick() добраться до конкретного textview, чтобы считать его значение?
Вот мой item.xml
Вот мой 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>
Re: Урок 50. SimpleAdapter. Используем ViewBinder
Извиняюсь. Наверное поторопился с вопросом. Вот как это делается на примере приведённого мною выше 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();
}
});
Re: Урок 50. SimpleAdapter. Используем ViewBinder
(TextView)fl.findViewById(R.id.tvLocationName) для нахождения вьюхи во FrameLayout не лучше будет?
Если вы будете изменять свой item.xml в будущем, вам придется каждый раз править свой хардкод getChildAt(0)
Если вы будете изменять свой item.xml в будущем, вам придется каждый раз править свой хардкод getChildAt(0)
Re: Урок 50. SimpleAdapter. Используем ViewBinder
зато getChildAt быстрее=)
(в процессорном времени)
ну а вообще нужно было и вовсе вот так:
[syntax=java](TextView)view.findViewById(R.id.tvLocationName)[/syntax]
(в процессорном времени)
ну а вообще нужно было и вовсе вот так:
[syntax=java](TextView)view.findViewById(R.id.tvLocationName)[/syntax]
Последний раз редактировалось klblk 30 апр 2014, 13:20, всего редактировалось 1 раз.
Re: Урок 50. SimpleAdapter. Используем ViewBinder
Для обработки кликов это не имеет большого значения т.к. это одиночные вызовы.klblk писал(а):зато getChildAt быстрее=)
(в процессорном времени)
А вот для биндеров и других переопределенных методов адаптера, которые могут часто вызываться, это может тормозить интерфейс, в этом случае используется ViewHolder
Re: Урок 50. SimpleAdapter. Используем ViewBinder
(TextView)fl.findViewById(R.id.tvLocationName)
(TextView)view.findViewById(R.id.tvLocationName)
Первый вариант работает, но потому что он использует переменную fl, а она содержит layout который я получаю через getChild().
Второй вариант получает значение TextView, которое находится самым первым в списке. Т.е. вариант не рабочий.
Т.е. чтобы получить значение именно кликнутого TextView нужно использовать аргумент View view метода onItemClick(). А тут без getChild() не обойтись.
(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
Не делайте так! НИ КОГДА ТАК НЕ ДЕЛАЙТЕ!!!Sebler писал(а):Вопрос: как теперь в методе onItemClick() добраться до конкретного textview, чтобы считать его значение?
UI компоненты ни кода не должны использоваться для хранения значений. Подчеркиваю, НИКОГДА.
У вас должен быть список строк или объектов которые содержат строку отображаемую в этом TextView. Из них и нужно брать значения.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 50. SimpleAdapter. Используем ViewBinder
Я и не использую их для хранения. Я использую их для отображения информации, которая, в свою очередь, хранится, допустим в БД. А в моём примере я имею список который заполняется данными из, допустим БД. Далее по клику на сроке списка мне нужно что-то делать в зависимости от того, какой объект списка был нажат. По айди это сделать не получается.KamiSempai писал(а):Sebler писал(а): UI компоненты ни кода не должны использоваться для хранения значений.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 50. SimpleAdapter. Используем ViewBinder
Видимо, я что-то не понимаю. Каким образом значение из TextView может помочь? Почему не воспользоваться getItem?Sebler писал(а):Я и не использую их для хранения. Я использую их для отображения информации, которая, в свою очередь, хранится, допустим в БД. А в моём примере я имею список который заполняется данными из, допустим БД. Далее по клику на сроке списка мне нужно что-то делать в зависимости от того, какой объект списка был нажат. По айди это сделать не получается.KamiSempai писал(а):Sebler писал(а): UI компоненты ни кода не должны использоваться для хранения значений.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Урок 50. SimpleAdapter. Используем ViewBinder
Привет!
Можно ли, и как сделать свой ViewBinder для SimpleExpandableListAdapter? Если можно, то с примером кода. Спасибо!
Можно ли, и как сделать свой ViewBinder для SimpleExpandableListAdapter? Если можно, то с примером кода. Спасибо!
-
- Сообщения: 11
- Зарегистрирован: 28 окт 2014, 14:43
Re: Урок 50. SimpleAdapter. Используем ViewBinder
Здравствуйте.
Пытаюсь отловить нажатие на элемент списка:
Список строится, но пункты не кликабельны. Проблема в том, что добавил кнопку в элемент списка, а при наличии в элементе списка ImageButton ее ClickListener входит в конфликт с ClickListener для ListView.
Подскажите пожалуйста как их можно подружить и получать нажатие кнопки отдельно от пункта списка используя именно эту реализацию(SimpleAdapter и ListView)?
И как можно присвоить кнопке данные GEO. это переменная String.
кнопку описываю через биндер.
Пытаюсь отловить нажатие на элемент списка:
Код: Выделить всё
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);
}
});
}
Подскажите пожалуйста как их можно подружить и получать нажатие кнопки отдельно от пункта списка используя именно эту реализацию(SimpleAdapter и ListView)?
И как можно присвоить кнопке данные GEO. это переменная String.
кнопку описываю через биндер.
Re: Урок 50. SimpleAdapter. Используем ViewBinder
Честно говоря не совсем понял, но если у вас в item-e списка есть кнопка, которую вы хотите слушать, но необходимо в адаптере (в методе getView()) присваивать кнопке обработчик и и делать button.setTag(position).
А в обработчике вытегивать тэг.
Гуру, поправьте ,если что попутал.
А в обработчике вытегивать тэг.
Гуру, поправьте ,если что попутал.
-
- Сообщения: 11
- Зарегистрирован: 28 окт 2014, 14:43
Re: Урок 50. SimpleAdapter. Используем ViewBinder
Использую setViewBinder. Вопрос решен. спасибо. Решение убрать у кнопки фокус и присвоить слушатель при определении кнопки в методе.
Re: Урок 50. SimpleAdapter. Используем ViewBinder
При запуске приложения, в логи сыпется такой текст:
"Skipped X frames - too much work inside main thread"
Думаю, это не есть хорошо. Т.е. получается содержимое метода setViewValue(...) оказывается слишком тяжелым. Как с этим бороться?
"Skipped X frames - too much work inside main thread"
Думаю, это не есть хорошо. Т.е. получается содержимое метода setViewValue(...) оказывается слишком тяжелым. Как с этим бороться?