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

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

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

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

Artem писал(а):Добрый день!

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

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

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

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

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

android:focusable="false"
для чекбокса. И убрать

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

android:clickable="true"
.

Аватара пользователя
elron
Сообщения: 31
Зарегистрирован: 14 окт 2012, 13:29

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

Сообщение elron » 20 апр 2013, 23:03

Не знаю критично для кого-то или нет, но в "MainActivity.java" -> "public void showResult(View v)" -> строка "if (p.box)" не нужна, т.к. проверка уже была в "BoxAdapter.java" -> "ArrayList<Product> getBox()".

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 22 апр 2013, 09:22

elron писал(а):Не знаю критично для кого-то или нет, но в "MainActivity.java" -> "public void showResult(View v)" -> строка "if (p.box)" не нужна, т.к. проверка уже была в "BoxAdapter.java" -> "ArrayList<Product> getBox()".
Да, в моем примере это лишняя проверка.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

xr0m
Сообщения: 131
Зарегистрирован: 06 апр 2013, 14:01

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

Сообщение xr0m » 05 май 2013, 14:17

Нужна помощь... Не получается самостоятельно разобраться с логикой кастом адаптера.
Использую Spinner

[syntax=java]
@Override
public View getView(int position, View layout, ViewGroup list) {

if(layout == null) {
LayoutInflater lInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layout = lInflater.inflate(R.layout.item, list, false);
}

try {
Language lng = (Language) getItem(position);
TextView tv = (TextView) layout.findViewById(R.id.lngTitle);

Log.d("getView","Name tv="+lng.getId()+" uID="+lng.getIdAsInteger()+"LS=" + lng.getSupportedLanguageListString());

tv.setText(lng.getTitle());

} catch(Exception e){
e.printStackTrace();
}

return layout;
}
[/syntax]

Тут всё просто, создаем вью, отправляем его в лист. В логи выводим, какие параметры записанный будут в лист под данным вью.

[syntax=java]
OnItemSelectedListener onItemSelectedListener = new OnItemSelectedListener() {

@Override
public void onItemSelected(AdapterView<?> list, View layout, int position, long id) {

switch(list.getId()) {

case R.id.lLng:
Log.i("onItemSelected","LeftList");
break;
case R.id.rLng:
Log.i("onItemSelected","RightList");
break;
}
Log.d("onItemSelected", "id= " + ((Language)list.getItemAtPosition(position)).getId()
+ " title=" + ((Language)list.getItemAtPosition(position)).getTitle()
+ " tag=" + ((Language)list.getItemAtPosition(position)).getSupportedLanguageListString());
Log.d("onItemSelected","==================================");
}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO don't change

}
};
[/syntax]
Листа два, оба одинаковой структуры. Ставим на обоих прослушку. В логи выводим параметры item из листа, используя позицию.

Запускаем и смотрим логи(никуда не кликал, просто запуск аппликации):

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

05-05 13:44:46.718: D/getView(19803): Name tv=en uID=0 LS=es,ru
05-05 13:44:46.726: D/getView(19803): Name tv=es uID=1 LS=en

05-05 13:44:46.921: I/onItemSelected(19803): LeftList
05-05 13:44:46.929: D/onItemSelected(19803): id= en title=English tag=es,ru
05-05 13:44:46.929: D/onItemSelected(19803): ==================================

05-05 13:44:46.929: I/onItemSelected(19803): RightList
05-05 13:44:46.929: D/onItemSelected(19803): id= es title=Spanish tag=en
05-05 13:44:46.929: D/onItemSelected(19803): ==================================

05-05 13:44:46.952: D/getView(19803): Name tv=en uID=0 LS=es,ru
05-05 13:44:46.952: D/getView(19803): Name tv=es uID=1 LS=en
Уже что-то не понятное. Вот он создал как бы два листа с одним элементом(их больше) в каждый лист, и вывел их на экран. Допустим, логично, так как спинер показывает только один элемент в свёрнутом состоянии.

Сработала прослушка, хм.. хоть ничего еще не менял, но, допустим, он так инициализируется.

Но почему он снова вошел в getView?!? Опять создал по одному элементу, с теми же самыми параметрами для каждого списка, зачем дважды???

Кликнул на один из списков, он развернулся, смотрим логи:

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

05-05 14:07:24.437: D/getView(19803): Name tv=es uID=1 LS=en
05-05 14:07:24.437: D/getView(19803): Name tv=ru uID=2 LS=en
05-05 14:07:24.444: D/getView(19803): Name tv=es uID=1 LS=en
05-05 14:07:24.444: D/getView(19803): Name tv=ru uID=2 LS=en
05-05 14:07:24.483: D/getView(19803): Name tv=es uID=1 LS=en
05-05 14:07:24.483: D/getView(19803): Name tv=ru uID=2 LS=en
Всё верно, в листе две записи, отображено без ошибок.
Первый раз он зашел в getView что бы создать весь список, это логично.
Но что он там забыл второй и третий раз?!?

Выберу что-нибудь из списка, логи:

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

05-05 14:11:37.687: D/getView(19803): Name tv=en uID=0 LS=es,ru
05-05 14:11:37.694: D/getView(19803): Name tv=ru uID=2 LS=en
05-05 14:11:37.710: I/onItemSelected(19803): RightList
05-05 14:11:37.710: D/onItemSelected(19803): id= ru title=Russian tag=en
05-05 14:11:37.710: D/onItemSelected(19803): ==================================
С onItemSelected всё логично, сработал селект, получил данные.

А вот с getView снова не понятно, вторая запись логична, он свернул лист, и добавил один элемент в лист.
А вот первая запись, это из другого листа, который я вообще ниразу не трогал, зачем он пересоздал лист?!?

Roman
Сообщения: 22
Зарегистрирован: 23 авг 2012, 08:43

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

Сообщение Roman » 11 июн 2013, 12:13

math64 писал(а):Передаёшь R.arrays.product параметров в констрктор ArrayAdapter - есть соответствующий конструктор
Переобределяешь метод getView() чтобы настраивал список как тебе надо.
Спасибо за ответ! Но вы простите меня за дерзость, когда человек спрашивает как, он не знает, и потому то что вы написали абсолютно не помогает.

vlas
Сообщения: 4
Зарегистрирован: 12 июн 2013, 19:38

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

Сообщение vlas » 04 июл 2013, 11:42

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

LinearLayout ll = (LinearLayout)rowView.findViewById(R.id.ll);
ll.setOnClickListener(new OnClickListener() {
			
    @Override 
    public void onClick(View v) {
        Log.i("!", "!");
    }
});
1. почему Log.i("!", "!"); не всегда срабатывает;
2. если я хочу открывать новую activity то как быть?
Intent intent = new Intent(this, activity2.class); не работает если вызывать в getView() в адаптере.

(в LinearLayout ll находится картинка и два TextView)

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

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

Сообщение klblk » 04 июл 2013, 11:56

vlas писал(а):

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

LinearLayout ll = (LinearLayout)rowView.findViewById(R.id.ll);
ll.setOnClickListener(new OnClickListener() {
			
    @Override 
    public void onClick(View v) {
        Log.i("!", "!");
    }
});
1. почему Log.i("!", "!"); не всегда срабатывает;
2. если я хочу открывать новую activity то как быть?
Intent intent = new Intent(this, activity2.class); не работает если вызывать в getView() в адаптере.

(в LinearLayout ll находится картинка и два TextView)
1. Тут помочь не могу (хотя logTag печалит, но думаю вряд ли в этом проблема)
2. А тут как я понимаю вместо this скорее всего нужно getContex()

OctahedroN
Сообщения: 18
Зарегистрирован: 15 фев 2012, 20:14

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

Сообщение OctahedroN » 04 июл 2013, 13:14

Доброго времени суток.Помогите пожалуйста. Написал свой адаптер для галереи. Суть в том что в окне галереи должен отображаться webview в котором транслируется видеопоток. Проблема в том, что когда окно с видео уезжает за экран и потом возвращается, видео начинает вновь загружаться. Вот первоначальный вариант:

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

public View getView(int position, View convertView, ViewGroup parent) {
			WebView webView = new WebView(mContext);
        	webView.getSettings().setJavaScriptEnabled(true);
        	webView.getSettings().setAllowFileAccess(true);
        	webView.getSettings().setPluginsEnabled(true);
        	webView.getSettings().setSupportZoom(true);
        	webView.getSettings().setAppCacheEnabled(true);
        	webView.setVerticalScrollBarEnabled(false);
        	webView.setHorizontalScrollBarEnabled(false);
        	rtmpUrl = viewSource[position];
   		    filename=fileName[position];
   		 if (filename.endsWith(".flv")) {
   				filename = "flv:" + filename;
   			}
    
   			bodyHtml = htmlCode;
   			bodyHtml = bodyHtml.replaceAll("@FILESRC@", 
   					"\"file=" + filename
   					+ "&stretching=uniform" + "&controlbar=none" +"&autostart=true"+"&stretching=exactfit" +"&streamer=" + rtmpUrl + "\"");
   			webView.loadDataWithBaseURL("http://127.0.0.1",
   					htmlPre + bodyHtml
   					+ htmlPost, "text/html", "UTF-8", null);
   			
   			webView.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

         return webView;
	}
Пробовал сделать так:

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

public View getView(int position, View convertView, ViewGroup parent) {
	View v = convertView;
        ViewHolder holder;
        if(v==null){
        	LayoutInflater inflater = LayoutInflater.from(mContext);
        	v = inflater.inflate(R.layout.web, parent, false);
        	holder = new ViewHolder();
        	holder.webView=(WebView) v.findViewById(R.id.webView);
        	holder.webView.getSettings().setJavaScriptEnabled(true);
        	holder.webView.getSettings().setAllowFileAccess(true);
        	holder.webView.getSettings().setPluginsEnabled(true);
        	holder.webView.getSettings().setSupportZoom(true);
        	holder.webView.getSettings().setAppCacheEnabled(true);
        	holder.webView.setVerticalScrollBarEnabled(false);
        	holder.webView.setHorizontalScrollBarEnabled(false);
        	rtmpUrl = viewSource[position];
   		    filename=fileName[position];
   		 if (filename.endsWith(".flv")) {
   				filename = "flv:" + filename;
   			}
    
   			bodyHtml = htmlCode;
   			bodyHtml = bodyHtml.replaceAll("@FILESRC@", 
   					"\"file=" + filename
   					+ "&stretching=uniform" + "&controlbar=none" +"&autostart=true"+"&stretching=exactfit" +"&streamer=" + rtmpUrl + "\"");
   			holder.webView.loadDataWithBaseURL("http://127.0.0.1",
   					htmlPre + bodyHtml
   					+ htmlPost, "text/html", "UTF-8", null);
   			
   			holder.webView.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
   			
   			v.setTag(holder);
        }else {
            holder = (ViewHolder) v.getTag();
    } 
         return v;
	}
	
	private static class ViewHolder {
        public WebView webView;
}
но приложение вылетает с ошибкой

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

07-04 10:45:59.412: E/AndroidRuntime(687): FATAL EXCEPTION: main
07-04 10:45:59.412: E/AndroidRuntime(687): java.lang.ClassCastException: android.widget.Gallery$LayoutParams
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:360)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.view.View.measure(View.java:8313)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.view.ViewGroup.measureChild(ViewGroup.java:3109)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:206)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.view.View.measure(View.java:8313)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.view.View.measure(View.java:8313)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.view.View.measure(View.java:8313)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.view.View.measure(View.java:8313)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.os.Handler.dispatchMessage(Handler.java:99)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.os.Looper.loop(Looper.java:123)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at android.app.ActivityThread.main(ActivityThread.java:3683)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at java.lang.reflect.Method.invokeNative(Native Method)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at java.lang.reflect.Method.invoke(Method.java:507)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-04 10:45:59.412: E/AndroidRuntime(687): 	at dalvik.system.NativeStart.main(Native Method)
Может быть бредовая идея делать разметку под галерею) Но я просто не знаю как применить механизм с convertview, если в разметке я не нуждаюсь

Rix
Сообщения: 10
Зарегистрирован: 12 авг 2013, 09:06

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

Сообщение Rix » 21 авг 2013, 00:44

Привет всем, столкнулся с одной проблемой.
Написал функцию которая получает JSON ответ от сервера и парсит,
JSON возвращает примерно следующее

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

[{"ID":"1","TITLE":"?????? ????","TIME":"2013-08-20 14:36:33","STATUS":"\u0001","PLAYERS":"10"},{"ID":"2","TITLE":"?????? ????","TIME":"2013-08-24 14:36:50","STATUS":"\u0001","PLAYERS":"20"},{...},{...}]
и так примерно куча записей. Затем я создал свой адаптер и хочу вывести все в ListView
Создал класс по аналогии урока

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

public class Game {
    int ID, PLAYERS, STATUS;
    String TITLE, DATE;

    Game(int _id, String _title, String _date, int _status, int _players) {
        ID = _id;
        TITLE = _title;
        DATE = _date;
        PLAYERS = _players;
        STATUS = _status;
    }
}
Далее делаю так

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

gmlist = object.getJSONArray("RESULT");
for (int i = 0; i < gmlist.length(); i++) {
    JSONObject row = gmlist.getJSONObject(i);
    Log.w(LogTag, row.getString("TITLE") + " #" + row.getInt("ID"));
    Games.add(new Game(row.getInt("ID"), row.getString("TITLE"), row.getString("TIME"), row.getInt("STATUS"), row.getInt("PLAYERS")));
}
Как показывает лог данные записываются, но ListView остается пустым...
Кст данные подгружаюся с сервера с использованием AsyncTask, мб проблема в этом?
т.к. в уроке было с начало подгружаются данные затем адаптер присваивают ListView'у. Так же пытался присвоить адаптер по окончанию получения данных результата 0, Ошибок в логе тоже нет.

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

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

Сообщение rezak90 » 21 авг 2013, 03:15

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

Rix
Сообщения: 10
Зарегистрирован: 12 авг 2013, 09:06

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

Сообщение Rix » 29 авг 2013, 11:19

У меня проблема не знаю как ее решить, в общем создал свой касмоный адаптер и ListView, данные в него добавлю путем запроса с сервера, все работает как надо, но обнаружил одну проблему, при запросе обновления списка, список судя по логам обновляется, но визуально ни как не показывает изменения пока не "тыкнешь" по списку, как исправить это? Перед тем как залить новый список выполняю clear для очистки, т.к. появляются дубли

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

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

Сообщение klblk » 29 авг 2013, 11:23

Rix писал(а):У меня проблема не знаю как ее решить, в общем создал свой касмоный адаптер и ListView, данные в него добавлю путем запроса с сервера, все работает как надо, но обнаружил одну проблему, при запросе обновления списка, список судя по логам обновляется, но визуально ни как не показывает изменения пока не "тыкнешь" по списку, как исправить это? Перед тем как залить новый список выполняю clear для очистки, т.к. появляются дубли
м.б. не хватает notifyDataSetChanged() для адаптера, после обновления

Rix
Сообщения: 10
Зарегистрирован: 12 авг 2013, 09:06

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

Сообщение Rix » 29 авг 2013, 14:29

klblk писал(а): м.б. не хватает notifyDataSetChanged() для адаптера, после обновления
точно, спасибо )

vjick
Сообщения: 1
Зарегистрирован: 23 сен 2013, 14:19

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

Сообщение vjick » 23 сен 2013, 14:29

Народ, помогите, уже голова взрывается.

Пытаюсь создать Custom Adapter на примере урока.

Выводить в список планируется элементы из класса Item.

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

package com.example.testproject;

import android.os.Parcel;
import android.os.Parcelable;

public class Item implements Parcelable  
{
	String Code;
	String Name;
	double Price;
	String Currency;
	int Count;
	
	public Item()
	{
		//Пустой конструктор
	}
	

	public Item(String _Code, String _Name, double _Price, String _Currency, int _Count) 
	{
		Code = _Code;
		Name = _Name;
		Price = _Price;
		Currency = _Currency;
		Count = _Count;
	  }

	  public int describeContents() {
	    return 0;
	  }

	  // упаковываем объект в Parcel
	  public void writeToParcel(Parcel parcel, int flags) {
	    parcel.writeString(Code);
	    parcel.writeString(Name);
	    parcel.writeDouble(Price);
	    parcel.writeString(Currency);
	    parcel.writeInt(Count);
	  }

	  public static final Parcelable.Creator<Item> CREATOR = new Parcelable.Creator<Item>() {
	    // распаковываем объект из Parcel
	    public Item createFromParcel(Parcel in) {
	      return new Item(in);
	    }

	    public Item[] newArray(int size) {
	      return new Item[size];
	    }
	  };

	  // конструктор, считывающий данные из Parcel
	  private Item(Parcel parcel) 
	  {
		  Code = parcel.readString();
		  Name = parcel.readString();
		  Price = parcel.readDouble();
		  Currency = parcel.readString();
		  Count = parcel.readInt();
	  }
}

/*package com.example.testproject;

import android.os.Parcel;
import android.os.Parcelable;

public class Item implements Parcelable  
{
	String Code;
	String Name;
	double Price;
    
    /*public Item()
	{
		//Пустой конструктор
	}*/
	
/*
	public Item(String _Code, String _Name, double _Price) 
	{
		this.Code = _Code;
		this.Name = _Name;
		this.Price = _Price;
	}
	 
	public int describeContents() 
	{
		return 0;
	}
	
	public void writeToParcel(Parcel parcel, int flags) 
	{
		parcel.writeString(Code);
		parcel.writeString(Name);
		parcel.writeDouble(Price);
	}
	 
	public static final Parcelable.Creator<Item> CREATOR = new Parcelable.Creator<Item>() 
	{
	    // распаковываем объект из Parcel
	    public Item createFromParcel(Parcel in) {
	      return new Item(in);
	    }

	    public Item[] newArray(int size) {
	      return new Item[size];
	    }
	};
	
	public Item(Parcel parcel) 
	{
		parcel.readString();
		parcel.readString();
		parcel.readDouble();
	}
}*/
Создал свой адаптер, как на уроке.

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

package com.example.testproject;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ItemAdapter extends BaseAdapter {

	Context ctx;
	LayoutInflater lInflater;
	ArrayList<Item> items;
	
	public ItemAdapter(Context context, ArrayList<Item> _items) {
		// TODO Auto-generated constructor stub
		ctx = context;
	    items = _items;
	    lInflater = (LayoutInflater) ctx
	        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return items.size();
	}

	@Override
	public Item getItem(int position) {
		// TODO Auto-generated method stub
		return items.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		View view = convertView;
	    if (view == null) {
	      view = lInflater.inflate(R.layout.list_item_row, parent, false);
	    }

	    Item p = getItem(position);

	    // заполняем View в пункте списка данными из товаров: наименование, цена
	    // и картинка
	    ((TextView) view.findViewById(R.id.textCode)).setText(p.Name);
	    ((TextView) view.findViewById(R.id.textName)).setText(p.Code);
	    ((TextView) view.findViewById(R.id.textPrice)).setText(Double.toString(p.Price));
	    
	    return view;
	}

}
Вызываю его тут.

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

public ItemAdapter adapter; 

	public XMLParser parser;
	
	protected void onCreate(Bundle savedInstanceState) 
	{
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.additems);
	    parser = new XMLParser();
	    listItemsFull = (ListView)findViewById(R.id.listItemFull);
	    listItemsFull.setChoiceMode(listItemsFull.CHOICE_MODE_MULTIPLE);
	    adapter = new ItemAdapter(this, itemsArray);
	    
	    path =  getIntent().getExtras().getString("filepath");
	    
	    File file = new File(path);
	    
	    if(!file.exists())
		{
			editFindText.setText("Файл не найден");
		}
		else if(file.exists())
		{
			try
			{
				itemsArray = parser.readXml(file);
			}
			catch(Exception ex)
			{
				ex.printStackTrace();
			}
		}
	    listItemsFull.setAdapter(adapter);
	}
Дело в том, что ошибок нет, данные на экран не выводятся, следил дебагером, itemsArray заполнен данными. Попробовал отследить вызов метода getView(...) из класса адаптера, так он не вызывается. Максимум, это вызов конструктора адаптера при объявлении: adapter = new ItemAdapter(this, itemsArray);


В чем может быть проблема?

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

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

Сообщение KamiSempai » 23 сен 2013, 17:09

Думаю, вы все сами поймете когда ответите мне на один вопрос.
parser.readXml(file) заполняет массив itemsArray или создает новый?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

saband
Сообщения: 1
Зарегистрирован: 30 сен 2013, 21:11

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

Сообщение saband » 30 сен 2013, 21:45

Привет.

UPDATE. Разобрался сам, не актуально :)
Проблема была в convertView.

Не могу разобраться с одним моментом в работе кастомного адаптера.

Задача у меня следующая: вывести в List заказы интернет-магазина. С этим проблем нет. Но - мне нужно подсвечивать заказы со статусом "Новый" полужирным шрифтом (bold). Когда я пытаюсь это сделать, по логам все отрабатывает корректно, а на практике полужирным подсвечиваются совсем не те заказы, какие надо.

Вот метод getView():

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		View view = convertView;
	    if (view == null) {
	    	view = lInflater.inflate(R.layout.orders_list_item, parent, false);
	    }

		Map<String, String> order = (Map<String, String>) getItem(position);
	    
	    ((TextView) view.findViewById(R.id.tvNumber)).setText(order.get("number").toString());
	    ((TextView) view.findViewById(R.id.tvDate)).setText(formatDate(order.get("date").toString()));
	    ((TextView) view.findViewById(R.id.tvName)).setText(order.get("name").toString());
	    ((TextView) view.findViewById(R.id.tvStatus)).setText(getStatusTitle(order.get("status").toString()));
	    ((TextView) view.findViewById(R.id.tvGoods)).setText(morphGoods(order.get("goods").toString()));
	    ((TextView) view.findViewById(R.id.tvSum)).setText(order.get("sum").toString()+" грн.");
	    
	    if (order.get("status").toString().equals(getSettingsValue("status_new"))) {
	    	Log.d("myLogs", "set bold: _id " + order.get("_id").toString() + "; position " + position + "; name " + order.get("name").toString());
	    	((TextView) view.findViewById(R.id.tvName)).setTypeface(null, Typeface.BOLD);
	    }
	    
	    return view;
	}
В логах следующее:

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

set bold: _id 4; position 3; name Деркачова Юлія
set bold: _id 4; position 3; name Деркачова Юлія
set bold: _id 4; position 3; name Деркачова Юлія
На практике:
Изображение

А если потаскать список туда-сюда, то:
Изображение

Я догадываюсь, что это как-то связано с позицией и\или айди, но не могу понять, как именно.

snowkam
Сообщения: 162
Зарегистрирован: 21 мар 2013, 11:22

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

Сообщение snowkam » 11 окт 2013, 14:12

добрый день.

заполняю spinner из базы данных при помощи SimpleCursorAdapter это как бы не сложно благодаря уроку номер 52 :D !!!
В некой форме spinner - выступает как справочник. И когда эту форму я вызываю для редактирования то идеи spinner должен встать в позицию какую нужно. И вот тут начинается прикол. Все хорошо если _id по порядку но если в разнобой то он точно не совпадет с позицией.
Есть в spinner метод getItemIdAtPosition(position) это имея позицию можно получить id а вот как получить наоборот имея id получить position?
Неужели придется перебирать в цикле?

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

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

Сообщение Foenix » 11 окт 2013, 14:31

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

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

snowkam
Сообщения: 162
Зарегистрирован: 21 мар 2013, 11:22

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

Сообщение snowkam » 11 окт 2013, 14:41

Foenix писал(а):я не поняла про какую ты позицию в которую должен встать спиннер, но если ты имеешь ввиду выбранный элемент, то да, нужно в цикле перебрать, это не долго. По курсору только построчно можно перемещаться.
да да ты правильно понял я так и сделал перебираю в цикле курсор . Не красиво ((( Я просто убедится хотел есть ли другое решение

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

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

Сообщение Foenix » 11 окт 2013, 14:43

да все нормально, двигайся дальше)) тут считай, что это красиво)
R.id.team

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

Ответить