如何在 android 中替换 gridview 中的单个图像?

How can i replace single image in gridview in android?

我有一个包含不同图像的网格视图。当我点击特定的 imageButton 时,它会下载并保存到我的 SD 卡文件夹中。完成下载后,从下载的文件夹中获取此图像并在另一个 activity 中打开,但我想替换特定的 gridview 单元格。

我完成了以下任务:

  1. 将图像保存到 SD 卡文件夹。
  2. 从 SD 卡文件夹中读取图像。
  3. 在另一个activity中打开。

但是如何替换特定的 gridview 单元格。

这是我的 watercolor_fragment.xml 它有 griview。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/black_overlay">

    <GridView
        android:id="@+id/gridview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:horizontalSpacing="10dp"
        android:verticalSpacing="10dp"
        android:numColumns="auto_fit"
        android:stretchMode="columnWidth" >
    </GridView>
</RelativeLayout>

这里是我的 Watercolor.java 充气 watercolor_fragment.xml

public class Watercolor extends Fragment {
    View view;
    String[] name={"FIRST","SECOND","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE","TEN","ELEVEN","TWELVE","THRTEEN","FOUREEN","FIFTEEN","SIXTEEN"};
    public int[] mThumbIds={R.drawable.natureone,R.drawable.naturetwo,
                                     R.drawable.naturethree,R.drawable.naturefour,
                                 R.drawable.naturefive,R.drawable.naturesix,
                                 R.drawable.natureseven,R.drawable.natureight,
            R.drawable.naturenine,R.drawable.natureten,R.drawable.natureleven,R.drawable.naturetwelve,
            R.drawable.naturethrtineen,R.drawable.naturefourthyeen,R.drawable.naturefifteen,R.drawable.naturesixteen};
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view=inflater.inflate(R.layout.watercolor_fragment, container, false);

        GridView gridView=(GridView)view.findViewById(R.id.gridview);
        gridView.setAdapter(new ImageAdapter(view.getContext(),name,mThumbIds));

//        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//            @Override
//            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//                Intent i=new Intent(getActivity(), FullImaeActivity.class);
//                Log.e("Position",""+position);
//                i.putExtra("id", position);
//                startActivity(i);
//            }
//        });
        return view;
    }
}

这里是我的 custome_image.xml,它在 gridview 的每个单元格上设置了 imageview 和 imageButton。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_gravity="center"
        android:layout_width="fill_parent"
        android:src="@drawable/naturefour"
        android:layout_height="fill_parent"/>

    <ImageButton
        android:id="@+id/btndownload"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/download"
        android:layout_gravity="top|right"
        android:background="@android:color/transparent"/>
</FrameLayout>

这里是我的ImageAdapter.java

public class ImageAdapter extends BaseAdapter {

    String[] name;
    Context context;
    int[] imageId;

    private static LayoutInflater inflater = null;

    public ImageAdapter(Context context,String[] name, int[] imageId) {
        this.name=name;
        this.context = context;
        this.imageId = imageId;
        inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

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

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

    public class Holder {
        ImageButton btnDownload;
        ImageView img;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        Holder holder = new Holder();
        final View rowView;

        rowView = inflater.inflate(R.layout.custome_image, null);
        holder.btnDownload = (ImageButton) rowView.findViewById(R.id.btndownload);
        holder.img = (ImageView) rowView.findViewById(R.id.imageView1);
        holder.img.setAdjustViewBounds(true);
        final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), imageId[position]);
        int height = (bitmap.getHeight() * 512 / bitmap.getWidth());
        Bitmap scale = Bitmap.createScaledBitmap(bitmap, 512, height, true);
        holder.img.setImageBitmap(scale);
        holder.btnDownload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    //File root = new File(context.getFilesDir(), "IMAGES");

                    File root = new File(Environment.getExternalStorageDirectory().getPath() + "/.IMAGES/");
                    if (!root.exists()) {
                        root.mkdirs();
                    }

                    File file = new File(root + File.separator + position + ".jpeg");
                    Log.e("Path", "" + file);
                    file.createNewFile();

                    FileOutputStream fos = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                    fos.flush();
                    fos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        holder.img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                Intent intent = new Intent(rowView.getContext(), FullImaeActivity.class);
//                intent.putExtra("id", position);

                try{
                    File root=new File(Environment.getExternalStorageDirectory().getPath() + "/.IMAGES/");

                    Log.e("File path",""+root);
                    File file=new File(root,File.separator+position+".jpeg");

                    if(!file.exists()){
                        Toast.makeText(rowView.getContext(), "Please, Download First!!!!", Toast.LENGTH_SHORT).show();
                    }
                    else{
                        Log.e("FINAL PATH", "" + file);

                        FileInputStream streamIn = new FileInputStream(file);

                        Bitmap bitmap = BitmapFactory.decodeStream(streamIn);
                        streamIn.close();
                        Intent intent=new Intent(rowView.getContext(),FullImaeActivity.class);
                        intent.putExtra("id", bitmap);
                        rowView.getContext().startActivity(intent);
                    }
                }
                catch (Exception e){
                    e.printStackTrace();
                }

            }
        });
        return rowView;
    }
}

这是我的 FullImageActivity.java

ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportActionBar().hide();
        setContentView(R.layout.activity_full_imae);
        mVisible = true;

        mContentView = findViewById(R.id.fullscreen_content);

        Intent intent=getIntent();
        Bitmap bitmap=(Bitmap)intent.getParcelableExtra("id");

        Watercolor adapter=new Watercolor();
        imageView=(ImageView)findViewById(R.id.full_image);
        //imageView.setImageResource(adapter.mThumbIds[id]);
        imageView.setImageBitmap(bitmap);
    }

请问如何解决,帮帮我!!!

你为什么不试试 imageloader.jar? 你所做的和你想做的一切都可以只用一个声明来代替。ImageLoader.getInstance().displayImage(imgUrl, holder.img);

尝试在此处查看 Universal Image Loader:the github url

特点:

  • 多线程图像加载(异步或同步)
  • ImageLoader 配置的广泛定制(线程执行器、下载器、解码器、内存和磁盘缓存、显示图像选项等)
  • 每个显示图像调用的许多自定义选项(存根图像、缓存开关、解码选项、位图处理和显示等) 内存中的图像缓存 and/or 磁盘(设备的文件系统或 SD 卡)
  • 监听加载过程(包括下载进度)

希望能帮到你!

好的,我会尝试给你一个快速的解决方案,但如果你想阅读 MVC,那将是很好的,你可以在其中将数据表示为 Java 对象。根据这些对象的状态,您将修改您的视图。这个想法是有一个字符串字段用于在目录中存储 img 的路径(sdcard/img)和一个 int 字段(R.id.img)。根据您的字符串字段的值,您可以使用它或从您的 int 字段中使用它。 例如

public class Img{
    String name;
    String imgSdCardPath;
    int imgResourceValue;
} 

然后您的适配器将对这些 Img 对象的列表进行操作。

而不是String[] name;int[] imageId; 列表在您的适配器中。

List<Img> imageList;

现在您需要一个逻辑来根据 getView() 方法中 String imgSdCardPath; 的值设置图像源。如果 imgSdCardPathIsPresent 使用下面的代码从 sdcard

获取文件
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeFile(photoPath, options);

否则做你正在做的事。

记得在将图像存储到 sdcard 时更新对象中的 imgSdCardPath,并调用适配器的 notififydatasetchanged。

[Android 开发者 url] (http://developer.android.com/training/displaying-bitmaps/process-bitmap.html)

下载任务时附加视图引用,并在任务完成时更新它。