如何在 android 中替换 gridview 中的单个图像?
How can i replace single image in gridview in android?
我有一个包含不同图像的网格视图。当我点击特定的 imageButton 时,它会下载并保存到我的 SD 卡文件夹中。完成下载后,从下载的文件夹中获取此图像并在另一个 activity 中打开,但我想替换特定的 gridview 单元格。
我完成了以下任务:
- 将图像保存到 SD 卡文件夹。
- 从 SD 卡文件夹中读取图像。
- 在另一个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)
下载任务时附加视图引用,并在任务完成时更新它。
我有一个包含不同图像的网格视图。当我点击特定的 imageButton 时,它会下载并保存到我的 SD 卡文件夹中。完成下载后,从下载的文件夹中获取此图像并在另一个 activity 中打开,但我想替换特定的 gridview 单元格。
我完成了以下任务:
- 将图像保存到 SD 卡文件夹。
- 从 SD 卡文件夹中读取图像。
- 在另一个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)
下载任务时附加视图引用,并在任务完成时更新它。