在适配器外部更改gridVIew的imageView [英] Changing gridVIew's imageView outside of the adapter
问题描述
public static void changeView(Bitmap bmp,int pos){
GridView gridView = new GridView(mContext);
ImageView view =(ImageView)gridView.getChildAt(pos);
if(view == null)
Log.e(ImageAdapter Error,ImageView is null);
}
这是一个getView方法
@Override
public View getView(int position,View convertView,ViewGroup parent){
ImageView imageView;
if(convertView == null){
// imageView = Inflater.inflate(R.layout.image_layout,null);
imageView = new ImageView(mContext); (DefinedValues.width / 3 imageView.setLayoutParams(new GridView.LayoutParams
(DefinedValues.height / 4,DefinedValues.height / 4));
else
imageView.setLayoutParams(new GridView.LayoutParams
(DefinedValues.width / 3-5,DefinedValues.width / 3-5));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8,8,8,8);
} else {
imageView =(ImageView)convertView;
}
imageView.setImageResource(R.drawable.test3);
return imageView;
}
imageView每次都是空的。可以在静态类中设置Context对象mContext吗?
这是一个将适配器连接到gridView的片段类
public class fragment1 extends Fragment {
$ b $ * /(非Javadoc)
* @see android.support.v4.app.Fragment# onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle)
* /
GridView gridView;
@Override
public查看onCreateView(LayoutInflater inflater,ViewGroup容器,
//
Bundled savedInstanceState){
if(container == null){
Log.e(Null container,Null);
返回null;
}
Log.e(fragment1,fragment1 reached!);
View view = inflater.inflate(R.layout.menu1_fragment,container,false);
gridView =(GridView)view.findViewById(R.id.gridview1);
gridView.setAdapter(new ImageAdapter(this.getActivity()));
gridView.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent,View v,int position,long id){
ImageView imageView = new ImageView(getActivity());
LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams
(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
imageView.setLayoutParams(vp);
imageView.setImageBitmap(DefinedValues.imageContainer.get(position).getThumbnail());
getActivity()。addContentView(imageView,vp);
}
});
返回gridView;
$ b MyImage类
public void downloadThumbnail( ){ DefinedValues.thumbnail.put(activity,DefinedValues.images);
DefinedValues.thumbnail.put(type,thumbnail);
DefinedValues.thumbnail.put(name,this.name);
DefinedValues.thumbnail.put(width,DefinedValues.width +);
//创建请求到服务器
String req = Json.stringToJson(DefinedValues.thumbnail);
Log.d(TAG,downloadImage()called。Request to server:+ req);
DefinedValues.thumbnail.clear();
thumb = new ImageDownloader();
thumb.setListener(MyImage.this);
thumb.execute(req);
Log.d(TAG,下载缩略图编号+ imageCount);
$ public void returnImage(Bitmap res){
Log.d(TAG,设置缩略图...);
this.setThumbnail(res);
解决方案保存您需要应用的图像。当您需要更改特定 getView
行的图片时,请更改相应集合中的图片:
私人位图[] imgCollection;
@Override
public View getView(int position,View convertView,ViewGroup parent){
ImageView imageView;
if(convertView == null){
// imageView = Inflater.inflate(R.layout.image_layout,null);
imageView = new ImageView(mContext); (DefinedValues.width / 3 imageView.setLayoutParams(new GridView.LayoutParams
(DefinedValues.height / 4,DefinedValues.height / 4));
else
imageView.setLayoutParams(new GridView.LayoutParams
(DefinedValues.width / 3-5,DefinedValues.width / 3-5));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8,8,8,8);
} else {
imageView =(ImageView)convertView;
}
imageView.setImageBitmap(imgCollection [position]); //< - 已更改
返回imageView;
}
public void changeImageBitmap(Bitmap bmp,int pos){
imgCollection [pos] = bmp;
notifyDataSetChanged();此外,如果您不想放置冗余位图,则可以使用listview
}
在一个集合中,只需将它们加载为默认值,您就可以在 getView
中管理它,而不是:
if(imgCollection [position] == null){
imageView.setImageResource(R.drawable.test3);
} else {
imageView.setImageBitmap(imgCollection [position]); //< - changed
}
< blockquote>
可以在类static中设置Context对象mContext吗?
绝对没有。应该永远不需要这样做。如果上下文是静态的,它可能会阻止您的活动或其中的任何内容被垃圾收集。您的应用程序最终可能会因缺乏资源而崩溃。
How can I do it? This is the method in GridView adapter
public static void changeView(Bitmap bmp, int pos){
GridView gridView = new GridView(mContext);
ImageView view = (ImageView) gridView.getChildAt(pos);
if (view == null)
Log.e("ImageAdapter Error", "ImageView is null");
}
This is a getView method
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
// imageView = Inflater.inflate(R.layout.image_layout, null);
imageView = new ImageView(mContext);
if (DefinedValues.width/3 < DefinedValues.height/4)
imageView.setLayoutParams(new GridView.LayoutParams
(DefinedValues.height/4, DefinedValues.height/4));
else
imageView.setLayoutParams(new GridView.LayoutParams
(DefinedValues.width/3-5, DefinedValues.width/3-5));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(R.drawable.test3);
return imageView;
}
The imageView is null everytime. And is it ok to set Context object mContext in class static?
This is a fragment class that attaches adapter to gridView
public class fragment1 extends Fragment {
/* (non-Javadoc)
* @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)
*/
GridView gridView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
//
Bundle savedInstanceState) {
if (container == null) {
Log.e("Null container", "Null");
return null;
}
Log.e("fragment1", "fragment1 reached!");
View view = inflater.inflate(R.layout.menu1_fragment, container, false);
gridView = (GridView)view.findViewById(R.id.gridview1);
gridView.setAdapter(new ImageAdapter(this.getActivity()));
gridView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
ImageView imageView = new ImageView(getActivity());
LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams
(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
imageView.setLayoutParams(vp);
imageView.setImageBitmap(DefinedValues.imageContainer.get(position).getThumbnail());
getActivity().addContentView(imageView, vp);
}
});
return gridView;
}
}
MyImage class:
public void downloadThumbnail(){
DefinedValues.thumbnail.put("activity", DefinedValues.images);
DefinedValues.thumbnail.put("type", "thumbnail");
DefinedValues.thumbnail.put("name", this.name);
DefinedValues.thumbnail.put("width", DefinedValues.width + "");
//Creates request to server
String req = Json.stringToJson(DefinedValues.thumbnail);
Log.d(TAG, "downloadImage() called. Request to server: " + req);
DefinedValues.thumbnail.clear();
thumb = new ImageDownloader();
thumb.setListener(MyImage.this);
thumb.execute(req);
Log.d(TAG, "downloaded thumbnail nr." + imageCount);
}
public void returnImage(Bitmap res) {
Log.d(TAG, "Setting up thumbnail...");
this.setThumbnail(res);
}
解决方案 make a collection in your adapter to hold the images that you need applied. When you need to change the image of a specific getView
row, change in the image in the corresponding collection:
private Bitmap[] imgCollection;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
// imageView = Inflater.inflate(R.layout.image_layout, null);
imageView = new ImageView(mContext);
if (DefinedValues.width/3 < DefinedValues.height/4)
imageView.setLayoutParams(new GridView.LayoutParams
(DefinedValues.height/4, DefinedValues.height/4));
else
imageView.setLayoutParams(new GridView.LayoutParams
(DefinedValues.width/3-5, DefinedValues.width/3-5));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageBitmap(imgCollection[position]); // <-- changed
return imageView;
}
public void changeImageBitmap (Bitmap bmp, int pos) {
imgCollection[pos] = bmp;
notifyDataSetChanged(); // refresh the listview
}
moreover, if you're adverse to putting redundant bitmaps in a collection just to load them as a default value you could manage with this in getView
instead:
if (imgCollection[position] == null) {
imageView.setImageResource(R.drawable.test3);
} else {
imageView.setImageBitmap(imgCollection[position]); // <-- changed
}
is it ok to set Context object mContext in class static?
No absolutely not. there should never be a need to do this. if the context is static, it could stop your activity or anything in it from being garbage collected. Your app might eventually crash from lack of resources.
这篇关于在适配器外部更改gridVIew的imageView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!