2014-09-24 68 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