我想创建一个像Android市场一样的网格视图,我想用互联网上的数据库中的图像填充它。它需要使用androidv4.support,因为我想运行2.2直到4.0。
有人说,这不可能在4.0之前创建一个gridview,这是真的吗?
但是只有当我使用setListAdapter()
时它才有效,但是当我更改为gridview.setAdapter()
时,它每行只显示一个图像,就像列表视图一样,它再次完成工作。
这是我的尝试:
这是ListFragment类:
public static class ArrayListFragment extends ListFragment implements OnScrollListener{
ImageAdapter adapter = new ImageAdapter();
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
LayoutInflater gridInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = gridInflater.inflate(R.layout.imagelist, null);
GridView gridView = (GridView) v.findViewById(R.id.list);
ImageDownloader.Mode mode = ImageDownloader.Mode.CORRECT;
// ImageAdapter imageAdapter = new ImageAdapter();
adapter.getImageDownloader().setMode(mode);
setListAdapter(adapter);
// gridView.setAdapter(adapter);
getListView().setOnScrollListener(this);
}
这是ImageAdapter类:
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private final ImageDownloader imageDownloader = new ImageDownloader();
public static int count = 10;
private final String[] URLS = {
"http://lh5.ggpht.com/_mrb7w4gF8Ds/TCpetKSqM1I/AAAAAAAAD2c/Qef6Gsqf12Y/s144-c/_DSC4374%20copy.jpg",
"http://lh5.ggpht.com/_Z6tbBnE-swM/TB0CryLkiLI/AAAAAAAAVSo/n6B78hsDUz4/s144-c/_DSC3454.jpg",
"http://lh3.ggpht.com/_GEnSvSHk4iE/TDSfmyCfn0I/AAAAAAAAF8Y/cqmhEoxbwys/s144-c/_MG_3675.jpg",
"http://lh6.ggpht.com/_Nsxc889y6hY/TBp7jfx-cgI/AAAAAAAAHAg/Rr7jX44r2Gc/s144-c/IMGP9775a.jpg",
"http://lh3.ggpht.com/_lLj6go_T1CQ/TCD8PW09KBI/AAAAAAAAQdc/AqmOJ7eg5ig/s144-c/Juvenile%20Gannet%20despute.jpg",
};
public int getCount() {
return count;
}
public String getItem(int position) {
return URLS[position];
}
public long getItemId(int position) {
return URLS[position].hashCode();
}
public View getView(int position, View convertView, ViewGroup parent) {
View v;
if (convertView == null) {
v = LayoutInflater.from(mContext).inflate(R.layout.image_text_view,null);
v.setLayoutParams(new GridView.LayoutParams(200,200));
ImageView imageview = (ImageView)v.findViewById(R.id.image);
imageview.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageview.setPadding(6, 6, 6, 6);
imageDownloader.download(URLS[position], imageview);
}
else {
v = convertView;
}
return v;
}
public ImageDownloader getImageDownloader() {
return imageDownloader;
}
}
如果有人有样品,它可能会有很大帮助。感谢
答案 0 :(得分:8)
这应该可以正常工作,您只能在ListFragment
中使用gridView - 只需使用普通的Fragment
代替,如果您要手动管理网格无论如何
此外,检查convertView是否为null的重点是进行视图回收 - 操作系统仅声明足够的视图来填充屏幕而不再是,所以如果你滚动那么它可以重用视图而不必膨胀一个新的一。像这样改变你的getView()以利用:
public View getView(int position, View convertView, ViewGroup parent) {
View v;
if (convertView == null) {
v = LayoutInflater.from(mContext).inflate(R.layout.image_text_view,null);
v.setLayoutParams(new GridView.LayoutParams(200,200));
}
else {
v = convertView;
}
ImageView imageview = (ImageView)v.findViewById(R.id.image);
imageview.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageview.setPadding(6, 6, 6, 6);
imageDownloader.download(URLS[position], imageview);
return v;
}
此外,getView不是BaseAdapter的功能,请尝试切换到ArrayAdapter。作为旁注,当您认为自己覆盖基本函数时,请始终使用@Override
- 如果您犯了错误,编译器会给您一个错误
答案 1 :(得分:1)
在GridView
中使用Fragment
与在Activity
中使用onActivityCreated
不应该有任何不同。我在您的代码中看到的一个明显错误是您在onCreateView
中夸大了布局,然后立即忽略它。相反,您应该在LayoutInflater
中执行所有视图初始化,方便地为您提供ListFragment
。
至于它目前的行为,为什么它的表现方式很有道理。我相信如果程序员没有提供ListView
,那么ImageAdapter
会扩展包含View
的布局(您目前不是)。然后,您设置的ListView
用于向onActivityCreated
提供onCreateView
。
因此,将onActivityCreated
中的所有代码移至Activity
,它应该可以正常运行。您根本不需要覆盖Fragment
,除非您GridView
与GridView
相关联时需要对{{1}}执行特殊操作。
至于使用{{1}} pre 4.0 - {{1}}自API级别1以来一直存在,所以我敢打赌,将其用于所有Android API级别都很好。