Страница 5 из 14

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

Добавлено: 11 апр 2013, 17:36
Artem
Artem писал(а):Добрый день!

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

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

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

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

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

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

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

android:clickable="true"
.

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

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

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

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

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

Добавлено: 05 май 2013, 14:17
xr0m
Нужна помощь... Не получается самостоятельно разобраться с логикой кастом адаптера.
Использую 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 снова не понятно, вторая запись логична, он свернул лист, и добавил один элемент в лист.
А вот первая запись, это из другого листа, который я вообще ниразу не трогал, зачем он пересоздал лист?!?

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

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

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

Добавлено: 04 июл 2013, 11:42
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)

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

Добавлено: 04 июл 2013, 11:56
klblk
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()

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

Добавлено: 04 июл 2013, 13:14
OctahedroN
Доброго времени суток.Помогите пожалуйста. Написал свой адаптер для галереи. Суть в том что в окне галереи должен отображаться 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, если в разметке я не нуждаюсь

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

Добавлено: 21 авг 2013, 00:44
Rix
Привет всем, столкнулся с одной проблемой.
Написал функцию которая получает 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, Ошибок в логе тоже нет.

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

Добавлено: 21 авг 2013, 03:15
rezak90
пройтись дебагом и посмотреть
P.S. кто учил так переменные называть?

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

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

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

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

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

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

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

Добавлено: 23 сен 2013, 14:29
vjick
Народ, помогите, уже голова взрывается.

Пытаюсь создать 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);


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

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

Добавлено: 23 сен 2013, 17:09
KamiSempai
Думаю, вы все сами поймете когда ответите мне на один вопрос.
parser.readXml(file) заполняет массив itemsArray или создает новый?

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

Добавлено: 30 сен 2013, 21:45
saband
Привет.

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 Деркачова Юлія
На практике:
Изображение

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

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

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

Добавлено: 11 окт 2013, 14:12
snowkam
добрый день.

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

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

Добавлено: 11 окт 2013, 14:31
Foenix
я не поняла про какую ты позицию в которую должен встать спиннер, но если ты имеешь ввиду выбранный элемент, то да, нужно в цикле перебрать, это не долго. По курсору только построчно можно перемещаться.

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

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

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

Добавлено: 11 окт 2013, 14:43
Foenix
да все нормально, двигайся дальше)) тут считай, что это красиво)