2014-09-24 3 views
-1
  1. Загружайте изображения через библиотеку Picasso в свой пользовательский адаптер, а затем показывайте их в своем списке. Когда я пытаюсь прокручивать, некоторые из изображений меняют порядок (я думаю, что это неправильно с повторным использованием ячеек).
  2. Какое место лучше всего загружать асинхронно? Я делаю это в своем пользовательском адаптере с помощью зрителя.listview изменения порядка

    public class PostsAdapter extends BaseAdapter { 
    private static final String TAG = "tag.example.tag"; 
    private static final String URL_PREFIX = "http://someapi.com/v1/api/"; 
    private Context mContext; 
    private ArrayList<Post> mData; 
    private static LayoutInflater inflater = null; 
    
    public PostsAdapter(Context context, ArrayList<Post> data) { 
        mContext = context; 
        mData = data; 
        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) 
    } 
    
    @Override 
    public boolean isEnabled(int position) { 
        return true; 
    } 
    
    @Override 
    public int getCount() { 
        return mData.size(); 
    } 
    
    @Override 
    public Object getItem(int i) { 
        return i; 
    } 
    
    @Override 
    public long getItemId(int i) { 
        return i; 
    } 
    
    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
        View v = view; 
        ViewHolder holder = null; 
        if(view == null) 
        v = inflater.inflate(R.layout.post_listviewrow, null); 
    
        holder = new ViewHolder(); 
    
        holder.imageView = (ImageView) v.findViewById(R.id.imageView); 
    
        Post post = (Post) mData.get(i); 
        // Download image with Picasso 
        holder.imageView.setTag(post.getPictureUrl()); 
        Picasso.with(mContext).load(URL_PREFIX + post.getPictureUrl()).into(holder.imageView); 
        return v; 
    } 
    
        static class ViewHolder { 
        TextView titleTextView; 
        ImageView imageView; 
        } 
    } 
    

ответ

1

РЕШЕНИЕ: Метод Измененное GetView к чему-то вроде этого

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 

    final ViewHolder holder; 

    if(view == null) { 
     view = inflater.inflate(R.layout.post_listviewrow, null); 
     holder = new ViewHolder(); 
     holder.imageView = (ImageView) view.findViewById(R.id.imageView); 
     holder.titleTextView = (TextView) view.findViewById(R.id.textview); 
     holder.progressBar = (ProgressBar) view.findViewById(R.id.progressBar); 


     view.setTag(holder); 
    } else { 
     holder = (ViewHolder) view.getTag(); 
    } 
     // Get position 
     Post post = (Post) mData.get(i); 

     holder.titleTextView.setText(post.getTitle()); 
     Picasso picasso = Picasso.with(mContext); 
     picasso.setIndicatorsEnabled(true); 
     holder.progressBar.setVisibility(View.VISIBLE); 
     picasso.load(URL_PREFIX + post.getPictureUrl()) 
       .placeholder(R.drawable.placeholder) 
       .fit() 
       .centerCrop() 
       .into(holder.imageView, new Callback() { 
        @Override 
        public void onSuccess() { 
         holder.progressBar.setVisibility(View.GONE); 
        } 
        @Override 
        public void onError() {} 
     }); 

    return view; 
} 
static class ViewHolder { 

    TextView titleTextView; 
    ImageView imageView; 
    ProgressBar progressBar; 

} 

Во всяком случае, Вы думаете, что адаптер является правильным местом для размещения задач загрузки?

+1

Обычно, когда дело доходит до загрузки вещей из Интернета, я использую AsyncTask. Он предотвращает блокировку и разделяет задачи, которые не следует рассматривать в представлении. См. [AsyncTask] (http://developer.android.com/reference/android/os/AsyncTask.html) –

+0

@ Ремимоан Пикассо выполняет фоновое задание. Я могу сделать свой собственный загрузчик изображений с помощью AsyncTask, как вы упомянули выше. Но вопрос в том, где я должен поставить свои фоновые задачи? – pardnoj

+1

Вы можете просто поместить его в отдельный файл класса. Я не работал с Picasa, но я предполагаю, что Picasa уже загружает его в фоновом режиме для вас. Если это так, вы должны быть в порядке. –