Страница 1 из 1

Кастомный адаптер

Добавлено: 23 сен 2014, 09:25
Rikolo
Здравствуйте. Помогите пожалуйста разобраться в моём вопросе. Сижу над этим адаптером 5 суток уже 6 пошли.

Я создал кастомный адаптер , но он неправильно работает.
1.При добавлении строк которые уходят с видимой части экрана , все строки в массиве , начинают беспорядочно менять значение.
2.Адаптер ,добавляет в ListView TextView с низу списка, а не так как у ArrayList<String> с верху списка.

Привожу код адаптера :

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

import java.util.ArrayList;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;


public class BoxAdapter extends BaseAdapter {

	  Context ctx;
	  LayoutInflater lInflater;
	  ArrayList<String> objects;			  
	  String tolo2="---";
	  TextView tvDescr;
//----------------------------------- Конструктор -------------------	  
	  BoxAdapter(Context context, ArrayList<String> catnames2) {
	    ctx = context;
	    objects = catnames2;	   
	    lInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	  }
 //------------------------------------------------------
	  // кол-во элементов
	  @Override
	  public int getCount() {
	    return objects.size();
	  }
	  // элемент по позиции
	  @Override	  
	  public Object getItem(int position) {
	    return objects.get(position);
	  }
	  // id по позиции
	  @Override
	  public long getItemId(int position) {
	    return position;
	  }
//------------------------------------------------------
////////////////	  
	  // пункт списка
	  @Override
	  public View getView(int position, View convertView, ViewGroup parent)
	  {     
	    View view = convertView;
	    if (convertView == null) 
	    {
	      view = lInflater.inflate(R.layout.item2, parent, false);
	      Log.i("Лог массива getCount() - "+getCount() ,tolo2);
	      ((TextView) view.findViewById(R.id.tvDescr)).setText((CharSequence) objects.get(0));
	    }
	    return view;
	  }
////////////////
	}
При нажатии на кнопку , адаптер должен выводить строку "Hello" с цифрой . Цифра должна увеличиваться с каждой добавленной строкой. Но как строк становится больше чем помещается на экране , они начинают беспорядочно заполнять список.
Видео :

http://www.youtube.com/watch?v=4PxIcJiJ ... e=youtu.be


Спасибо.

Re: Кастомный адаптер

Добавлено: 23 сен 2014, 10:14
klblk
Rikolo писал(а):1.При добавлении строк которые уходят с видимой части экрана , все строки в массиве , начинают беспорядочно менять значение.
2.Адаптер ,добавляет в ListView TextView с низу списка, а не так как у ArrayList<String> с верху списка.
1. Вынести за пределы условия (convertView == null) эту строчку:
[syntax=java]((TextView) view.findViewById(R.id.tvDescr)).setText((CharSequence) objects.get(0));[/syntax]
Чтобы понять зачем это нужно делать, нужно понять что такое convertView и вообще как работает ListView.
2. Непонятно, что имеется ввиду.

Re: Кастомный адаптер

Добавлено: 23 сен 2014, 11:20
Foenix
Уточню ответ выше
Если знаешь английский:
http://www.youtube.com/playlist?list=PL ... VvOFB7fkLa
из этого плейлиста посмотри что касается листвью
а так же listView Optimization, где как раз разъясняется вопрос об вьюшках в адаптере.
http://www.youtube.com/watch?v=KHTi28zT ... VvOFB7fkLa

Уж больно классно человек рассказывает, понятно и повторяет так, что наизусть заучишь.

Re: Кастомный адаптер

Добавлено: 23 сен 2014, 11:24
Rikolo
klblk писал(а):
Rikolo писал(а):1.При добавлении строк которые уходят с видимой части экрана , все строки в массиве , начинают беспорядочно менять значение.
2.Адаптер ,добавляет в ListView TextView с низу списка, а не так как у ArrayList<String> с верху списка.
1. Вынести за пределы условия (convertView == null) эту строчку:
[syntax=java]((TextView) view.findViewById(R.id.tvDescr)).setText((CharSequence) objects.get(0));[/syntax]
Чтобы понять зачем это нужно делать, нужно понять что такое convertView и вообще как работает ListView.
2. Непонятно, что имеется ввиду.
Вынес строчку за пределы условия. Но теперь в ранее добавленных строках (TextView) не сохраняются текстовые значения.
Вот видео :
https://www.youtube.com/watch?v=aGPAlsb ... e=youtu.be
klblk писал(а):2. Непонятно, что имеется ввиду.
Нужно сделать что бы список сохранял порядок записаной в нём информации.
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
Hello 6
Hello 7
Hello 8
и дальше ............

Re: Кастомный адаптер

Добавлено: 23 сен 2014, 11:26
Rikolo
Foenix писал(а):Уточню ответ выше
Если знаешь английский:
http://www.youtube.com/playlist?list=PL ... VvOFB7fkLa
из этого плейлиста посмотри что касается листвью
а так же listView Optimization, где как раз разъясняется вопрос об вьюшках в адаптере.
http://www.youtube.com/watch?v=KHTi28zT ... VvOFB7fkLa

Уж больно классно человек рассказывает, понятно и повторяет так, что наизусть заучишь.
Спасибо за отзывчивость . Английский знаю не очень , могу переводить не с 100% точностью тексты .

Re: Кастомный адаптер

Добавлено: 23 сен 2014, 11:44
Foenix
попробуй все же посмотреть. Там он показывает очень много картинок и сто раз показывает что писать в коде.

Re: Кастомный адаптер

Добавлено: 23 сен 2014, 15:20
Rikolo
Foenix писал(а):попробуй все же посмотреть. Там он показывает очень много картинок и сто раз показывает что писать в коде.
Спасибо. Оказалось дело в
((TextView) view.findViewById(R.id.tvDescr)).setText((CharSequence) objects.get(position));
Порядок информационного потока сохраняется . Но информация добавляется с конца списка .
Пример:

Так добавляется:
1
2
3
4
5

Так нужно
5
4
3
2
1

Re: Кастомный адаптер

Добавлено: 24 сен 2014, 03:03
Rikolo
Всё сделал . Но теперь проблема ... Когда ставлю галочку в чекбоксе , она отрисовывется и на других четбоксах , которых не видно на экране в настоящий момент.

Re: Кастомный адаптер

Добавлено: 24 сен 2014, 08:19
klblk
Состояние чекбокса также нужно в getView определять.

Re: Кастомный адаптер

Добавлено: 24 сен 2014, 10:11
Rikolo
klblk писал(а):Состояние чекбокса также нужно в getView определять.
Реализовал. Но не на 100%
1.Для того что бы это реализовать , нужно прослушивать клики по CheckBox. С другого активити Я не могу понять как их можно слушать по этому принципу :
Тут мы прослушиваем клик по TextView .

/////////////////////// Обработка нажатия для ListView /////////////
listView1.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View itemClicked, int position,long id)
{
String SaySee3=" ";
Log.i("Привет position - "+position,SaySee3);
Log.i("Привет itemClicked - "+itemClicked,SaySee3);
Log.i("Привет parent - "+parent,SaySee3);
Log.i("Привет id - "+id,SaySee3);
}
});
//////////////////////////////////////////////////////////////////

Таким образом мы получим ID позиции в списке .
Но как подобное сделать по отнашению к CheckBox ?
Пождкажите пожалуйста.

Re: Кастомный адаптер

Добавлено: 24 сен 2014, 12:34
Foenix
наверное, вы уроки забросили читать
http://startandroid.ru/ru/uroki/vse-uro ... -list.html

Re: Кастомный адаптер

Добавлено: 24 сен 2014, 20:35
Rikolo
Foenix писал(а):наверное, вы уроки забросили читать
http://startandroid.ru/ru/uroki/vse-uro ... -list.html
Спасибо. Я сделал по-другому . Но обязательно и Ваш вариант рассмотрю.

Re: Кастомный адаптер

Добавлено: 25 сен 2014, 11:50
Rikolo
Foenix писал(а):наверное, вы уроки забросили читать
http://startandroid.ru/ru/uroki/vse-uro ... -list.html
Возможно там ошибка.
Так не работает

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

if (sbArray.get(key))
 Log.d(LOG_TAG,names[key] );
----------------------------------------------
Так рабтает

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

      String stri=" ";
		if (sbArray.get(key))		
	        Log.d(LOG_TAG+" "+names[key],stri );
	    }
----------------------------------------------
И в моём случаи это наверное не подаёдет . Потому что у меня отдельно нужно обрабатывать CheckBox а не метки , и TextView.
Разве что может быть наследовать от адаптера ArrayList и переопределять методы .


У меня 2-а массива , в один записываются текстовые данные String, в другой логические типа Boolean. Порядок записи производится синхронно. Читается так же.