2014-09-24 60 views
-1
  1. 我在自定义适配器中通过Picasso Library加载图像,然后将其显示在我的ListFragment中。当我尝试滚动时,某些图像更改顺序(我认为重复使用单元格是错误的)。
  2. 什么是异步下载图像的最佳地点?我使用viewholder在自定义适配器中执行此操作。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

SOLUTION: 更改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

通常,当从Internet上加载东西时,我使用了一个AsyncTask。它可以防止视图不应该被关注的阻塞和分离任务。见[AsyncTask](http://developer.android.com/reference/android/os/AsyncTask.html) – 2014-09-25 09:53:27

+0

@Remymoan毕加索正在做后台工作。如上所述,我可以使用AsyncTask制作自己的图片下载器。但问题是我应该在哪里放置我的后台任务? – pardnoj 2014-09-25 12:53:03

+1

你可以把它放在一个单独的类文件中。我没有使用Picasa,但我认为Picasa已经在后台为您加载。如果是这样的话,你应该没问题。 – 2014-09-25 12:56:26