2013-04-25 2 views
1

Я создал список фрагментов, который имеет строки, каждая строка имеет изображение, имя и номер телефона. сделал все, что касается адаптера и загрузчика списков ... я успешно загрузил список сначала с изображениями по умолчанию, а затем после загрузки и отображения его на экране я хочу загрузить контактное изображение из Интернета, поэтому я создал класс, расширяющий асинтекс и в то время как создавая каждую строку i, выполненную этим классом. дело в том, что можно сказать, что у нас есть номер телефона «1234», и я хочу, чтобы строка, у которой есть этот номер, имеет определенную фотографию, я быстро прокручиваю список, фотография многих изменений строк. Любая помощь? вот мой код:Android ListFragment, Adapter, ImageView, AsyncTask

класс Adapter:

package Adapters; 


import java.util.List; 

import com.inneed.R; 

import Classes.Contacts; 
import Classes.LoadImage; 
import android.content.Context; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 

public class ContactsAdapter extends ArrayAdapter<Contacts> { 
    private final LayoutInflater mInflater; 
    public ContactsAdapter(Context context) { 
     super(context, android.R.layout.simple_list_item_2); 
     mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    public void setData(List<Contacts> data){ 
     clear(); 
     if (data!=null) { 
      for (Contacts appEntry : data){ 
       add(appEntry); 
      } 
     } 
    } 
    @Override 
    public View getView (int position, View convertView, ViewGroup parent){ 
     View view; 
     if (convertView == null){ 
      view = mInflater.inflate(R.layout.contactrow, parent,false); 
     }else { 
      view = convertView; 
     } 
     Contacts item = getItem(position); 
     TextView Name = (TextView) view.findViewById(R.id.CRName); 
     Name.setText(item.getName()); 
     TextView Mobile = (TextView) view.findViewById(R.id.CRNumber); 
     Mobile.setText(item.getMobile()); 
     if (Mobile.getText().equals("1234")) 
     { 
      Log.i("MobileXXX",item.getMobile()); 
      new LoadImage(view).execute("http://image10.bizrate-images.com/resize?sq=60&uid=2216744464"); 
     } 
     if (position%2==0) 
     { 
      view.setBackgroundResource(R.drawable.list_background); 
     } 
     else view.setBackgroundResource(R.drawable.list_background2); 
     return view; 
    } 
} 

нагрузки класса Image AsyncTask:

package Classes; 

import java.io.InputStream; 

import com.inneed.R; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.view.View; 
import android.widget.ImageView; 

public class LoadImage extends AsyncTask<String, Void, Bitmap>{ 
     private View view; 
     public LoadImage(View view) { 
      this.view = view; 
     } 

     protected Bitmap doInBackground(String... urls) { 
      String urldisplay = urls[0]; 
      Bitmap mIcon11 = null; 
      try { 
      InputStream in = new java.net.URL(urldisplay).openStream(); 
      mIcon11 = BitmapFactory.decodeStream(in); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return mIcon11; 
     } 

     protected void onPostExecute(Bitmap result) { 
      ImageView Img = (ImageView) view.findViewById(R.id.imageView1); 
      Img.setImageBitmap(result); 
      this.cancel(true); 
     } 

} 

ListFragment Класс:

import java.util.List; 
import Adapters.ContactsAdapter; 
import Adapters.FavContactsDataListLoader; 
import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.support.v4.app.LoaderManager; 
import android.support.v4.content.Loader; 
import android.view.View; 
import android.widget.ListView; 
import Classes.Contacts; 

public class FavContactsTab extends ListFragment implements LoaderManager.LoaderCallbacks<List<Contacts>> { 
    ContactsAdapter mAdapter; 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState){ 
     super.onActivityCreated(savedInstanceState); 
     mAdapter = new ContactsAdapter(getActivity()); 
     setListAdapter(mAdapter); 
     setListShown(false); 
     getLoaderManager().initLoader(0, null, this); 
    } 
    @Override 
    public Loader<List<Contacts>> onCreateLoader(int arg0, Bundle arg1) { 
     // TODO Auto-generated method stub 
     return new FavContactsDataListLoader(getActivity()); 
    } 
    @Override 
    public void onLoadFinished(Loader<List<Contacts>> arg0, List<Contacts> data) { 
     mAdapter.setData(data); 
     if (!isResumed()) { 
      getLoaderManager().restartLoader(0, null, this); 
      setListShown(true); 
      setListShownNoAnimation(true); 
     } 
     else { 
      setListShown(true); 
      setListShownNoAnimation(true); 
     } 

    } 
    @Override 
    public void onLoaderReset(Loader<List<Contacts>> arg0) { 
     mAdapter.setData(null); 

    } 
    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     // Insert desired behavior here. 
    } 
} 

ответ

0

Android является повторное использование просмотров в ListViews. Обычно он создает только n + 1 просмотров, а n - количество видимых на экране видов. При прокрутке исчезающий вид будет повторно использоваться в качестве следующего видимого вида. По крайней мере, это то, что происходит, когда вы используете convertView в методе getView(), и это именно то, что вы делаете.

Теперь, когда это происходит, и ваша программа LoadImage AsyncTask все еще работает, она изменит представление, которое было первоначально отображено в другую позицию в представлении. Еще хуже, что вы запустите второй LoadImage, и два будут изменять один и тот же вид, но с разными изображениями.

Что вам нужно сделать, так это либо не использовать convertView, либо запретить LoadImage изменять вид после его завершения. Один простой способ сделать это - использовать view.setTag (position) в представлении. LoadImage может читать и сохранять тег позиции в своем конструкторе и до того, как вы снова измените представление в представлении позиции. Если он изменился, представление было повторно использовано для другой позиции и не должно быть изменено. Я уверен, что есть много других способов добиться того же и, возможно, более умных, но это должно дать вам некоторые идеи.

+0

Спасибо, я попробую, когда вернусь домой: D – Xing

+0

Спасибо, я удалил convertview, и это сработало! – Xing

Смежные вопросы