ListView 后台加载数据框架(查询,字母排序,更新)
2015-12-09 11:29
344 查看
现在贴出代码和运行图: 需要代码的@ 我。
public class MainActivity extends FragmentActivity{
private List<City> list = null;
private ListView mListView = null;
private EditText mSearchEditText = null;
private DCityListAdapter mCityListAdapter = null;
private AbLoadDialogFragment mDialogFragment = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.city_list);
// 获取ListView对象
View headerView = LayoutInflater.from(this).inflate(R.layout.city_header, null);
mListView = (ListView) this.findViewById(R.id.listView);
mListView.addHeaderView(headerView);
DLetterFilterListView letterView = (DLetterFilterListView)this.findViewById(R.id.letterView);
mSearchEditText = (EditText) this.findViewById(R.id.editText);
// ListView数据
list = new ArrayList<City>();
// 使用自定义的Adapter
mCityListAdapter = new DCityListAdapter(this, list);
mListView.setAdapter(mCityListAdapter);
// item被点击事件
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
DToastUtil.showToast(MainActivity.this, "点击"+position);
}
});
//显示进度框
mDialogFragment = DDialogUtil.showLoadDialog(this, R.drawable.ic_load, "查询中,请等一小会");
mDialogFragment
.setAbDialogOnLoadListener(new AbDialogOnLoadListener() {
@Override
public void onLoad() {
// 下载网络数据
downTask();
}
});
mSearchEditText.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
String str = mSearchEditText.getText().toString().trim();
int length = str.length();
if (length > 0) {
filterData(str);
} else {
downTask();
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
}
});
}
public void downTask() {
DLogUtil.prepareLog(MainActivity.class);
DTask mAbTask = new DTask();
final DTaskItem item = new DTaskItem();
item.setListener(new AbTaskListListener() {
@Override
public List<?> getList() {
List<City> newList = null;
try {
newList = filledData(getResources().getStringArray(R.array.list));
} catch (Exception e) {
}
return newList;
}
@Override
public void update(List<?> paramList) {
list.clear();
list.addAll((List<City>)paramList);
//通知Dialog
mDialogFragment.loadFinish();
mCityListAdapter.notifyDataSetChanged();
}
});
mAbTask.execute(item);
}
/**
* 为ListView填充数据
* @param date
* @return
*/
private List<City> filledData(String [] array){
List<City> newList = new ArrayList<City>();
//实例化汉字转拼音类
DCharacterParser characterParser = DCharacterParser.getInstance();
for(int i=0; i<array.length; i++){
City city = new City();
city.setName(array[i]);
//汉字转换成拼音
String pinyin = characterParser.getSelling(array[i]);
String sortString = pinyin.substring(0, 1).toUpperCase();
// 正则表达式,判断首字母是否是英文字母
if(sortString.matches("[A-Z]")){
city.setFirstLetter(sortString.toUpperCase());
}else{
city.setFirstLetter("#");
}
newList.add(city);
}
Collections.sort(newList);
return newList;
}
/**
* 根据输入框中的值来过滤数据并更新ListView
* @param filterStr
*/
private void filterData(String filterStr){
//实例化汉字转拼音类
DCharacterParser characterParser = DCharacterParser.getInstance();
List<City> filterDateList = new ArrayList<City>();
if(!TextUtils.isEmpty(filterStr)){
for(City city : list){
String name = city.getName();
if(name.indexOf(filterStr) != -1 || characterParser.getSelling(name).startsWith(filterStr)){
filterDateList.add(city);
}
}
}
// 根据a-z进行排序
Collections.sort(filterDateList);
mCityListAdapter.updateListView(filterDateList);
}
@Override
protected void onResume() {
super.onResume();
}
public void onPause() {
super.onPause();
}
}
public class DCityListAdapter extends BaseAdapter implements SectionIndexer{
private List<City> list = null;
private Context mContext;
public DCityListAdapter(Context mContext, List<City> list) {
this.mContext = mContext;
this.list = list;
}
public int getCount() {
return this.list.size();
}
public Object getItem(int position) {
return list.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View view, ViewGroup arg2) {
ViewHolder viewHolder = null;
final City city = list.get(position);
if (view == null) {
viewHolder = new ViewHolder();
view = LayoutInflater.from(mContext).inflate(R.layout.city_list_item, null);
viewHolder.cityLetter = (TextView) view.findViewById(R.id.city_letter);
viewHolder.cityName = (TextView) view.findViewById(R.id.city_name);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
//根据position获取分类的首字母的Char ascii值
int section = getSectionForPosition(position);
//如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现
if(position == getPositionForSection(section)){
viewHolder.cityLetter.setVisibility(View.VISIBLE);
viewHolder.cityLetter.setText(city.getFirstLetter());
}else{
viewHolder.cityLetter.setVisibility(View.GONE);
}
viewHolder.cityName.setText(this.list.get(position).getName());
return view;
}
/**
* 当ListView数据发生变化时,调用此方法来更新ListView
* @param list
*/
public void updateListView(List<City> list){
this.list.clear();
this.list.addAll(list);
notifyDataSetChanged();
}
final static class ViewHolder {
TextView cityLetter;
TextView cityName;
}
/**
* 根据ListView的当前位置获取分类的首字母的Char ascii值
*/
public int getSectionForPosition(int position) {
return list.get(position).getFirstLetter().charAt(0);
}
/**
* 根据分类的首字母的Char ascii值获取其第一次出现该首字母的位置
*/
public int getPositionForSection(int section) {
for (int i = 0; i < getCount(); i++) {
String sortStr = list.get(i).getFirstLetter();
char firstChar = sortStr.toUpperCase().charAt(0);
if (firstChar == section) {
return i;
}
}
return -1;
}
/**
* 提取英文的首字母,非英文字母用#代替。
*
* @param str
* @return
*/
private String getAlpha(String str) {
String sortStr = str.trim().substring(0, 1).toUpperCase();
// 正则表达式,判断首字母是否是英文字母
if (sortStr.matches("[A-Z]")) {
return sortStr;
} else {
return "#";
}
}
@Override
public Object[] getSections() {
return null;
}
}
public class MainActivity extends FragmentActivity{
private List<City> list = null;
private ListView mListView = null;
private EditText mSearchEditText = null;
private DCityListAdapter mCityListAdapter = null;
private AbLoadDialogFragment mDialogFragment = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.city_list);
// 获取ListView对象
View headerView = LayoutInflater.from(this).inflate(R.layout.city_header, null);
mListView = (ListView) this.findViewById(R.id.listView);
mListView.addHeaderView(headerView);
DLetterFilterListView letterView = (DLetterFilterListView)this.findViewById(R.id.letterView);
mSearchEditText = (EditText) this.findViewById(R.id.editText);
// ListView数据
list = new ArrayList<City>();
// 使用自定义的Adapter
mCityListAdapter = new DCityListAdapter(this, list);
mListView.setAdapter(mCityListAdapter);
// item被点击事件
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
DToastUtil.showToast(MainActivity.this, "点击"+position);
}
});
//显示进度框
mDialogFragment = DDialogUtil.showLoadDialog(this, R.drawable.ic_load, "查询中,请等一小会");
mDialogFragment
.setAbDialogOnLoadListener(new AbDialogOnLoadListener() {
@Override
public void onLoad() {
// 下载网络数据
downTask();
}
});
mSearchEditText.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
String str = mSearchEditText.getText().toString().trim();
int length = str.length();
if (length > 0) {
filterData(str);
} else {
downTask();
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
}
});
}
public void downTask() {
DLogUtil.prepareLog(MainActivity.class);
DTask mAbTask = new DTask();
final DTaskItem item = new DTaskItem();
item.setListener(new AbTaskListListener() {
@Override
public List<?> getList() {
List<City> newList = null;
try {
newList = filledData(getResources().getStringArray(R.array.list));
} catch (Exception e) {
}
return newList;
}
@Override
public void update(List<?> paramList) {
list.clear();
list.addAll((List<City>)paramList);
//通知Dialog
mDialogFragment.loadFinish();
mCityListAdapter.notifyDataSetChanged();
}
});
mAbTask.execute(item);
}
/**
* 为ListView填充数据
* @param date
* @return
*/
private List<City> filledData(String [] array){
List<City> newList = new ArrayList<City>();
//实例化汉字转拼音类
DCharacterParser characterParser = DCharacterParser.getInstance();
for(int i=0; i<array.length; i++){
City city = new City();
city.setName(array[i]);
//汉字转换成拼音
String pinyin = characterParser.getSelling(array[i]);
String sortString = pinyin.substring(0, 1).toUpperCase();
// 正则表达式,判断首字母是否是英文字母
if(sortString.matches("[A-Z]")){
city.setFirstLetter(sortString.toUpperCase());
}else{
city.setFirstLetter("#");
}
newList.add(city);
}
Collections.sort(newList);
return newList;
}
/**
* 根据输入框中的值来过滤数据并更新ListView
* @param filterStr
*/
private void filterData(String filterStr){
//实例化汉字转拼音类
DCharacterParser characterParser = DCharacterParser.getInstance();
List<City> filterDateList = new ArrayList<City>();
if(!TextUtils.isEmpty(filterStr)){
for(City city : list){
String name = city.getName();
if(name.indexOf(filterStr) != -1 || characterParser.getSelling(name).startsWith(filterStr)){
filterDateList.add(city);
}
}
}
// 根据a-z进行排序
Collections.sort(filterDateList);
mCityListAdapter.updateListView(filterDateList);
}
@Override
protected void onResume() {
super.onResume();
}
public void onPause() {
super.onPause();
}
}
public class DCityListAdapter extends BaseAdapter implements SectionIndexer{
private List<City> list = null;
private Context mContext;
public DCityListAdapter(Context mContext, List<City> list) {
this.mContext = mContext;
this.list = list;
}
public int getCount() {
return this.list.size();
}
public Object getItem(int position) {
return list.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View view, ViewGroup arg2) {
ViewHolder viewHolder = null;
final City city = list.get(position);
if (view == null) {
viewHolder = new ViewHolder();
view = LayoutInflater.from(mContext).inflate(R.layout.city_list_item, null);
viewHolder.cityLetter = (TextView) view.findViewById(R.id.city_letter);
viewHolder.cityName = (TextView) view.findViewById(R.id.city_name);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
//根据position获取分类的首字母的Char ascii值
int section = getSectionForPosition(position);
//如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现
if(position == getPositionForSection(section)){
viewHolder.cityLetter.setVisibility(View.VISIBLE);
viewHolder.cityLetter.setText(city.getFirstLetter());
}else{
viewHolder.cityLetter.setVisibility(View.GONE);
}
viewHolder.cityName.setText(this.list.get(position).getName());
return view;
}
/**
* 当ListView数据发生变化时,调用此方法来更新ListView
* @param list
*/
public void updateListView(List<City> list){
this.list.clear();
this.list.addAll(list);
notifyDataSetChanged();
}
final static class ViewHolder {
TextView cityLetter;
TextView cityName;
}
/**
* 根据ListView的当前位置获取分类的首字母的Char ascii值
*/
public int getSectionForPosition(int position) {
return list.get(position).getFirstLetter().charAt(0);
}
/**
* 根据分类的首字母的Char ascii值获取其第一次出现该首字母的位置
*/
public int getPositionForSection(int section) {
for (int i = 0; i < getCount(); i++) {
String sortStr = list.get(i).getFirstLetter();
char firstChar = sortStr.toUpperCase().charAt(0);
if (firstChar == section) {
return i;
}
}
return -1;
}
/**
* 提取英文的首字母,非英文字母用#代替。
*
* @param str
* @return
*/
private String getAlpha(String str) {
String sortStr = str.trim().substring(0, 1).toUpperCase();
// 正则表达式,判断首字母是否是英文字母
if (sortStr.matches("[A-Z]")) {
return sortStr;
} else {
return "#";
}
}
@Override
public Object[] getSections() {
return null;
}
}
相关文章推荐
- 单元测试的艺术
- Esper企业版介绍(二)Esper HQ / WEB UI
- 51nod 1058 N的阶乘的长度
- 广播地址
- MySQL锁定状态查看命令
- RGB565,RGB8888等相关
- Python之SQLAlchemy学习
- phpredis -- Redis Arrays用法
- 开源监控软件之争
- zzuoj 10377: squee_spoon and his Cube III (DP状态转移)
- 一个不错的loading效果
- 结构体类型变量
- Spring Redis配置示例
- junit spring 测试
- 黑马hadoop视频分享
- CentOS 6.5 系统 LAMP(Apache+MySQL+PHP+nginx+memcache) Yum安装步骤
- 开源监控软件之争
- Linux 增值服务中删除,自己主动和国家执行
- 谈一下unity3d的光照
- 使用Gitlab和SourceTree进行版本控制