[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日

相关文章

  • ajax的responseText乱码的问题的解决方法

    针对“ajax的responseText乱码的问题的解决方法”,我可以提供如下完整攻略: 一、问题描述 在实际项目中,使用ajax请求文本数据时,有时候会遇到responseText返回的数据乱码问题,尤其是返回的数据是非英文字符或非常见的编码格式时,这个问题会非常明显。这个问题的产生原因很可能是由于请求方和响应方的编码格式不一致,或者响应方没有正确设置字符…

    html 2023年5月31日
    00
  • 微信怎么设置添加我的方式 微信设置添加我的方式技巧

    以下是“微信怎么设置添加我的方式 微信设置添加我的方式技巧”的完整攻略: 微信怎么设置添加我的方式? 在微信中,可以通过以下方法设置添加我的方式: 进入“我”的页面:在微信主界面中,点击右下角的“我”按钮,进入“我”的页面。 进入“个人信息”页面:在“我”的页面中,点击头像或者昵称,进入“个人信息”页面。 进入“添加我的方式”页面:在“个人信息”页面中,点击…

    html 2023年5月18日
    00
  • 怎么激活2021最新office365?office365激活密钥+激活工具推荐

    为了保证您的计算机系统的安全性和合法性,我们不建议您使用非法的激活工具或者激活密钥。建议您购买正版的Office 365软件,以获得更好的使用体验和技术支持。 以下是使用激活密钥和激活工具激活Office 365的攻略: 步骤1:获取Office 365激活密钥 打开您的浏览器,访问Office 365官方网站(https://www.office.com/…

    html 2023年5月17日
    00
  • 小结下MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法第3/3页

    下面是关于“小结下MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法”的完整攻略: 1. 产生原因 MySQL中中文乱码主要是因为以下两个原因: MySQL默认字符集为latin1,而不是utf8。这导致MySQL无法正确存储和处理中文字符,从而出现乱码问题。 连接MySQL数据库时的字符集与MySQL数据库的字符集不匹配。如果P…

    html 2023年5月31日
    00
  • 流读取导致StringBuilder.toString()乱码的问题及解决

    下面我将详细讲解“流读取导致StringBuilder.toString()乱码的问题及解决”的完整攻略。 问题描述 在Java开发过程中,我们常常需要读取一些文本文件或者字符流,然后使用StringBuilder等类进行字符串的拼接,但是在进行toString()方法转换后,发现字符串出现了乱码。这是为什么呢? 造成这个问题的原因是,不同的编码格式所占用的…

    html 2023年5月31日
    00
  • Android字符串和十六进制相互转化出现的中文乱码问题

    在Android中进行字符串和十六进制之间的转换时,经常会遇到中文乱码的问题。这是由于在不同编码方式之间转换时,如果编码不匹配,就会出现乱码。下面是一些解决这个问题的方法: 1. 字符串和十六进制相互转换 下面的代码演示了如何将一个字符串转换为十六进制表示形式: String str = "hello world"; byte[] byt…

    html 2023年5月31日
    00
  • C#实现XML文件操作详解

    C#实现XML文件操作详解 什么是XML文件 XML(eXtensible Markup Language)是一种标记语言, 它不是一种编程语言,而是一种类似于 HTML 、CSS 的定义性标记语言。XML 文件包含了标签、属性、文本和注释等元素。 与 HTML 不同的是,XML 是一种通用的数据编码语言,它可以在网络上交换数据,具有跨平台、跨语言和扩展性等…

    html 2023年5月30日
    00
  • .net读写xml文档详解

    .NET读写XML文档详解 什么是XML文档 XML(Extensible Markup Language)是一种用于描述数据的标记语言。它可以定义各种自定义标记,用途非常广泛,与HTML不同,XML没有预定义的标记。 XML文档是一种可扩展的文本格式,可以支持从简单的数值,到复杂的结构数据存储。XML不仅可以用于数据交换,也可以用来表示数据结构。 .NET…

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