Android例子源码非第三方实现根据字母排序的城市列表
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例子源码非第三方实现根据字母排序的城市列表的更多相关文章
- Orleans例子源码
这是Orleans系列文章中的一篇.首篇文章在此 我共享以下我现在写教程的简单的Orleans例子源码. 这个代码已经是我为了写word改动过了的.不过大体内容是通用的. 我写博客总体想法是:去除所有 ...
- Shiro官方快速入门10min例子源码解析框架2-Session
Shiro自身维护了一套session管理组件,它可以独立使用,并不单纯依赖WEB/Servlet/EJB容器等环境,使得它的session可以任何应用中使用. 2-Session)主要介绍在quic ...
- Shiro官方快速入门10min例子源码解析框架1-初始化
Shiro,一个易用的Java安全框架,主要集合身份认证.授权.加密和session管理的功能. 这系文章主要简介Shiro架构,并通过官方的quickstart例程分析最简实现下Shiro的工作流程 ...
- Shiro官方快速入门10min例子源码解析框架3-Authentication(身份认证)
在作完预备的初始化和session测试后,到了作为一个权鉴别框架的核心功能部分,确认你是谁--身份认证(Authentication). 通过提交给shiro身份信息来验证是否与储存的安全信息数据是否 ...
- 使用C#类向数据库添加数据的例子源码
在上一篇中,增加了sql server数据库操作类SqlOperator,用于操作sql server数据库.还有一个SqlStringHelper类,用于处理sql语句的单引号.那么这两个类怎么使用 ...
- TodoMVC中的Backbone+MarionetteJS+RequireJS例子源码分析之一
Marionette牵线木偶,Backbone是脊骨的意思,Marionette是基于Backbone做扩展库,可以理解为把脊骨骨架绑线扯着变成牵线木偶动起来哈哈,使backbone更易使用呵呵! 构 ...
- Spring Boot + Dubbo 可运行的例子源码-实现服务注册和远程调用
最近公司的一个分布式系统想要尝试迁移到Dubbo,项目本身是Spring Boot的,经过一些努力,最终也算是搭建起一个基础的框架了,放到这里记录一下.需要依赖一个外部的zookeeper. 源码地址 ...
- ios swift例子源码网址总结
http://blog.csdn.net/woaifen3344/article/details/40079351 http://www.ruanman.net/swift/learn/4607.ht ...
- TodoMVC中的Backbone+MarionetteJS+RequireJS例子源码分析之三 Views
这个版本的TodoMVC中的视图组织划分比较细,更加易于理解,这也得益于Marionette为我们带来了丰富的视图选择,原生的backbone只有views,而Marionette则有itemview ...
随机推荐
- SQL Server中的事物
1.事务的四个属性 原子性Atomicity,一致性Consistency,隔离性Isolation,持久性Durability ,即ACID特性. 原子性:事务必须是一个完整工作的单元,要么全部执行 ...
- Objective-O Runtime 运行时初体验
Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...
- Office 365 Licence使用情况统计
负责采购的同事需要知道目前公司使用了多少License,但是通过O365控制台界面似乎无法直接导出License使用量的信息,于是让我帮忙从后台统计一下. $mail_text = Read-Host ...
- VI操作命令
1. 按下esc键,非insert模式下 鼠标移入到 home x 删除光标处单个字符 dd 删除光标所在行 u 撤销最近一次操作 yy 复制当前行 yw 复制当前光标到单词末尾 y$ 复制所在位置到 ...
- myBatis的一对多查询,主要利用resultMap实现一次查询多个结果集
日常开发中有这中场景,一个用户有多个角色,一个角色又有多个菜单,想查出一个用户的所有菜单.除了常见的关联查询之外,更使用的应该是利用myBatis的resultMap来实现一次查询出多个结果集,缺点: ...
- python-socket-SocketServer - Forking
在之前的文章中,客户端和服务端.一般情况下并非是一对一的关系.多对一,多个客户端连接一个服务端.并且服务端需要对每一个客户端进行信息处理. 在客户端不多的情况下,可以采取为每一个客户端创建一个进程对其 ...
- oracle数据库使用三个月的总结
存储过程定义,举个例子如下: create or replace procedure test_person(id in Number, Ename In Varchar2, age In Varch ...
- Magento学习第一课——目录结构介绍
Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zen ...
- sublime text3配置node.js开发环境
今天配置sublime下node.js网上搜索很多方法. 首先:传统的方法是 1.GIT方法 可直接输入 Git clone https://github.com/tanepiper/SublimeT ...
- 【OpenWRT】【RT5350】【一】OpenWrt开发环境搭建
[宿主机构建] 本人电脑配置如下: CPU: intel 酷睿 i3 3.3G 双核 内存: 金士顿 8G 硬盘:希捷 1TB 7200rpm 操作系统:win7 旗舰版 64位 OpenWrt是在 ...