自定义 gridview 适配器速度慢或四处移动元素
Custom gridview adapter is slow or moves elements around
我正在尝试创建一个包含图像和文本的网格视图。
我有这个代码:
public View getView(int position, View convertView, ViewGroup parent) {
View gridView;
if(convertView == null){
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
gridView = inflater.inflate(R.layout.gridview_item, null);
TextView textView = (TextView) gridView.findViewById(R.id.gridview_text);
textView.setText(titles[position]);
ImageView imageView = (ImageView) gridView.findViewById(R.id.gridview_picture);
try {
if (imageUrls[position].equals("null")) {
imageView.setImageResource(R.drawable.defaultpic);
}else{
Bitmap bitmap = new setImage().execute(imageUrls[position]).get();
imageView.setImageBitmap(bitmap);
}
}catch(Exception e){
Log.i(MainActivity.TAG, "EXCEPTION:" + e.toString());
}
}
else{
gridView = convertView;
}
return gridView;
}
但是当使用这段代码时,gridview 的一些元素会切换位置。
然后我试着改变它。我最终得到了这段代码:
public View getView(int position, View convertView, ViewGroup parent) {
View gridView;
if(convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
gridView = inflater.inflate(R.layout.gridview_item, null);
}else{
gridView = convertView;
}
TextView textView = (TextView) gridView.findViewById(R.id.gridview_text);
textView.setText(titles[position]);
ImageView imageView = (ImageView) gridView.findViewById(R.id.gridview_picture);
try {
if (imageUrls[position].equals("null")) {
imageView.setImageResource(R.drawable.defaultpic);
}else{
Bitmap bitmap = new setImage().execute(imageUrls[position]).get();
imageView.setImageBitmap(bitmap);
}
}catch(Exception e){
Log.i(MainActivity.TAG, "EXCEPTION:" + e.toString());
}
return gridView;
}
这行得通,但 gridview 确实很慢而且滞后。所以我的问题是,如何制作一个不慢且不切换元素的gridview?
切换的问题可能是因为你在第一个代码中没有每次都设置回收视图的字段,从而导致显示旧数据(反正我就是这样发生的)过去的)。
我还建议查看 ViewHolder 模式以实现更平滑的滚动 (ViewHolder Pattern)。
我认为主要性能问题是 getView 方法中的阻塞调用:我看到的主要嫌疑人是
setImage().execute(imageUrls[position]).get();
行,尤其是末尾的 get() 似乎在等待任务完成。如果是这样的话,我会推荐阅读本系列文章Displaying bitmaps efficiently,其中还解释了如何在列表视图中处理位图。
You can also use ImageLoader to load images in imageView.It can load URL or local file image.Why am suggesting this one is it perform the assigned task asynchrounusly without affecting the main thread.For better performance use ViewHolder as well as Image Loader to load images.
ImageLoader library is available in GitHub you can download from it.
click here to download the library
我正在尝试创建一个包含图像和文本的网格视图。 我有这个代码:
public View getView(int position, View convertView, ViewGroup parent) {
View gridView;
if(convertView == null){
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
gridView = inflater.inflate(R.layout.gridview_item, null);
TextView textView = (TextView) gridView.findViewById(R.id.gridview_text);
textView.setText(titles[position]);
ImageView imageView = (ImageView) gridView.findViewById(R.id.gridview_picture);
try {
if (imageUrls[position].equals("null")) {
imageView.setImageResource(R.drawable.defaultpic);
}else{
Bitmap bitmap = new setImage().execute(imageUrls[position]).get();
imageView.setImageBitmap(bitmap);
}
}catch(Exception e){
Log.i(MainActivity.TAG, "EXCEPTION:" + e.toString());
}
}
else{
gridView = convertView;
}
return gridView;
}
但是当使用这段代码时,gridview 的一些元素会切换位置。 然后我试着改变它。我最终得到了这段代码:
public View getView(int position, View convertView, ViewGroup parent) {
View gridView;
if(convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
gridView = inflater.inflate(R.layout.gridview_item, null);
}else{
gridView = convertView;
}
TextView textView = (TextView) gridView.findViewById(R.id.gridview_text);
textView.setText(titles[position]);
ImageView imageView = (ImageView) gridView.findViewById(R.id.gridview_picture);
try {
if (imageUrls[position].equals("null")) {
imageView.setImageResource(R.drawable.defaultpic);
}else{
Bitmap bitmap = new setImage().execute(imageUrls[position]).get();
imageView.setImageBitmap(bitmap);
}
}catch(Exception e){
Log.i(MainActivity.TAG, "EXCEPTION:" + e.toString());
}
return gridView;
}
这行得通,但 gridview 确实很慢而且滞后。所以我的问题是,如何制作一个不慢且不切换元素的gridview?
切换的问题可能是因为你在第一个代码中没有每次都设置回收视图的字段,从而导致显示旧数据(反正我就是这样发生的)过去的)。 我还建议查看 ViewHolder 模式以实现更平滑的滚动 (ViewHolder Pattern)。
我认为主要性能问题是 getView 方法中的阻塞调用:我看到的主要嫌疑人是
setImage().execute(imageUrls[position]).get();
行,尤其是末尾的 get() 似乎在等待任务完成。如果是这样的话,我会推荐阅读本系列文章Displaying bitmaps efficiently,其中还解释了如何在列表视图中处理位图。
You can also use ImageLoader to load images in imageView.It can load URL or local file image.Why am suggesting this one is it perform the assigned task asynchrounusly without affecting the main thread.For better performance use ViewHolder as well as Image Loader to load images.
ImageLoader library is available in GitHub you can download from it.
click here to download the library