如何在GridView中的imageView中添加click Listener?

问题描述 投票:0回答:3

我是新来的,我在Android中开发简单的Gallery App,所以我遇到了一些错误,然后我想和你分享。我的应用程序包含GridView与自定义布局和适配器,自定义布局包含两个imageViews,一个是图像是主图像,另一个是收藏夹图标.GridView有setOnItemClickListener方法,另一个Activity,但我想在收藏夹上添加onCLick方法ImageView的

当我运行应用程序时,我收到此错误:

android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick

custom_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<ImageView
    android:layout_width="300dp"
    android:layout_height="180dp"
    android:id="@+id/imageView"
    android:layout_marginTop="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:src="@drawable/xik_1"/>
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/favicon"
    android:src="@drawable/ic_favorite_black_24dp"
    android:layout_below="@id/imageView"
    android:layout_alignParentRight="true"
    android:layout_marginTop="-20dp"
    android:layout_marginRight="6dp"
    android:onClick="onClickViaMain"

    />

grid adapter.Java

public class GridAdapter extends BaseAdapter {
private int icons[];

// my images here
public int images[]={R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.xik_2,R.drawable.xik_3
        ,R.drawable.xik_1,R.drawable.xik_11,R.drawable.xik_12};

private Context context;
private String letters[];
private LayoutInflater inflater;

public GridAdapter(Context context){
    this.context=context;
    this.letters=letters;
    this.images=images;
}


@Override
public int getCount() {
    return images.length;
}

@Override
public Object getItem(int position) {
    return images[position];
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View gridView=convertView;
    if(convertView==null){
        // LayoutInflater
        inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        // my custom layout
        gridView=inflater.inflate(R.layout.custom_layout,null);
    }

    // images on the gridView (Android icon)
    ImageView imageView=(ImageView) gridView.findViewById(R.id.imageView);

    imageView.setImageResource(images[position]);

    return gridView;
}

}

main activity.Java

public class MainActivity extends AppCompatActivity {

GridView gridView;
GridAdapter gridAdapter;
ImageView fav;

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




    gridView=(GridView) findViewById(R.id.gridView1);

    // Adapter class
    gridAdapter=new GridAdapter(MainActivity.this);

    //initializing favourite icon
    fav=(ImageView)findViewById(R.id.favicon);
    gridView.setAdapter(gridAdapter);
    gridView.setFastScrollEnabled(true);

    // gridView setting click listener
    //goes another Activity
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent intent =new Intent(getApplicationContext(),SliderActivity.class);
            intent.putExtra("index",position);
            startActivity(intent);
        }
    });



}

public void onClickViaMain(View v){
    if (fav.isPressed()){
        Toast.makeText(getApplicationContext(),"Added to Favourites",Toast.LENGTH_SHORT).show();
    }

}

现在,我想在MainActivity上点击这个图像视图(收藏夹),你会建议我什么?

java android
3个回答
0
投票

好的,我有你的要求,按照这里的步骤

1. remove  android:onClick="onClickViaMain" from favicon imageView to avoid crash from xml layout

2. MainActivity extends AppCompatActivity implements View.OnClickListener {

@Override
public void onClick(View v) {
           // handle click  
      }            

// other code 
} 


3. public class GridAdapter extends BaseAdapter {
// other code 
View.OnClickListener listener;
public GridAdapter(Context context,View.OnClickListener listener){

    this.listener=listener;
    this.context=context;
    this.letters=letters;
    this.images=images;
}
// other code here

Inside getView Method of your Adapter do like below 

    // images on the gridView (Android icon)
    ImageView favicon=(ImageView) gridView.findViewById(R.id.favicon);

    favicon.setImageResource(images[position]);
    **favicon.setOnClickListener(listener);**



4. In Main Activity update line 

    gridAdapter=new GridAdapter(MainActivity.this);

    gridAdapter=new GridAdapter(MainActivity.this,MainActivity.this);


// because we implemented OnclickListener in MainActivity  and we are done  

0
投票

另一个解决方案是从MainActivity中删除onItemClick方法,并在GridAdapter中为图像视图实现onClick方法

看起来像

public class GridAdapter extends BaseAdapter {
private int icons[];

// my images here
public int images[] =
        {R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher,
                R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.xik_2,
                R.drawable.xik_3, R.drawable.xik_1, R.drawable.xik_11, R.drawable.xik_12};

private Context context;
private String letters[];
private LayoutInflater inflater;

public GridAdapter(Context context) {
    this.context = context;
    this.letters = letters;
    this.images = images;
}


@Override
public int getCount() {
    return images.length;
}

@Override
public Object getItem(int position) {
    return images[position];
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View gridView = convertView;
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    // my custom layout
    gridView = inflater.inflate(R.layout.custom_layout, null);
    // images on the gridView (Android icon)
    ImageView imageView = (ImageView) gridView.findViewById(R.id.imageView);
    ImageView favImage=(ImageView) gridView.findViewById(R.id.favicon);

    imageView.setImageResource(images[position]);
    favImage.setImageResource(images[position]);

    imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(context, SliderActivity.class);
            intent.putExtra("index", position);
            context.startActivity(intent);
        }
    });

    favImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(context, SliderActivity.class);
            intent.putExtra("index", position);
            context.startActivity(intent);
        }
    });

    return gridView;
}
}

试试这个


0
投票

试试这个

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

        ImageView favImage=(ImageView)view.findViewById(R.id.favImage);
        favImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Do your code
                Intent intent =new Intent(getApplicationContext(),SliderActivity.class);
                intent.putExtra("index",position);
                startActivity(intent);
            }
        });

    }
});

您可以像这样实现图像点击活动。希望这会对你有所帮助......如果你还有任何问题,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.