GridView 表格里面的图片点击效果控制

Posted 峥嵘life

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GridView 表格里面的图片点击效果控制相关的知识,希望对你有一定的参考价值。

点击GridView的item默认会有背景变暗的效果,
但是没有设置成图片按下的效果,这个需要自己做适配,
网上查找了一下居然没有现成的示例,不过依靠牢固的基础工是可以完成的。

主要实现过程是通过Adapter中的getView回调,在View中进行onTouchEvent和onClick监听

一、效果图

这里只对部分item设置了点击图片可以有按下效果。
如果要点击Item要图片和文字都有按下效果也是可以参考一下我的代码进行适配的。

二、代码详解

1、布局文件

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

    <GridView
        android:id="@+id/gridView"
        android:layout_width="match_parent"
        android:numColumns="2"
        android:layout_height="300dp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/gridView"
        android:background="#0f0"
        android:gravity="center"
        android:onClick="jumpToActivity2"
        android:text="其他内容"
        android:textSize="30sp" />

</RelativeLayout>

这个比较简单,就一个网格布局。

2、重点的Adapter代码

AppGridViewAdapter2.java

package com.liwenzhi.viewpagerandrecycleview.adapter;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.liwenzhi.viewpagerandrecycleview.R;

import java.util.List;

/**
 * 用于GridView装载数据的适配器,适配图片点击按下效果
 */
public class AppGridViewAdapter2 extends BaseAdapter {
    static String TAG = "AppGridViewAdapter2";
    private List<CutBean> mList;// 定义一个list对象
    private Context mContext;// 上下文

    /**
     * 构造方法
     *
     * @param context 上下文
     * @param list    所有APP的集合
     */
    public AppGridViewAdapter2(Context context, List<CutBean> list) {
        mContext = context;
        mList = list;
    }

    public int getCount() {
        return mList.size();
    }

    public Object getItem(int position) {
        return mList.get(position);
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(
                    R.layout.app_item, parent, false);
            holder = new ViewHolder(convertView);
            // 在缓冲的View对象中添加holder标签
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        CutBean cutInfo = mList.get(position);
        holder.setData(cutInfo);
        return convertView;
    }

    // ViewHolder的使用,也是相当于缓冲的功能,避免重复的findViewById
    static class ViewHolder {
        TextView name;
        ImageView iv;

        // 传入的是一个布局重用的View对象
        public ViewHolder(View convertView) {
            // 冲缓冲中提取数据
            iv = (ImageView) convertView.findViewById(R.id.ivAppIcon);
            name = (TextView) convertView.findViewById(R.id.tvAppName);
        }

        // set方法,方便数据的显示,直接显示在屏幕中
        public void setData(CutBean bean) {
            iv.setImageResource(bean.getPictureId());
            name.setText(bean.getTitle());


            //需要自适配按下事件
            if (bean.getPicturePreId() != 0) {
                iv.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        Log.i(TAG, "event.getAction() = " + event.getAction());
                        if (event.getAction() == MotionEvent.ACTION_DOWN) {
                            iv.setImageResource(bean.getPicturePreId());
                        } else {
                            iv.postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    iv.setImageResource(bean.getPictureId());
                                }
                            }, 200);

                        }
                        return false;
                    }
                });
                //如果这里没有设置onClick事件,上面收到down事件,其他事件无法收到!!??
                //如果设置了onClick事件,会有个问题setOnItemClickListener收不到事件回调,只能自己写回调了
                iv.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (mCallback != null) {
                            mCallback.callback(bean.getTag());
                        }
                    }
                });
            }
        }
    }

    //定义回调接口
    public interface IImageClickCallback {
        void callback(String tag);
    }

    //定义回调对象
    static IImageClickCallback mCallback;

    /**
     * 暴露给外部的设置图片点击事件回调
     */
    public void setImageClickCallback(IImageClickCallback callback) {
        mCallback = callback;
    }

}

重点消化上面的代码。
如果要点击Item任何部位都有图片按下效果,对ViewHolder里面的convertView进行onTouch和onClick监听即可。

3、显示的Activity代码


package com.liwenzhi.viewpagerandrecycleview.activity;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;

import com.liwenzhi.viewpagerandrecycleview.R;
import com.liwenzhi.viewpagerandrecycleview.adapter.AppGridViewAdapter2;
import com.liwenzhi.viewpagerandrecycleview.adapter.CutBean;

import java.util.ArrayList;
import java.util.List;

/**
 * 普通的GridView
 * <p>
 * 设置图片点击后,设置按下效果
 */
public class Activity2 extends Activity {
    private static final String TAG = "Activity2";
    private static final int APP_NUM_COLUMNS = 4; //设置每行多少个
    private List<CutBean> mCutBeanList = new ArrayList<>();
    private AppGridViewAdapter2 mAdapter2;
    private GridView mGridView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "onCreate");
        initData();
        initViews();
        initEvent();
    }

    private void initData() {
        mCutBeanList.add(new CutBean("1", "插入1", R.mipmap.number1));
        mCutBeanList.add(new CutBean("2", "插入2", R.mipmap.number2));
        mCutBeanList.add(new CutBean("3", "插入3", R.mipmap.number3));
        mCutBeanList.add(new CutBean("4", "插入4", R.mipmap.number4));
        mCutBeanList.add(new CutBean("5", "插入5", R.mipmap.number5));
        mCutBeanList.add(new CutBean("6", "插入6", R.mipmap.number6));
        mCutBeanList.add(new CutBean("7", "插入7", R.mipmap.number7));
        mCutBeanList.add(new CutBean("8", "插入8", R.mipmap.number8));
        mCutBeanList.add(new CutBean("9", "插入9", R.mipmap.number9));
        mCutBeanList.add(new CutBean("10", "插入10", R.mipmap.number10));
        mCutBeanList.add(new CutBean("11", "插入11", R.mipmap.number11, R.mipmap.number11_pre));
        mCutBeanList.add(new CutBean("12", "插入12", R.mipmap.number12, R.mipmap.number12_pre));

    }

    public void initViews() {
        setContentView(R.layout.activity_main2);
        mGridView = findViewById(R.id.gridView);
        mAdapter2 = new AppGridViewAdapter2(this, mCutBeanList);
        mGridView.setNumColumns(APP_NUM_COLUMNS);//设置每行多少个
        mGridView.setAdapter(mAdapter2);
//        gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); //去除按下Item背景变暗的设置
    }

    private void initEvent() {
        //Item点击事件,
        mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(Activity2.this, "position = " + position + ",Tag = " + mCutBeanList.get(position).getTag(), Toast.LENGTH_LONG).show();
                doSomethingForTag(mCutBeanList.get(position).getTag());
            }
        });


        //图片点击事件
        mAdapter2.setImageClickCallback(new AppGridViewAdapter2.IImageClickCallback() {
            @Override
            public void callback(String tag) {
                Toast.makeText(Activity2.this, "ImageClick  Tag = " + tag, Toast.LENGTH_LONG).show();
                doSomethingForTag(tag);
            }
        });

        //说明一下:如果没设置按下效果的图片,那么只回调自带的OnItemClick事件
        //如果设置了按下效果图片,那么点击图片会回调创建的ImageClick事件,点击Item里面的文字,会回调自带的OnItemClick事件
        //任何时候只会回调OnItemClick事件或者OnItemClick事件其中一个,不会同时回调的情况。

    }

    //处理具体事务
    private void doSomethingForTag(String tag) {

    }


    //关闭界面
    public void jumpToActivity2(View view) {
        finish();
    }

}


item对应的Bean类


package com.liwenzhi.viewpagerandrecycleview.adapter;

/**
 * 实用工具表格列表Bean
 */
public class CutBean {
    private String tag;//标签,用于点击后获取对应位置
    private String title; //标题的资源id
    private int pictureId; //图片id
    private int picturePreId; //图片id

    public CutBean(String tag, String title, int pictureId) {
        this.tag = tag;
        this.title = title;
        this.pictureId = pictureId;
    }

    public CutBean(String tag, String title, int pictureId, int picturePreId) {
        this.tag = tag;
        this.title = title;
        this.pictureId = pictureId;
        this.picturePreId = picturePreId;
    }

    public String getTitle() {
        return title;
    }

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

    public int getPictureId() {
        return pictureId;
    }

    public void setPictureId(int pictureId) {
        this.pictureId = pictureId;
    }

    public String getTag() {
        return tag;
    }

    public void setTag(String tag) {
        this.tag = tag;
    }

    public int getPicturePreId() {
        return picturePreId;
    }

    public void setPicturePreId(int picturePreId) {
        this.picturePreId = picturePreId;
    }
}


到这里代码介绍完了。

代码就介绍到这里,需要具体代码可以进行下载。

代码下载链接:

https://download.csdn.net/download/wenzhi20102321/24341981

一般场景列表点击用默认的背景变暗就行,
但是有些特殊场景要图片按下效果比较好看,
比如我的实际场景是悬浮框里面的列表,并且没有文字的,
需要按下效果才好看,所以才需要去适配的。

共勉:人生短短几十年,好好珍惜吧。

以上是关于GridView 表格里面的图片点击效果控制的主要内容,如果未能解决你的问题,请参考以下文章

GridView的使用(高度封装,不怎么灵活,repeat可替代)

UWP入门--数据绑定用法

如何在excel表格内填充图片

word图片怎么排版整齐?

android之使用GridView+仿微信图片上传功能(附源代码)

在EXCEL的表格中如何批量插入不同内容的批注