【问题标题】:GridView - open image in new activityGridView - 在新活动中打开图像
【发布时间】:2016-12-08 20:22:07
【问题描述】:

目前我的项目有一个 GridView,其中每个下都有图像和描述。单击图像时,它应该在一个新活动中打开,其中包含完整的图像和描述。

它目前在模拟器上运行良好,但 onclick 在真实设备上没有任何作用。

如果我在 MainActivity 中将 intent.putExtra("image", item.getImage()) 更改为 intent.putExtra("image", bitmap),它会打开新的辅助 DetailsActivity,但只显示文本而不显示图像。 Logcat 不会显示此更改的错误,只是说“java.lang.Integer 无法转换为 android.os.Parcelable”。

主活动:

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

    gridView = (GridView) findViewById(R.id.gridView);
    gridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, getData());
    gridView.setAdapter(gridAdapter);

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

            ImageItem item = (ImageItem) parent.getItemAtPosition(position);

                Intent intent = new Intent(MainActivity.this, DetailsActivity.class);
                intent.putExtra("title", item.getTitle());
                intent.putExtra("image", item.getImage());

            startActivity(intent);
        }
    });

}


private ArrayList<ImageItem> getData() {
    final ArrayList imageItems = new ArrayList();
    String[] itemsArray = getResources().getStringArray(R.array.grid_ids);

    TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids);
    for (int i = 0; i < imgs.length(); i++) {
        Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), imgs.getResourceId(i, -1));
        imageItems.add(new ImageItem(bitmap, itemsArray[i]));
    }
    return imageItems;
}

详情活动:

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

    Intent intent = getIntent();

    String title = getIntent().getStringExtra("title");
    Bitmap image = getIntent().getParcelableExtra("image");

    TextView titleTextView = (TextView) findViewById(R.id.title);
    titleTextView.setText(title);

    ImageView imageView = (ImageView) findViewById(R.id.image);
    imageView.setImageBitmap(image);

ImageItem 类:

public class ImageItem {

public Bitmap image;
public String title;

public ImageItem(Bitmap image, String title) {
    super();
    this.image = image;
    this.title = title;
}

public Bitmap getImage() {
    return image;
}

public void setImage(Bitmap image) {
    this.image = image;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

GridViewAdapter:

public class GridViewAdapter extends ArrayAdapter<ImageItem> {

private Context context;
private int layoutResourceId;
private ImageView imageView;
private ArrayList<ImageItem> data = new ArrayList<ImageItem>();

public GridViewAdapter(Context context, int layoutResourceId, ArrayList<ImageItem> data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    ViewHolder holder;

    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.imageTitle = (TextView) row.findViewById(R.id.text);
        holder.image = (ImageView) row.findViewById(R.id.image);

        row.setTag(holder);
    } else {
        holder = (ViewHolder) row.getTag();
    }

    ImageItem item = data.get(position);
    holder.imageTitle.setText(item.getTitle());
    holder.image.setImageBitmap(item.getImage());
    return row;
}

static class ViewHolder {
    TextView imageTitle;
    ImageView image;
}

图像(在 R.drawable 中)和描述在 strings.xml 中的两个字符串数组中列出。

【问题讨论】:

    标签: android gridview textview imageview


    【解决方案1】:

    为了使您的实现更容易,您可以通过以下构造函数让该图像模型对象具有图像资源 ID。

    public class ImageItem {
    
    public int image;
    public String title;
    
    public ImageItem(int image, String title) {
        // image means your image resource id
        this.image = image;
        this.title = title;
    }
    
    public int getImage() {
        return image;
    }
    
    public void setImage(int image) {
        this.image = image;
    }
    
    public String getTitle() {
        return title;
    }
    
    public void setTitle(String title) {
        this.title = title;
    }
    
    }
    

    在您的 onClick 方法中,您可以像下面这样操作

    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    
        ImageItem item = (ImageItem) parent.getItemAtPosition(position);
    
            Intent intent = new Intent(MainActivity.this, DetailsActivity.class);
            intent.putExtra("title", item.getTitle());
            // your image resource should be int
            intent.putExtra("imageId", item.getImage());
    
        startActivity(intent);
    }
    

    您的 DetailsActivity 将执行以下操作...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);
    
        Intent intent = getIntent();
    
        String title = getIntent().getStringExtra("title");
    
        // here -1 is the default value for, if that extra isn't found
        int image = getIntent().getIntExtra("imageId", -1);
    
        TextView titleTextView = (TextView) findViewById(R.id.title);
        titleTextView.setText(title);
    
        ImageView imageView = (ImageView) findViewById(R.id.image);
        imageView.setImageResource(image);
    

    【讨论】:

      【解决方案2】:

      有时,位图可能太大而无法编码和解码,或者在意图中作为字节数组传递。这可能会导致 OOM 或糟糕的 UI 体验。

      由于您只使用可绘制文件,而不是位图,您可以在模型类中使用 int 值:

      您可以在模型类中添加您的可绘制 ID,如下所示:

      imageItems.add(new ImageItem(imgs.getResourceId(0, -1), itemsArray[i]));

      在适配器中使用它时:

      holder.image.setImageResource(imgs.getResourceId(0, -1));

      您可以将此 int 发送到您的详细活动,然后您可以在那里设置:

      int imageId = getIntent().getExtras().getInt("image"); imageView.setImageResource(imageId);

      更新答案

      你的模型类:

      公共类 ImageItem {

      // 代替位图使用 int public int image;公共字符串标题;

      public ImageItem(int image, String title) { // 这里会显示你的资源 id this.image = image; this.title = 标题; }

      public int getImage() { 返回图片; }

      public void setImage(int image) { this.image = image; }

      public String getTitle() { 返回标题; }

      public void setTitle(String title) { this.title = title; }

      }

      在您的 MainActivity 中:

      gridView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) {

          ImageItem item = (ImageItem) parent.getItemAtPosition(position);
      
              Intent intent = new Intent(MainActivity.this, DetailsActivity.class);
              intent.putExtra("title", item.getTitle());
              intent.putExtra("image", item.getImage());
      
          startActivity(intent);
      }
      });
      

      私有 ArrayList getData() { final ArrayList imageItems = new ArrayList(); String[] itemsArray = getResources().getStringArray(R.array.grid_ids);

      TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids);
      for (int i = 0; i < imgs.length(); i++) {
      imageItems.add(new ImageItem(imgs.getResourceId(0, -1), itemsArray[i]));
      }
      return imageItems;
      

      }

      在您的 DetailsActivity 中:

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

      Intent intent = getIntent();
      
      String title = getIntent().getStringExtra("title");
      int image = getIntent().getExtras().getInt("image");
      
      TextView titleTextView = (TextView) findViewById(R.id.title);
      titleTextView.setText(title);
      
      ImageView imageView = (ImageView) findViewById(R.id.image);
      imageView.setImageResource(image);
      

      在你的适配器中:

      holder.image.setImageResource(imgs.getResourceId(0, -1));

      【讨论】:

      • 我尝试添加建议的第一行代码,但它为我提供了“将方法“ImageItem”的第一个参数从“Bitmap”更改为“Int”或“创建构造函数”的选项 -如果我创建一个构造函数,它会在 ImageItem.java ( public ImageItem(int resourceId, String title) { } ) 中创建它。我需要写resourceId 和String 标题吗?将第2行代码复制到GridViewAdapter时,imgs变成红色,options-创建局部变量'imgs',创建字段'imgs',创建参数'images'还是重命名引用?
      • 第三行代码,imageView变成红色,options是创建局部变量,将ImageView图像视图带入作用域,创建字段,创建参数,重命名引用。我是编程新手,还不知道如何正确应用它。我仍然收到一个不起作用的代码。谢谢。
      • 嗨,我已经通过在上一个答案之后发布更新的答案来回复评论。它张贴在标题“更新的答案”下。请检查答案,让我知道它是否适合您。
      猜你喜欢
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      相关资源
      最近更新 更多