GridView是一种九宫格布局,创建Gridview的方式跟创建listview的差不多,GridView的子Item可以是文本,也可以是文本加图片,自行定义,只要在方法中添加就行。GridView加载本地图片可以直接用Drawable获取图片资源,但是如果想要加载网络图片的话,就得用异步任务,获取图片资源,然后再加载到GridView中。
首先先写一个类,声明Item里面的内容控件,这里我的Item中有3个TextView跟一个ImageView。
public ImageAndText(String imageUrl, String text,String text1,String text2) {
this.imageUrl = imageUrl;
this.text = text;
this.text1 = text1;
this.text2 = text2;
}
public String getImageUrl() {
return imageUrl;
}
public String getText() {
return text;
}
public String getText1() {
return text1;
}
public String getText2() {
return text2;
}
然后写一个adapter类,将控件写入到Adapter中,先创建一个List,再将控件放进去。
//创建adapter
public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts, GridView gridView1) {
super(activity, 0, imageAndTexts);
this.gridView = gridView1;
asyncImageLoader = new AsyncImageLoader();
}
//将对应的控件放入对应的资源文件
Drawable cachedImage = asyncImageLoader.loadDrawable(imageUrl,Tag,new ImageCallback() {
public void imageLoaded(Drawable imageDrawable, String imageUrl, String Tag) {
ImageView imageViewByTag = (ImageView) gridView.findViewWithTag(Tag);
if (imageViewByTag != null) {
imageViewByTag.setImageDrawable(imageDrawable);
}
}
});
if (cachedImage == null) {
imageView.setImageResource(R.drawable.longding);
}else{
imageView.setImageDrawable(cachedImage);
}
// Set the text on the TextView
TextView textView1 = viewCache.getTextView1();
textView1.setText(imageAndText.getText1());
TextView textView = viewCache.getTextView();
textView.setText(imageAndText.getText());
TextView textView2 = viewCache.getTextView2();
textView2.setText(imageAndText.getText2());
return rowView;
}
这里需要将xml中的Gridview重写一个类,然后引用这个类,重写的类继承Gridview。
public class Noscrollgridview extends GridView{
public Noscrollgridview(Context context,AttributeSet attrs) {
super(context,attrs);
}
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int mExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, mExpandSpec);
}
}
然后创建一个异步操作,开启新线程加载网络图片。
public Drawable loadDrawable(final String imageUrl,final String Tag, final ImageCallback imageCallback) {
if (imageCache.containsKey(imageUrl)) {
SoftReference<Drawable> softReference = imageCache.get(imageUrl);
Drawable drawable = softReference.get();
if (drawable != null) {
return drawable;
}
if(drawable == null){
}
}
final Handler handler = new Handler() {
public void handleMessage(Message message) {
imageCallback.imageLoaded((Drawable) message.obj, imageUrl,Tag);
}
};
new Thread() {
@Override
public void run() {
Drawable drawable = loadImageFromUrl(imageUrl);
imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
Message message = handler.obtainMessage(0, drawable);
handler.sendMessage(message);
}
}.start();
return null;
}
public static Drawable loadImageFromUrl(String url) {
/**
* 加载网络图片
*/
try {
return Drawable.createFromStream(new URL(url).openStream(), "src");
} catch (Exception e) {
throw new RuntimeException();
}
public interface ImageCallback {
public void imageLoaded(Drawable imageDrawable, String imageUrl,String Tag);
}
public Drawable loadDrawable1(String imageUrl, String tag2,
ImageCallback imageCallback) {
// TODO Auto-generated method stub
return null;
}
最后在activity中创建一个Gridview,方法跟创建Gridview方法一样,urls1为图片的网址。
private void initView1() {
gridview1 = (GridView) findViewById(R.id.gridview1);
// 实力化几个ImageAndText 对象
List<ImageAndText> listImageAndText1 = new ArrayList<ImageAndText>();
for (int i = 0; i < urls1.length; i++) {
ImageAndText iat = new ImageAndText(urls1[i], titlename1[i],
titlename2[i], titlename3[i]);
listImageAndText1.add(iat);
}
// Activity activity, List<ImageAndText> imageAndTexts, GridView
// gridView1
adapter1 = new ImageAndTextListAdapter(MainActivity.this,
listImageAndText1, gridview1);
gridview1.setAdapter(adapter1);
// 取消GridView默认点击背景图片
gridview1.setSelector(new ColorDrawable(Color.TRANSPARENT));
gridview1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
Intent intent = new Intent(MainActivity.this, sss.class);
startActivity(intent);
}
});
}