package com.xj.test;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
public class Main extends Activity {
private ListView listView;
private Context context=this;
private MyAdapter adapter;
private List<String> contentStrings=new ArrayList<String>();
private View loadingView;
private int lastItem;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView=(ListView)findViewById(R.id.listView);
adapter=new MyAdapter();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
loadingView= inflater.inflate(R.layout.loading, null);
loading();
listView.setAdapter(adapter);
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (lastItem == adapter.getCount() && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
listView.removeFooterView(loadingView);
new DataLoadThread().execute();
// loading();
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
lastItem = firstVisibleItem + visibleItemCount - 1 ;
}
});
try {
//修改快速滚动条的屏幕数量
Field f = AbsListView.class.getDeclaredField("mFastScroller");
f.setAccessible(true);
Object o=f.get(listView);
f=f.getType().getDeclaredField("MIN_PAGES");
f.setAccessible(true);
int i=(Integer) f.get(o);
i=1;
f.set(o,i);
//修改快速滚动条的图标
Field f2 = AbsListView.class.getDeclaredField("mFastScroller");
f2.setAccessible(true);
Object o2=f2.get(listView);
f2=f2.getType().getDeclaredField("mThumbDrawable");
f2.setAccessible(true);
Drawable drawable=(Drawable)f2.get(o2);
drawable=getResources().getDrawable(R.drawable.myslider);
f2.set(o2, drawable);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void loading() {
listView.addFooterView(loadingView);
loadData();
}
private void loadData() {
for(int i = 0; i < 2;i++){
contentStrings.add("M.J.");
contentStrings.add("Cara Dillon");
contentStrings.add("Meav");
contentStrings.add("WestLife");
contentStrings.add("BackStreet");
contentStrings.add("Linkin Park");
contentStrings.add("Enya");
contentStrings.add("Eagel");
contentStrings.add("Brain Adams");
contentStrings.add("Akon");
}
adapter.notifyDataSetChanged();
}
class DataLoadThread extends AsyncTask<Object, Object, Object> {
@Override
protected void onPreExecute() {
super.onPreExecute();
listView.addFooterView(loadingView);
}
@Override
protected Object doInBackground(Object... params) {
loadData();
return null;
}
}
class ViewHolder{
TextView contentTextView;
}
class MyAdapter extends BaseAdapter{
LayoutInflater layoutInflater=null;
@Override
public int getCount() {
return contentStrings.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null) {
if(layoutInflater==null) {
layoutInflater=(LayoutInflater)context.getSystemService(LAYOUT_INFLATER_SERVICE);
}
convertView=layoutInflater.inflate(R.layout.item_normal, null);
holder=new ViewHolder();
holder.contentTextView=(TextView)convertView.findViewById(R.id.textView);
convertView.setTag(holder);
} else {
holder=(ViewHolder)convertView.getTag();
}
holder.contentTextView.setText(contentStrings.get(position));
return convertView;
}
}
}
在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。ListView的特效和优化是提高用户体验的关键因素。在本项目中,我们探讨的是如何为ListView添加自定义滚动条效果,以及实现分页加载数据的功能,这在处理大数据量时尤为实用。 我们来看“自定义ListView滚动条”的实现。滚动条是ListView的一个默认组件,通常显示在侧边,用于指示当前滚动的位置。在描述中提到,开发者已经成功地让滚动条效果与新浪微博、QQ微博等应用保持一致。这通常通过自定义ViewGroup或使用现有的库如`AbsListView`的`setScrollbarFadingEnabled`方法来实现。自定义滚动条可能涉及到以下步骤: 1. 创建一个自定义的滚动条布局(例如,一个ImageView或者自定义View)。 2. 在ListView的XML布局中,使用`android:scrollbarThumbVertical`属性引用自定义布局。 3. 通过`ListView.setScrollbarFadingEnabled(false)`禁用默认的渐隐效果,以达到类似微博那种始终可见的效果。 4. 可能需要监听ListView的滚动事件,以便在滚动过程中更新滚动条的位置和样式。 我们讨论“分批量加载数据”(也称为无限滚动或下拉刷新)的实现。在用户滚动到ListView底部时自动加载更多数据,可以显著提高应用性能,因为它避免了一次性加载大量数据导致的内存压力和延迟。实现这一功能通常涉及以下步骤: 1. 监听ListView的滚动事件,如`OnScrollListener`的`onScroll()`方法。 2. 在滚动事件中判断是否到达底部,这通常通过比较滚动位置(`lastVisibleItem`)和数据集总项数(`adapter.getCount()`)来完成。 3. 当到达底部时,触发数据加载逻辑,这可能涉及到网络请求或数据库查询。 4. 加载新数据后,使用`adapter.notifyDataSetChanged()`更新ListView。 5. 可以添加一个加载中的指示器,如一个旋转的菊花图标,以告知用户数据正在加载。 此外,为了优化ListView的性能,还可以采用以下策略: 1. 使用ViewHolder模式减少视图复用时的查找操作。 2. 在Adapter中实现`notifyDataSetChanged()`的高效调用,只更新实际改变的数据项。 3. 使用`convertView`进行视图重用,避免频繁创建新视图对象。 4. 考虑使用`AsyncTask`或`Loader`在后台线程加载数据,避免阻塞UI。 5. 对于大数据量,考虑使用`StaggeredGridLayoutManager`或`GridLayoutManager`,而非简单的线性布局。 总结起来,本项目中涉及的Android ListView特效包括自定义滚动条效果和分页加载数据功能。自定义滚动条可以通过设置自定义布局和监听滚动事件实现,而分页加载数据则需要监听滚动事件并动态加载更多数据。同时,为了优化性能,应遵循Android ListView的最佳实践,如使用ViewHolder和后台线程加载数据。这些技术都是提升用户体验和应用性能的重要手段。
- 1
- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整
- w7914441182013-06-28效果不能,非常感谢
- liuxh20162013-08-04效果不错,下下来可以直接运行
- pitejune2015-05-23很不错的效果,谢谢楼主
- cugxgxy1122013-01-14效果不错,下下来可以直接运行
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助