如何使用Picasso for Android创建交互式GridView?

时间:2014-05-08 20:20:51

标签: android eclipse picasso

您好我正在尝试使用毕加索使用来自在线存储库的图片创建GridView。 我还希望用户能够点击图像并加载全屏以进行查看。

到目前为止,我已经设法让它几乎完美地运作。唯一的问题是,当他们点击网格时显示的图像不是他们点击的图像,事实上它每次都会随机选择一个图像。

我希望有人能看看我的代码并告诉我哪里出错了。 感谢。

所以这是我的MainActivity类:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        GridView gv = (GridView) findViewById(R.id.grid_view);
        gv.setAdapter(new GridViewAdapter(this));


        gv.setOnItemClickListener(new OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> parent, View v,
                     int position, long id) {

                 // Sending image id to FullScreenActivity
                 Intent i = new Intent(getApplicationContext(), FullImageActivity.class);
                 // passing array index
                 i.putExtra("id", position);
                 startActivity(i);
             }
         });
     }
 }

这是我的GridView类:

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static android.widget.ImageView.ScaleType.CENTER_CROP;

final class GridViewAdapter extends BaseAdapter {

final Context context;
final List<String> urls = new ArrayList<String>();

public GridViewAdapter(Context context) {
this.context = context;

// Ensure we get a different ordering of images on each run.
Collections.addAll(urls, Info.URLS);
Collections.shuffle(urls);

// Triple up the list.
ArrayList<String> copy = new ArrayList<String>(urls);
urls.addAll(copy);
urls.addAll(copy);
}

@Override public View getView(int position, View convertView, ViewGroup parent) {
SquaredImageView view = (SquaredImageView) convertView;
if (view == null) {
  view = new SquaredImageView(context);
  view.setScaleType(CENTER_CROP);     
}

// Get the image URL for the current position.
String url = getItem(position);

// Trigger the download of the URL asynchronously into the image view.
Picasso.with(context) //
    .load(url) //
    .placeholder(R.drawable.placeholder) //
    .error(R.drawable.error) //
    .fit() //
    .into(view);

return view;
}

@Override public int getCount() {
return urls.size();
}

@Override public String getItem(int position) {
return urls.get(position);
}

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

最后是我的全屏类:

import com.squareup.picasso.Picasso;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ImageView;

public class FullImageActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.full_image);

    // get intent data
    Intent i = getIntent();

    // Selected image id
    int position = i.getExtras().getInt("id");
    GridViewAdapter ia = new GridViewAdapter(this);

    ImageView iv = (ImageView) findViewById(R.id.full_image_view);

    Picasso.with(this) //
    .load(ia.getItem(position)) //
    .placeholder(R.drawable.placeholder) //
    .error(R.drawable.error) //
    .fit()
    .centerCrop()//
    .into(iv);
}

}

3 个答案:

答案 0 :(得分:0)

我相信这是你的罪魁祸首:

Collections.addAll(urls, Info.URLS);
Collections.shuffle(urls);  // this reshuffles on every new instance

GridViewAdapter ia = new GridViewAdapter(this);  // your full screen activity is creating a new instance.

由于我还没有发表评论,答案是否定的。当你说startActivity时,它会创建一个FullScreenActivity的新实例,然后在那个FullScreenActivity中你也会实例化一个新的适配器,而后者又会进行随机播放。< / p>

如果您有疑问,请加入断点。

答案 1 :(得分:0)

你出于某种原因重新初始化了适配器GridViewAdapter ia = new GridViewAdapter(this);这就是在构造函数中发生重排的时候。

您的第二个活动中不应该有适配器。适配器用于列表。您只需将该活动传递给图片网址。

    GridView gv = (GridView) findViewById(R.id.grid_view);
    GridViewAdapter adapter = new GridViewAdapter(this);
    gv.setAdapter(adapter);
    gv.setOnItemClickListener(new OnItemClickListener() {
         @Override
         public void onItemClick(AdapterView<?> parent, View v,
                 int position, long id) {

             // Sending image url to FullScreenActivity
             Intent i = new Intent(getApplicationContext(), FullImageActivity.class);

             i.putExtra("url", adapter.getItem(position));
             startActivity(i);
         }
     });

public class FullImageActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.full_image);

    // get intent data
    Intent i = getIntent();

    string url = i.getExtras().getString("url");

    ImageView iv = (ImageView) findViewById(R.id.full_image_view);

    Picasso.with(this) //
        .load(url) //
        .placeholder(R.drawable.placeholder) //
        .error(R.drawable.error) //
        .fit()
        .centerCrop()//
        .into(iv);
    }

}

答案 2 :(得分:0)

您正在创建适配器两次 - 一次在MainActivity中,第二次在FullImageActivity中。每次创建洗牌,这都是原因。从毕加索样品btw好的复制粘贴;)