ListView 的图片下载,优化造成的跳变
发布日期:2025-04-10 23:24:44 浏览次数:9 分类:精选文章

本文共 4062 字,大约阅读时间需要 13 分钟。

Android开发实践:ListView图片加载优化与AsyncTask实现

在Android开发中,ListView的图片加载优化是一个常见的性能优化点。以下将详细介绍一个实现方案,结合自定义Adapter和异步图片加载技术。

首先,创建一个主Activity类,继承自Activity类。在onCreate方法中,设置主布局,并初始化ListView。通过findViewById获取ListView实例,并设置适配器。

接着,定义一个User类,包含用于显示图片的ImageView、ProgressBar、TextView、Button等UI组件。为了实现 ViewHolder模式,自定义一个MyAdapter类,继承自BaseAdapter。Adapter中通过LayoutInflater获取自定义布局,获取各个UI组件,并将它们存储在User对象中。

在Adapter的getView方法中,首先检查convertView是否为空。如果为空,则使用LayoutInflater.inflate方法加载自定义布局,获取各个UI组件,并将User对象存储在view的标签中。如果convertView不为空,则通过getTag方法获取User对象。

为了实现图片懒加载效果,在Adapter中检查当前位置的图片是否已经加载。如果未加载,则启动一个AsyncTask异步任务,下载图片。使用MyAsyncTask类,接收ImageView、位置和ProgressBar参数。通过execute方法执行后台任务,下载图片并使用BitmapFactory.decodeStream方法显示图片。

在onPostExecute方法中,检查当前位置是否在ListView的可见范围内。如果在,则将下载的图片显示到ImageView,并将图片存储到HashMap中。HashMap通过位置作为键,图片作为值,以便重复请求时快速获取缓存。

整个实现方案通过ViewHolder模式和懒加载技术,显著提升了ListView的性能表现。异步图片加载技术避免了主线程阻塞,保证了UI响应的流畅性。

以下是完整代码示例:

public class MainActivity extends Activity {    private ListView listView;    private HashMap
map; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView1); listView.setAdapter(new MyAdapter()); } class User { ImageView p_w_picpathview; ProgressBar pb; TextView tv; Button button; } class MyAdapter extends BaseAdapter { @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; User user = new User(); if (convertView == null) { view = LayoutInflater.from(context).inflate(R.layout.itmp, null); user.p_w_picpathview = (ImageView) view.findViewById(R.id.p_w_picpathView1); user.pb = (ProgressBar) view.findViewById(R.id.progressBar1); user.tv = (TextView) view.findViewById(R.id.textView1); user.button = (Button) view.findViewById(R.id.button1); view.setTag(user); } else { user = (User) convertView.getTag(); } if (map.get(position) == null) { MyAsyncTask task = new MyAsyncTask(user.p_w_picpathview, position, user.pb); task.execute("http://192.168.56.1:8080/service/qq" + position + ".png"); } else { user.p_w_picpathview.setImageBitmap(map.get(position)); } return view; } @Override public int getCount() { return 10; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } } class MyAsyncTask extends AsyncTask
{ private ImageView p_w_picpathview; private int position; private ProgressBar pb; public MyAsyncTask(ImageView p_w_picpathview, int position, ProgressBar pb) { this.p_w_picpathview = p_w_picpathview; this.position = position; this.pb = pb; } @Override protected Bitmap doInBackground(String... params) { Bitmap bitmap = null; try { URL url = new URL(params[0]); URLConnection connection = url.openConnection(); InputStream is = connection.getInputStream(); bitmap = BitmapFactory.decodeStream(is); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return bitmap; } @Override protected void onPostExecute(Bitmap result) { if (result != null) { p_w_picpathview.setImageBitmap(result); map.put(position, result); pb.setVisibility(View.GONE); } super.onPostExecute(result); } }}

通过上述实现,可以实现ListView的图片懒加载和缓存加载效果,提升用户体验和性能表现。

上一篇:ListView为什么只是第一列的数据可以选择,其它列不可以
下一篇:Listview 利用Datapager进行分页

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年05月10日 02时09分06秒