您的位置:首页 > 其它

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;

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: