[Android] 通过GridView仿微信动态添加本地图片示例代码

下面我将为您详细讲解 “[Android] 通过GridView仿微信动态添加本地图片示例代码”的完整攻略。

1. 确定需求

在开始编写代码之前,我们需要明确自己的需求。本篇攻略的目的是通过GridView来仿照微信动态添加本地图片的功能。我们需要实现以下功能:

  • 显示本地图片的缩略图
  • 点击图片后可以查看其大图
  • 长按图片后可以删除该图片
  • 可以添加新的本地图片

2. 创建GridView布局

我们现在需要创建一个布局,用来显示我们的GridView。在XML文件中定义GridView,然后再为其创建一个adapter,将图片添加到GridView中。可以参考以下示例:

<GridView
    android:id="@+id/gridview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:numColumns="3"
    android:horizontalSpacing="10dp"
    android:verticalSpacing="10dp"
    android:stretchMode="columnWidth" />

接下来我们需要创建GridView的adapter。在adapter中,我们需要重写getView方法。可以参考以下示例:

public class GridImageAdapter extends BaseAdapter {
    private Context mContext;
    private List<String> mImages;

    public GridImageAdapter(Context context, List<String> images) {
        this.mContext = context;
        this.mImages = images;
    }

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

    @Override
    public Object getItem(int position) {
        return mImages.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 250));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }

        Glide.with(mContext).load(mImages.get(position)).into(imageView);
        return imageView;
    }
}

3. 为GridView添加图片

现在我们已经完成了GridView和adapter的创建,接下来我们需要将图片添加到GridView中。为了添加图片,我们可以创建一个按钮,并且在按钮点击后打开文件选择器,并选取需要添加的图片。具体实现可以参考以下示例:

private List<String> mImages = new ArrayList<>();
private GridImageAdapter mAdapter;

// 创建添加按钮,并且设置点击事件
findViewById(R.id.btn_add).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        startActivityForResult(intent, 1);
    }
});

// 在 onActivityResult 方法中处理选取的图片,将图片添加到集合中,并刷新 GridView
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        String path = getPath(this, data.getData());
        mImages.add(path);
        mAdapter.notifyDataSetChanged();
    }
}

// 获取文件的路径
public static String getPath(Context context, Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String filePath = cursor.getString(column_index);
    cursor.close();
    return filePath;
}

这里我使用了一个名为“btn_add”的按钮,当我们点击该按钮时,将会打开文件选择器,允许我们选择要添加的本地图片。然后在onActivityResult方法中,根据返回的Intent对象获取选择的文件路径,并将路径添加到mImages集合中,再刷新GridView即可。如此一来,我们已经实现了添加本地图片的功能。

4. 查看大图和删除图片

接下来,我们需要为GridView添加上 “查看大图” 和 “删除图片” 的功能。

查看大图

我们可以在adapter中,为每一个图片添加点击事件,并且在点击事件中跳转到显示大图的页面。具体实现可以参考以下代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ……
    imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(mContext, ImageActivity.class);
            intent.putExtra("imagePath", mImages.get(position));
            mContext.startActivity(intent);
        }
    });
    return imageView;
}

这里我创建了一个新的类名为ImageActivity,并将需要显示的图片路径通过Intent对象传递给ImageActivity。在ImageActivity中,我们可以将图片绘制到ImageView中,具体实现可以参考以下代码:

public class ImageActivity extends AppCompatActivity {
    private ImageView mImage;

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

        mImage = findViewById(R.id.image);

        String imagePath = getIntent().getStringExtra("imagePath");

        Glide.with(this).load(imagePath).into(mImage);
    }
}

删除图片

我们可以在adapter中,为每一个图片添加长按事件,并且在长按事件中弹出对话框,询问用户是否删除该图片。具体实现可以参考以下代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ……
    imageView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
            builder.setTitle("确认删除?");
            builder.setPositiveButton("是", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    mImages.remove(position);
                    mAdapter.notifyDataSetChanged();
                }
            });
            builder.setNegativeButton("否", null);
            builder.show();
            return true;
        }
    });
    return imageView;
}

这里我为ImageView添加了一个长按事件,并弹出对话框,询问用户是否删除该图片。在用户点击了“是”,并确定删除该图片后,我们可以通过mImages.remove(position)方法将该图片从数据源中删除,然后再调用mAdapter.notifyDataSetChanged()方法来刷新GridView即可。

至此,我们已经实现了“查看大图”和“删除图片”的功能,完成了我们的需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:[Android] 通过GridView仿微信动态添加本地图片示例代码 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述

    HTML5之SVG 2D入门1 – SVG(可缩放矢量图形)概述 什么是SVG SVG,全称Scalable Vector Graphics(可缩放矢量图形),是一种基于XML描述的二维图形格式。与位图(如JPEG和PNG)不同,SVG 是使用几何形状来描述图像,而不是像素阵列。这意味着 SVG 图像可以缩放到任何大小,而不会失去图像质量。 SVG基础语法 …

    html 2023年5月30日
    00
  • Java 将HTML转为XML的详细步骤

    将HTML转为XML的过程主要包括以下几个步骤: 通过Java的网络编程实现HTML的爬取 使用Jsoup库解析HTML 将解析后的HTML转化为XML 对XML进行操作,如存储、转换等 下面将通过两个示例详细讲解这个过程。 示例一: import java.io.IOException; import org.jsoup.Jsoup; import org…

    html 2023年5月30日
    00
  • Spring超详细讲解AOP面向切面

    Spring超详细讲解AOP面向切面 什么是 AOP? AOP(Aspect-Oriented Programming)面向切面编程,主要解决了OOP(Object-Oriented Programming)面向对象编程中的一些交叉问题。AOP使程序员能够将类似的功能从不同的对象中抽象出来,然后统一在一个位置进行管理和维护。AOP 所提供的机制被称为 “横切…

    html 2023年5月30日
    00
  • 常用HTML meta 标签属性(网站兼容与优化需要)

    HTML meta 标签可以用来提供关于HTML文档的元数据(meta data),其中包括对搜索引擎优化和网站兼容性的支持。这些属性是网站设计中至关重要的一部分,下面将详细讲解常用的HTML meta标签属性的攻略。 meta标签的基本语法 HTML meta 标签一般放在文档头部的head元素中,其基本语法如下: <head> <met…

    html 2023年5月30日
    00
  • 抖音短视频怎么拍最好?抖音视频拍摄技巧分享

    以下是“抖音短视频怎么拍最好?抖音视频拍摄技巧分享”的完整攻略: 抖音短视频怎么拍最好?抖音视频拍摄技巧分享 抖音是一款非常流行的短视频应用程序,用户可以通过抖音拍摄和分享自己的短视频。下面是一些抖音视频拍摄技巧,可以帮助用户拍摄出更好的短视频。 技巧1:选择好的拍摄场景 拍摄场景是拍摄好短视频的关键。用户需要选择一个有趣、有特色的场景,以便更好地吸引观众的…

    html 2023年5月18日
    00
  • PHP生成和获取XML格式数据的方法

    下面是关于”PHP生成和获取XML格式数据的方法”的完整攻略。 1. 什么是XML XML,全称可扩展标记语言,是一种用于传输和存储数据的标记语言,可用于表示任何大小和复杂度的文档和数据。XML被广泛应用于Web服务、移动应用程序和数据交换等领域。 2. 生成XML数据 在PHP中,我们可以使用DOMDocument类来生成和操作XML文档。 2.1 创建X…

    html 2023年5月30日
    00
  • JQuery AJAX 中文乱码问题解决

    JQuery AJAX 中文乱码问题解决 在使用jQuery的AJAX进行中文传输时,常常会遇到中文乱码的问题。本文将介绍如何解决JQuery AJAX 中文乱码问题。 问题分析 当使用jQuery的AJAX进行中文传输时,后端接收到的中文信息出现乱码,这是由于前后端编码不一致导致的。因此我们需要在客户端和服务端进行编码设置,以解决这个问题。 解决方案 客户…

    html 2023年5月31日
    00
  • 压缩文件打开是乱码的解决办法

    解决压缩文件打开是乱码的问题,需要考虑以下几个因素: 压缩文件本身是否损坏; 使用的解压软件是否兼容压缩文件格式; 是否使用了正确的解压密码。 下面我们就针对这些因素,给出解决方案: 第一步:检查压缩文件是否损坏 压缩文件在传输过程中可能会出现问题导致文件损坏,因此首先要检查文件是否完整且未被篡改。常用的文件损坏检测工具有HashCheck、QuickSFV…

    html 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部