SideBar+ListView

来源:互联网 发布:韩国历史教科书知乎 编辑:程序博客网 时间:2024/05/16 23:37

关键代码

根据手指在sidebar上滑动 列表更随移动
city.json 是从ios系统里拿出来的文件


这里写图片描述

public class MainActivity extends AppCompatActivity implements ISideBar {    private TextView showTv;    private SideBar bar;    private SortAdapter adapter;    private CityRes commentRes;    private List<SortMode> data;    private ListView list;    private Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            data = initCityData(commentRes.getCitylist());            //数据放在适配器里面之前要先排序            Collections.sort(data, new PinyinComparator());            adapter = new SortAdapter(MainActivity.this, data);            list.setAdapter(adapter);        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        initData();        initListener();    }    private void initView() {        bar = (SideBar) findViewById(R.id.slidBar);        showTv = (TextView) findViewById(R.id.showTv);        list = (ListView) findViewById(R.id.list);    }    private void initData() {        adapter = new SortAdapter(this,data);        //在解析json数据比较慢,差的手机容易ANR,开线程来解析然后去          //handler更新数据        new Thread(new Runnable() {            @Override            public void run() {                Gson resultGson = new Gson();                String jsonData = UtilsString.getStrFromAssets(MainActivity.this, "city.json");                commentRes = resultGson.fromJson(jsonData, CityRes.class);                handler.sendEmptyMessageDelayed(0, 100);            }        }).start();    }    private void initListener() {        bar.setListener(this);    }    private List<SortMode> initCityData(List<CitylistDto> citylist) {        List<SortMode> mLists = new ArrayList<SortMode>();        for (int i = 0; i < citylist.size(); i++) {            for (int n = 0; n < citylist.get(i).getCities().size(); n++) {                SortMode mode = new SortMode();                mode.setName(citylist.get(i).getCities().get(n).getName());                mode.setSortLetter(citylist.get(i).getAZ());                mode.setCityID(citylist.get(i).getCities().get(n).getCityID());                mode.setCitycode(citylist.get(i).getCities().get(n).getCitycode());                mode.setPyf(citylist.get(i).getCities().get(n).getPyf());                mode.setPys(citylist.get(i).getCities().get(n).getPys());                mLists.add(mode);            }        }        return mLists;    }    @Override    public void onTouchLetterChanged(String s) {        showTv.setText(s);        showTv.setVisibility(View.VISIBLE);        int position = adapter.getPositionForSelection(s.charAt(0));        if (position != -1) {            list.setSelection(position);        }    }    @Override    public void onTouchUpInVisibility() {        showTv.setText("");        showTv.setVisibility(View.INVISIBLE);    }}
public class SortAdapter extends BaseAdapter {    private Context context;    private List<SortMode> modes;    private LayoutInflater inflater;    public SortAdapter(Context context, List<SortMode> modes){        this.context = context;        this.modes = modes;        this.inflater = LayoutInflater.from(context);    }    public int getCount() {        return modes.size();    }    public Object getItem(int position) {        return modes.get(position);    }    public long getItemId(int position) {        return position;    }    public View getView(int position, View convertView, ViewGroup parent) {        //每个条目长什么样子        ViewHolder holder = null;        SortMode sortMode = modes.get(position);        if(convertView == null){            holder = new ViewHolder();            convertView = inflater.inflate(R.layout.item_sidebar, null);            holder.tvLetter = (TextView) convertView.findViewById(R.id.catalog);            holder.tvName = (TextView) convertView.findViewById(R.id.title);            convertView.setTag(holder);        }else{            holder = (ViewHolder) convertView.getTag();        }        //获取首字母的assiiint selection = sortMode.getSortLetter().charAt(0);        //通过首字母的assii值来判断哪个position要显示字母        int positionForSelection = getPositionForSelection(selection);        if(position == positionForSelection){            //说明该条目符合显示字母的条件            holder.tvLetter.setVisibility(View.VISIBLE);            holder.tvLetter.setText(sortMode.getSortLetter());        }else{            holder.tvLetter.setVisibility(View.GONE);        }        holder.tvName.setText(sortMode.getName());//设置名字        return convertView;    }    public int getPositionForSelection(int selection) {        for(int i = 0;i<getCount();i++){            String sortName = modes.get(i).getSortLetter();            char firstLetter = sortName.toUpperCase().charAt(0);            if(firstLetter == selection){                return i;            }        }        return -1;    }    class ViewHolder{        TextView tvLetter;        TextView tvName;    }}
    public static String getStrFromAssets(Context context,String name) {        String jsonString = "";        String resultString = "";        try {            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(context.getClass().getClassLoader().getResourceAsStream("assets/" + name)));            while ((jsonString = bufferedReader.readLine()) != null) {                resultString += jsonString;            }        } catch (IOException e) {            e.printStackTrace();        }        return resultString;    }
public class PinyinComparator implements Comparator<SortMode> {    public int compare(SortMode lhs, SortMode rhs) {        return lhs.getSortLetter().compareTo(rhs.getSortLetter());    }}

https://github.com/weikaino1/SideBarDemo

0 0
原创粉丝点击