Проблема с использованием двух адаптеров в ListView

Интерфейс, диалоги, темы, стили, меню
Ответить
Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

Проблема с использованием двух адаптеров в ListView

Сообщение Coment » 19 сен 2012, 17:11

Здравствуйте.

Вот и возникла проблема, что уже мозг взрывает.
Activity по умолчанию создает ListView в который загружаются картинки из сети. Вот код адаптера который создает список и загружает объекты (main дам в конце)

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

public class LazyAdapter extends BaseAdapter {
    
    private Activity activity;
    private String[] data;
    private static LayoutInflater inflater=null;
    public ImageLoader imageLoader; 
    
    public LazyAdapter(Activity a, String[] d) {
        activity = a;
        data=d;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader=new ImageLoader(activity.getApplicationContext());
    }


    
    public int getCount() {
        return data.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }
    
    public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null)
            vi = inflater.inflate(R.layout.item, null);

        TextView text=(TextView)vi.findViewById(R.id.text);;
        ImageView image=(ImageView)vi.findViewById(R.id.image);
        text.setText(data[position]);
        imageLoader.DisplayImage(data[position], image);
        return vi;
    }
}
Я создал второй адаптер "заглушку" который просто отображает URL картинки и просто иконку (тут должны быть thumbnail-ы, но это пока оставлю). Он в сеть не лезет. Код второго адаптера

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

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

public class Adapter extends BaseAdapter {
	private Activity activity;
	private String[] data;
	private static LayoutInflater inflater = null;

	public Adapter(Activity a, String[] d) {

		activity = a;
		data = d;
		inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

	@Override
	public int getCount() {
		return data.length;
	}

	public Object getItem(int position) {
		return position;
	}

	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		View view = convertView;
		if (convertView == null)
			view = inflater.inflate(R.layout.item, null);

		TextView text = (TextView) view.findViewById(R.id.text);
		ImageView image = (ImageView) view.findViewById(R.drawable.stub);
		text.setText(data[position]);
		image.setImageResource(R.drawable.stub);
		return view;
	}
}
И теперь самое интересное main

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

import android.os.Bundle;
import android.app.Activity;

import android.view.View;

import android.widget.Button;
import android.widget.ListView;

public class MainActivity extends Activity {

	 ListView list;
	 Adapter adapter2;
	 LazyAdapter adapter;  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        list=(ListView)findViewById(R.id.list);
        Button b=(Button)findViewById(R.id.button1);
        Button d=(Button)findViewById(R.id.button2);
        adapter2=new Adapter(this, mStrings);
        list.setAdapter(adapter2);
       
    }
    @Override
    public void onDestroy()
    {
        list.setAdapter(null);
        super.onDestroy();
    }
    
        public void onClickStart (View arg0) {
        adapter=new LazyAdapter(this, mStrings);
        list.setAdapter(adapter);
        }
       
        public void onClickCache(View arg0) {
            adapter.imageLoader.clearCache();
            adapter.notifyDataSetChanged();
        }
    
    
    private String[] mStrings={// куча URL-ов... }
Вроде бы один адаптер должен по клику на "Start", смениться другим. Но- при запуске приложения не видно списка "заглушки",а после нажатия "Start-a", приложение вылетает
09-19 13:33:23.230: E/AndroidRuntime(776): FATAL EXCEPTION: main
09-19 13:33:23.230: E/AndroidRuntime(776): java.lang.NullPointerException
09-19 13:33:23.230: E/AndroidRuntime(776): at com.example3.loaderr.Adapter.getView(Adapter.java:46)
09-19 13:33:23.230: E/AndroidRuntime(776): at android.widget.AbsListView.obtainView(AbsListView.java:1430)
09-19 13:33:23.230: E/AndroidRuntime(776): at android.widget.ListView.makeAndAddView(ListView.java:1745)
09-19 13:33:23.230: E/AndroidRuntime(776): at android.widget.ListView.fillDown(ListView.java:670)


Но если убрать строчки 22, 23 в main то приложение работает, но опять же без списка "заглушки". Если сможете, помогите? или укажите где копать :)
Спасибо за внимание.

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

Re: Проблема с использованием двух адаптеров в ListView

Сообщение rezak90 » 19 сен 2012, 17:51

не смотрел код, конец рабочего, тяжело и всё такое)))
он же говорит что в методе getView в адаптере выскакивает NullPointerException. Проходи дебагером построчно.
R.id.team
Политика на форуме запрещена

Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

Re: Проблема с использованием двух адаптеров в ListView

Сообщение Coment » 19 сен 2012, 18:24

Итак есть сдвиги (честно, не знаю как дебаггером android проекты шерстить, есть опыт только с консольными java приложениями ) -- изменил в коде Adapter конструктор

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

public Adapter(Context context, String[] d) {

		ctx=context; 
		data = d;
		inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Подсмотрел с уроков этого сайта ;)
Теперь приложение запускается, кнопка "Start" запускает второй адаптер, но... Самый первый адаптер не срабатывает, тот что должен ListView формировать при запуске. Пустое окно с кнопками. Продолжаю "курить" дальше. Кстати наверное вынесу эту тему в отдельную ветку "Разработка", так как проект только в разгаре и помощь форумчан была -бы очень кстати :) Естественно я не собираюсь наглеть и клянчить помощь, но возможно кому-то будет интересно следить за разработкой проекта ранга(2) ( так вроде называл rezak90 ) и подавать правильные идеи.

Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

Re: Проблема с использованием двух адаптеров в ListView

Сообщение Coment » 19 сен 2012, 21:05

Увы, после перезагрузки eclipse и пере установки приложения, проблема вернулась :( Скорее всего ошибка в формировании списка в коде Adapter. Странно, что в коде LazyAdapter массив данных URL-ов передается в конструктор, а вот в простом Adaptere нет. Пока ума не приложу, что делать. Пойду смотреть футбол :(

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

Re: Проблема с использованием двух адаптеров в ListView

Сообщение rezak90 » 24 сен 2012, 15:03

Coment ну что решилась проблема?
R.id.team
Политика на форуме запрещена

Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

Re: Проблема с использованием двух адаптеров в ListView

Сообщение Coment » 25 сен 2012, 15:38

Ну что же, проблему решил - полностью переписал adapter

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

public class Adapter extends ArrayAdapter<String> {
    private final Context context;
    private final String[] values;
   
    public Adapter(Context context, String[] values) {
        super(context, R.layout.item, values);
        this.context = context;
        this.values = values;
    }

    static class ViewHolder {
        public ImageView imageView;
        public TextView textView;
    }
	 @Override
	  public View getView(int position, View convertView, ViewGroup parent) {
	       
	        ViewHolder holder;
	        View rowView = convertView;
	        if (rowView == null) {
	        	 LayoutInflater inflater = (LayoutInflater) context
	                     .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	            rowView = inflater.inflate(R.layout.item, null, true);
	            holder = new ViewHolder();
	            holder.textView = (TextView) rowView.findViewById(R.id.text);
	            holder.imageView = (ImageView) rowView.findViewById(R.id.image);
	            rowView.setTag(holder);
	        } else {
	            holder = (ViewHolder) rowView.getTag();
	        }

	        holder.textView.setText(values[position]);
	        holder.imageView.setImageResource(R.drawable.stub);

	    CheckBox cbBuy = (CheckBox) rowView.findViewById(R.id.chk);
	  
	    cbBuy.setTag(position);
	  
	    cbBuy.setChecked(false);
	    return rowView;
	  }
	 
}
Но возник вопрос (ох чувствую их буде еще много по проекту ;) ) - вот мини-код, где после срабатывания чекбокса, кнопка обнуления кеша стает видимой (Enabled). Когда галочка стоит, кнопка активируется, но после снятия чека - кнопка остается активной.

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

 cekk.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() {

			@Override
			public void onCheckedChanged(CompoundButton buttonView,
					boolean isChecked) {
				 cache.setEnabled(true);		
			}       
        });
Догадываюсь, что решение близко,но честно голова не варит сейчас, поэтому буду рад помощи-подсказки :)

P.S. Просьба к администрации форума переписать тему топика на "Проект - "Загрузчик изображений из Сети". Просто хотелось бы здесь по проекту вопросы задавать, а предыдущее название может сбивать с толку людей которые ищут решения проблем с адаптерами.
Последний раз редактировалось Coment 25 сен 2012, 15:55, всего редактировалось 1 раз.

Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

Re: Проблема с использованием двух адаптеров в ListView

Сообщение Coment » 25 сен 2012, 15:52

Вот что значить не спать ночью -- сам спросил и сам ответил про чекбокс.

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

public void onCheckedChanged(CompoundButton buttonView,
					boolean isChecked) {
				 
		        	  cache.setEnabled(cekk.isChecked());
		          
				}
			       
        });

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

Re: Проблема с использованием двух адаптеров в ListView

Сообщение rezak90 » 25 сен 2012, 15:54

а где же cache.setEnabled(false) ?
вот false и сделает не активной кнопку, а если вообще нужно скрыть её то юзай setVisibility()
R.id.team
Политика на форуме запрещена

Coment
Сообщения: 22
Зарегистрирован: 10 авг 2012, 16:27
Откуда: Ukraine, Lviv

Re: Проблема с использованием двух адаптеров в ListView

Сообщение Coment » 25 сен 2012, 15:57

setVisibility() - Эммм, это точно может пригодится для разнообразия интерфейса. Спасибо.

Ответить