可点击图片的Listview,无法打开其他活动

Listview of clickable images, unable to open other activities

[已编辑]我想制作一个图像列表视图,单击它们时应该打开另一个 activity(每个可单击的单独 activity)但是 setOnItemClickListener 不工作。

这是我的主Activity.java

package com.example.priyanshu.justforfun;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

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


        final ArrayList<Block> blocks = new ArrayList<Block>();

        blocks.add(new Block(R.drawable.one,R.drawable.two));
        blocks.add(new Block(R.drawable.three,R.drawable.four));
        blocks.add(new Block(R.drawable.five,R.drawable.six));
        blocks.add(new Block(R.drawable.seven,R.drawable.eight));
        blocks.add(new Block(R.drawable.nine,R.drawable.ten));

        ImageAdapter adapter = new ImageAdapter(MainActivity.this, blocks, R.color.gray);

        ListView listView = (ListView) findViewById(R.id.list);

        listView.setAdapter(adapter);


        listView.setOnItemClickListener(
                new AdapterView.OnItemClickListener()
                {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view,
                                            int position, long id) {
                        Intent intent = new Intent(MainActivity.this,DemoActivity.class);
                        startActivity(intent);
                    }
                }
        );

这是Imageadapter.java-

public class ImageAdapter extends ArrayAdapter<Block> {

    private int mColorResourceId;

    public ImageAdapter(Activity context, ArrayList<Block> words, int colorResourceId) {
        super(context, 0, words);
        mColorResourceId = colorResourceId;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Check if the existing view is being reused, otherwise inflate the view
        View listItemView = convertView;
        if (listItemView == null) {
            listItemView = LayoutInflater.from(getContext()).inflate(
                    R.layout.list_item, parent, false);
        }

        Block currentBlock = getItem(position);

         ImageButton iconView1 = (ImageButton) listItemView.findViewById(R.id.im1);
         ImageButton iconView2 = (ImageButton) listItemView.findViewById(R.id.im2);

        iconView1.setImageResource(currentBlock.getImage1ResourceId());
        iconView2.setImageResource(currentBlock.getImage2ResourceId());

        return listItemView;
    }

}

这是Block.java-

public class Block {

    private int mImage1ResourceId = NO_IMAGE_PROVIDED;
    private int mImage2ResourceId = NO_IMAGE_PROVIDED;

    private static final int NO_IMAGE_PROVIDED = -1;

    public Block(int Image1ResourceId ,int Image2ResourceId) {
        mImage1ResourceId = Image1ResourceId;
        mImage2ResourceId = Image2ResourceId;
    }

    public int getImage1ResourceId(){  return mImage1ResourceId;}

    public int getImage2ResourceId(){  return mImage2ResourceId;}
}

这是List_item.xml

    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="150dp"
    android:id="@+id/list_item">
    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:scaleType="centerCrop"
        android:src="@drawable/background_splash"
        android:id="@+id/im1"
        />
    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:scaleType="centerCrop"
        android:src="@drawable/background_splash"
        android:id="@+id/im2" />
</LinearLayout>

只有 6 张图像不应该占用您的内存空间。我在这里看到的唯一问题是你的图片大小。

您是否创建了文件大小合适的可绘制文件夹?

正如 CommonsWare 所说:

You are trying to allocate 74649612 bytes. This is equivalent to a 8640 x 8640-pixel image. This is much too large.

您必须在可绘制对象中使用尺寸小得多的图像,因为这会分配太多内存。此外,您可以使用 Glide/Picasso 加载您的 Images.Glide 处理位图解码,磁盘缓存有效地确保更少的内存分配并避免内存不足错误。

为了在您的项目中使用 Glide,首先,将其添加到应用 gradle 文件中的依赖项:

repositories {
     mavenCentral() // jcenter() works as well because it pulls from Maven Central
}

dependencies {

    compile 'com.github.bumptech.glide:glide:3.7.0'
    compile 'com.android.support:support-v4:xx.x.x'  // According to your compileSdkVersion

}

在你的 getView() 里面:

替换:

 iconView1.setImageResource(currentBlock.getImage1ResourceId());
 iconView2.setImageResource(currentBlock.getImage2ResourceId());

搭配:

 Glide.with(context)
                .load(currentBlock.getImage1ResourceId())
                .placeholder(R.drawable.placeholder)   //Use low res image as placeholder
                .error(R.drawable.imagenotfound)      //Use low res image as error image
                .into(iconView1);

 Glide.with(context)
                .load(currentBlock.getImage2ResourceId())                   
                .placeholder(R.drawable.placeholder)
                .error(R.drawable.imagenotfound)
                .into(iconView2);

要在点击不同的项目时打开不同的活动,请使用以下代码:

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

                if(position == 0){
                   Intent i = new Intent(MainActivity.this, NextActivity1.class);
                   startActivity(i);
                }
                else if(position == 1){
                   Intent i = new Intent(MainActivity.this, NextActivity2.class);
                   startActivity(i);
                }
                // Do as above for rest of the positions
            }
        }); 

我认为它发生在图片上。您需要使用位图或任何库加载高分辨率图像。或者为了简单的方法,将图像添加到 drawable nodpi 目录。它不会缩放图像。