Страница 3 из 4

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

Добавлено: 24 окт 2013, 14:50
River
Вобщем, тот вариант рабочий, ошибка была в другом. Впрочем, нашлось более подходящее решение:
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

Добавлено: 28 окт 2013, 21:56
smt005
К примеру, есть функция:
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();
    }  
}
Что надо сделать чтобы при нажатии на элемент списка или кнопку списка вызвать эту функцию?

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

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

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

Добавлено: 21 ноя 2013, 15:05
trew
Superoleg писал(а):В конце обработки выскакивает такая ошибка
application google services framework in process com google process gapps is not responding
Как устранить её не знаю, спасибо )
решение
Ещё пример.

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

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

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

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

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

Добавлено: 29 апр 2014, 23:34
Sebler
С передачей данных разобрался. Просто брал всю инфу из своей модели. Столкнулся с другой проблемой. Есть 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>

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

Добавлено: 30 апр 2014, 00:11
Sebler
Извиняюсь. Наверное поторопился с вопросом. Вот как это делается на примере приведённого мною выше 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

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

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

Добавлено: 30 апр 2014, 13:16
klblk
зато getChildAt быстрее=)
(в процессорном времени)

ну а вообще нужно было и вовсе вот так:
[syntax=java](TextView)view.findViewById(R.id.tvLocationName)[/syntax]

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

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

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

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

Добавлено: 30 апр 2014, 23:51
Sebler
(TextView)fl.findViewById(R.id.tvLocationName)
(TextView)view.findViewById(R.id.tvLocationName)

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

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

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

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

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

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

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

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

Добавлено: 03 июл 2014, 13:46
andruk
Привет!
Можно ли, и как сделать свой ViewBinder для SimpleExpandableListAdapter? Если можно, то с примером кода. Спасибо!

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

Добавлено: 30 ноя 2014, 19:38
evgen_dndz
Здравствуйте.
Пытаюсь отловить нажатие на элемент списка:

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

    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.

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

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

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

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

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

Добавлено: 01 дек 2014, 19:20
evgen_dndz
Использую setViewBinder. Вопрос решен. спасибо. Решение убрать у кнопки фокус и присвоить слушатель при определении кнопки в методе.

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

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