带导航栏的listview效果

最近还想写一个带有导航条的列表,结合以前学到的,简单的实现了下
效果图
点击左侧的导航条,显示对应城市。
首先是布局代码

<ListView
        android:id="@+id/lsvId"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginRight="40dp"
        android:layout_marginTop="48dp" />

    <ListView
        android:id="@+id/rightLsvId"
        android:layout_width="40dp"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginTop="48dp"
        android:background="#ffffff" />

就是两个listview。

下面是主代码:

private ImageButton returnBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_city);
        returnBtn = (ImageButton) findViewById(R.id.returnBtn);
        returnBtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                CityListActivity.this.finish();
            }
        });

        //借助ContactRetriever对象读取数据封装到List<Contact>集合中
        ContactRetriever cRetriever=
                new ContactRetriever();
        //设置内容列表
        setContentList(cRetriever);
        //设置右侧导航列表
        setSortKeysList(cRetriever);
    }
    private ListView contentLsv;
    private ContactAdapter contentAdapter;
    private void setContentList(ContactRetriever cRetriever) {
        //要求:将此数据显示在ListView中
        contentAdapter =
                new ContactAdapter(
                        this,
                        R.layout.list_item_3, 
                        cRetriever.getContacts());//借助此对象构建item (item view+item data)
        //ListView
        contentLsv=
                (ListView)findViewById(R.id.lsvId);
        //关联adapter
        contentLsv.setAdapter(contentAdapter);
        //lsv显示数据时会回调adapter对象方法获得item
        //一般会首先调用adapter的getCount方法获得要显示的item个数
        //然后会调用adapter的getView方法构建item
    }
    private List<String> list = new ArrayList<String>();
    private void setSortKeysList(ContactRetriever cRetriever){
        list = cRetriever.getSortkeys();
        //1.ListView
        ListView lsv=
                (ListView)findViewById(R.id.rightLsvId);
        //2.Adapter
        MyListViewAdapter adapter1 = new MyListViewAdapter();
        //3.关联Adapter
        lsv.setAdapter(adapter1);
        lsv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(
                    AdapterView<?> parent,
                    View view, 
                    int position,long id){
                String itemData = (String) parent.getItemAtPosition(position);
                int contentMinPos = contentAdapter.getPositionForSection(itemData.charAt(0));
                contentLsv.setSelectionFromTop(contentMinPos, 0);
            }
        });
    }

    class MyListViewAdapter extends BaseAdapter{
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            convertView = parent.inflate(CityListActivity.this, R.layout.list_item_1, null);
            TextView textView = (TextView) convertView.findViewById(R.id.textView1);
            textView.setText(list.get(position));
            return convertView;
        }
    }

这里是主listview的item布局文件代码
上面是显示A B C等标签的一个控件
下面是城市名

 <TextView 
        android:id="@+id/groupId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:textColor="#ffffff"
        android:padding="2dp"
        android:background="#22cc33"/>

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/groupId"
        android:layout_marginTop="5dp"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

主代码里启用了一个加载数据的类,下面是这个类的代码

/**借助此类加载数据*/
//BO(业务对象:负责加载数据业务)
public class ContactRetriever {
    private List<String> list=
            new ArrayList<String>();
    public ContactRetriever() {
        prepare();
    }
    /**
     * 准备数据(将来此数据会来自数据库)
     * */
    public void prepare(){
        list.add("A鞍山");
        list.add("B北京");
        list.add("B北戴河");
        list.add("B滨州");
        list.add("B包头");
        list.add("C重庆");
        list.add("C成都");
        list.add("C长沙");
        list.add("C长春");
        list.add("D大连");
        list.add("D德州");
        list.add("E鄂尔多斯");
        list.add("S上海");
        list.add("S苏州");
        list.add("S沈阳");
        list.add("S汕头");
        list.add("S绍兴");
        list.add("Y扬州");
        list.add("H杭州");
        list.add("N南京");
        list.add("J济南");
        list.add("J济宁");
        list.add("Q青岛");
        list.add("G开封");
        list.add("G昆明");
        list.add("H合肥");
        list.add("H菏泽");
        list.add("Y烟台");
        list.add("W威海");

    }
    //通过此方法对外界提供数据
    public List<String> getContacts(){
        //排序list集合中的元素(按名字排序)
        //Collections.sort(list) List集合中的对象必须实现了Comparable接口
        Collections.sort(list,
                new Comparator<String>() {
            @Override
            public int compare(String lhs,
                    String rhs) {
                return lhs
                        .compareTo(rhs);
                //==0,>0,<0
            }
        });
        return list;
    }
    /**返回所有了联系人的第一个字母*/
    public List<String> getSortkeys(){
        /*List<Contact> list=
        getContacts();*/
        TreeSet<String> set=
                new TreeSet<String>();
        for(String c:list){
            set.add(String.valueOf(c.toUpperCase()
                    .charAt(0)));
        }
        List<String> slist = new ArrayList<String>(set);
        return  slist;
    }
}

代码直接粘的源码,里面都有注释,大家可以看一看。
其实本来想的是直接将文字解析成字母来判断,但是没找到方法,所以直接加了ABC等字母前缀,有大神有直接解析文字的方法的话,敬请提出来交流一下,谢谢。
如果还有什么需要改进的也请及时的提出来。
有问题可以留言,看到了就会给回复。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值