values 下dimens.xml

<resources>

    <!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen> </resources>

布局:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" > <ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:scrollbars="none" >
</ListView> <ListView
android:id="@+id/listView2"
android:layout_width="15dp"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:cacheColorHint="#00000000"
android:divider="@null"
android:scrollbars="none" >
</ListView> </RelativeLayout>

letter_list.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="match_parent"
tools:context=".MainActivity" > <TextView
android:id="@+id/letterListTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:textColor="#3aa2cf" />
</RelativeLayout>

letter.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:orientation="vertical"
android:background="#eeeeee"
android:gravity="center_vertical" > <TextView
android:id="@+id/letterTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:text="TextView" /> </LinearLayout> </RelativeLayout>

city.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:orientation="vertical"
android:background="#ffffff"
android:gravity="center_vertical" > <TextView
android:id="@+id/cityTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:text="TextView" /> </LinearLayout> </RelativeLayout>

letter_city.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" > <LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:orientation="vertical"
android:gravity="center_vertical" > <TextView
android:id="@+id/letterTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="TextView" /> </LinearLayout> </RelativeLayout>

主页

MainActivity.java

package com.example.zimusortlistview;

import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; /**
* @author 彭向明
* 在listview中加载多个布局
* 以城市列表为例,保证cityLetter和cityName中没有相同的元素,且letter中没有相同的元素
*/
public class MainActivity extends Activity implements OnItemClickListener{ String[] letter={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
String[] cityLetter={"C","B","H","G","W","C","S","S","C","W","H","Z","C","D","N","L","Q","S","S"
,"L","N","H","X","H","S","Z","G","N","J","T","S","X","A"};
String[] cityName={"长沙","北京","杭州","广州","武汉","重庆","上海","深圳","长春","乌鲁木齐","哈尔滨","郑州","成都","大连","南昌","兰州","齐齐哈尔","汕头","苏州"
,"拉萨","南京","呼和浩特","厦门","合肥","沈阳","张家界","贵州","宁夏","济南","天津","石家庄","西安","澳门"};
List<String> letterToCity=new ArrayList<String>();
int count;
ListView lv; ListView lv1; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); String str="";
for(int i=0;i<letter.length;i++){
str=letter[i];
boolean isAddLetter=false;
for(int j=0;j<cityLetter.length;j++){
if(str.equals(cityLetter[j])){
if(!isAddLetter){
letterToCity.add(str);
isAddLetter=true;
}
letterToCity.add(cityName[j]);
}
}
} lv=(ListView)findViewById(R.id.listView1);
lv.setAdapter(new MyAdapter());
lv.setOnItemClickListener(this); lv1=(ListView)findViewById(R.id.listView2);
lv1.setAdapter(new MyAdapter1());
lv1.setOnItemClickListener(this);
} class MyAdapter1 extends BaseAdapter{ @Override
public int getCount() {
// TODO Auto-generated method stub
return letter.length;
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return letter[position];
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
View view=LayoutInflater.from(MainActivity.this).inflate(R.layout.letter_list, null);
TextView tv=(TextView)view.findViewById(R.id.letterListTextView);
tv.setText(letter[position]);
return view;
} } class MyAdapter extends BaseAdapter{ final static int TYPE_1=1;
final static int TYPE_2=2; @Override
public int getCount() {
// TODO Auto-generated method stub
return letterToCity.size();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return letterToCity.get(position);
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public int getItemViewType(int position) {
for(int i=0;i<letter.length;i++){
if(letterToCity.get(position).equals(letter[i])){
return TYPE_1;
}
}
return TYPE_2;
} @Override
public int getViewTypeCount() {
return 3;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
/**
* 即使convertView缓存了一些布局,但是在重构时,根本不知道怎么样去让convertView返回你所需要的布局,这时你需
* 要让adapter知道我当前有哪些布局,我重构Item时的布局选取规则,好让convertView能返回你需要的布局。
* 需要重写以下两个函数
* @Override
* public int getItemViewType(int position) {}这个函数获取在getView中创建的视图的类型
* @Override
* public int getViewTypeCount() {}返回在getView中创建视图类型的数量
* 至于这两个方法的详细用处,自己看api即可
*/
ViewHolder1 vh1=null;
ViewHolder2 vh2=null;
int type=getItemViewType(position);
if(convertView==null){
switch (type) {
case TYPE_1:
convertView=LayoutInflater.from(MainActivity.this).inflate(R.layout.letter, null);
vh1=new ViewHolder1();
vh1.tv=(TextView)convertView.findViewById(R.id.letterTextView);
convertView.setTag(vh1);
break;
case TYPE_2:
convertView=LayoutInflater.from(MainActivity.this).inflate(R.layout.city, null);
vh2=new ViewHolder2();
vh2.tv=(TextView)convertView.findViewById(R.id.cityTextView);
convertView.setTag(vh2);
break;
default:
break;
}
}else{
switch (type) {
case TYPE_1:
vh1=(ViewHolder1)convertView.getTag();
break;
case TYPE_2:
vh2=(ViewHolder2)convertView.getTag();
break;
default:
break;
}
}
switch (type) {
case TYPE_1:
vh1.tv.setText(letterToCity.get(position));
break;
case TYPE_2:
vh2.tv.setText(letterToCity.get(position));
break;
default:
break;
}
return convertView; //此方法不可取,刷新时view会刷新
// boolean isLetter=false;
// for(int i=0;i<letter.length;i++){
// if(letterToCity.get(position).equals(letter[i])){
// isLetter=true;
// break;
// }
// }
// ViewHolder vh=null;
// if(convertView==null){
// vh=new ViewHolder();
// if(isLetter){
// convertView=LayoutInflater.from(MainActivity.this).inflate(R.layout.letter, null);
// vh.tv=(TextView)convertView.findViewById(R.id.letterTextView);
// }else{
// convertView=LayoutInflater.from(MainActivity.this).inflate(R.layout.city, null);
// vh.tv=(TextView)convertView.findViewById(R.id.cityTextView);
// }
// convertView.setTag(vh);
// }else{
// vh = (ViewHolder) convertView.getTag();
// }
// vh.tv.setText(letterToCity.get(position));
// return convertView; //城市列表,修改布局
// boolean isLetter=false;
// for(int i=0;i<letter.length;i++){
// if(letterToCity.get(position).equals(letter[i])){
// isLetter=true;
// break;
// }
// }
// View view;
// ViewHolder vh;
// if(convertView==null){
// view=LayoutInflater.from(MainActivity.this).inflate(R.layout.letter_city, null);
// vh=new ViewHolder();
// vh.tv=(TextView)view.findViewById(R.id.letterTextView);
// vh.ll=(LinearLayout)view.findViewById(R.id.ll);
// convertView=view;
// convertView.setTag(vh);
// }else{
// view=(View)convertView;
// vh=(ViewHolder)convertView.getTag();
// }
// vh.tv.setText(letterToCity.get(position));
// if(isLetter){
// vh.ll.setBackgroundColor(Color.LTGRAY);
// vh.tv.setPadding(5, 5, vh.tv.getPaddingRight(), 5);
// }else{
// vh.ll.setBackgroundColor(Color.WHITE);
// vh.tv.setPadding(10, 10, vh.tv.getPaddingRight(), 10);
// }
// return view;
}
} @Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
switch (parent.getId()) {
case R.id.listView1:
boolean isLetter=false;
for(int i=0;i<letter.length;i++){
if(letter[i].equals(letterToCity.get(position))){
isLetter=true;
break;
}
}
if(!isLetter){
Toast.makeText(this, letterToCity.get(position), Toast.LENGTH_SHORT).show();
}
break;
case R.id.listView2:
for(int i=0;i<letterToCity.size();i++){
if(letter[position].equals(letterToCity.get(i))){
lv.setSelection(i);
break;
}
}
break;
default:
break;
}
}
} class ViewHolder{
TextView tv;
LinearLayout ll;
}
class ViewHolder1{
TextView tv;
}
class ViewHolder2{
TextView tv;
}

Android例子源码非第三方实现根据字母排序的城市列表的更多相关文章

  1. Orleans例子源码

    这是Orleans系列文章中的一篇.首篇文章在此 我共享以下我现在写教程的简单的Orleans例子源码. 这个代码已经是我为了写word改动过了的.不过大体内容是通用的. 我写博客总体想法是:去除所有 ...

  2. Shiro官方快速入门10min例子源码解析框架2-Session

    Shiro自身维护了一套session管理组件,它可以独立使用,并不单纯依赖WEB/Servlet/EJB容器等环境,使得它的session可以任何应用中使用. 2-Session)主要介绍在quic ...

  3. Shiro官方快速入门10min例子源码解析框架1-初始化

    Shiro,一个易用的Java安全框架,主要集合身份认证.授权.加密和session管理的功能. 这系文章主要简介Shiro架构,并通过官方的quickstart例程分析最简实现下Shiro的工作流程 ...

  4. Shiro官方快速入门10min例子源码解析框架3-Authentication(身份认证)

    在作完预备的初始化和session测试后,到了作为一个权鉴别框架的核心功能部分,确认你是谁--身份认证(Authentication). 通过提交给shiro身份信息来验证是否与储存的安全信息数据是否 ...

  5. 使用C#类向数据库添加数据的例子源码

    在上一篇中,增加了sql server数据库操作类SqlOperator,用于操作sql server数据库.还有一个SqlStringHelper类,用于处理sql语句的单引号.那么这两个类怎么使用 ...

  6. TodoMVC中的Backbone+MarionetteJS+RequireJS例子源码分析之一

    Marionette牵线木偶,Backbone是脊骨的意思,Marionette是基于Backbone做扩展库,可以理解为把脊骨骨架绑线扯着变成牵线木偶动起来哈哈,使backbone更易使用呵呵! 构 ...

  7. Spring Boot + Dubbo 可运行的例子源码-实现服务注册和远程调用

    最近公司的一个分布式系统想要尝试迁移到Dubbo,项目本身是Spring Boot的,经过一些努力,最终也算是搭建起一个基础的框架了,放到这里记录一下.需要依赖一个外部的zookeeper. 源码地址 ...

  8. ios swift例子源码网址总结

    http://blog.csdn.net/woaifen3344/article/details/40079351 http://www.ruanman.net/swift/learn/4607.ht ...

  9. TodoMVC中的Backbone+MarionetteJS+RequireJS例子源码分析之三 Views

    这个版本的TodoMVC中的视图组织划分比较细,更加易于理解,这也得益于Marionette为我们带来了丰富的视图选择,原生的backbone只有views,而Marionette则有itemview ...

随机推荐

  1. javaScript中其他类型的值转换为Boolean类型

    将javaScript中其他任意类型的值转换为对应Boolean类型的值. 一  将number类型的值转换为Boolean类型 数值为0: var myBoolean = new Boolean(0 ...

  2. java内置工具

    jps jps -l :列出java进程 jstat jstat -gcutil pid:列出各个内存区的使用情况,百分比 jinfo jinfo -flags pid : 列出虚拟机设置,包括默认值 ...

  3. TotalCommander 之 配置

    一.设置配置界面: 1.进入设置界面       点击菜单栏的配置,然后再点击配置里面的选项,便会出现Total Commander设置的界面. 2.设置字体 刚开始,大家会发现这不是我们熟悉的字体啊 ...

  4. 宿主机远程桌面连接vmware中的虚拟机

    参考了:http://jingyan.baidu.com/article/3052f5a1e8c56397f21f8674.html   感谢~ 宿主机安装了vmware,vmware中安装虚拟机,怎 ...

  5. [SonarQube]小结

    新的项目用了这个,以前从来没用过,配置了一下,看看这个到底是个什么东东. 先学习一下英文单词: sonar 声纳, qube 方盒子, 连起来应该叫声纳盒, SonarQube一看就是一个监测诊断设备 ...

  6. SQL CREATE TABLE 语句\SQL 约束 (Constraints)\SQL NOT NULL 约束\SQL UNIQUE 约束

    CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CREATE TABLE 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据 ...

  7. solr 设置时区

    问题 solr5.2: 发现打印log时间和真实时间对不上,服务器时间设置没有问题,后来发现,solr需要设置时区 解决方法: 直接修改bin/solr.in.sh 文件 #SOLR_TIMEZONE ...

  8. vs2015启动网站调试提示 HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容。 解决方法

    今天安装了vs2015 下载一个项目进行试用,启动调试的时候提示 HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容. 最可能的原因: 没有为请求的 URL ...

  9. cloudera learning7:Hadoop资源管理

    Linux Control Groups(cgroups):在操作系统级别进行资源分配,可通过Cloudera Static Service Pools配置. YARN调度器配置:对运行在YARN上的 ...

  10. css选择器及css优先级

    三个css选择器:id选择器#test1{ }.class选择器.test2{ }.标签选择器div{ }对三个div:<div>我是普通div</div>.<div i ...