1.实现带首字母Title的ListView
重点在MyAdapter的注释
MainActivity.java
public class MainActivity extends Activity {
private MyAdapter mAdapter;
private ListView mListView;
private List<String> mList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
mList=new ArrayList<String>();
String a="";
for(int i=0;i<26;i++){
a=((char)('A'+i))+"";
mList.add(a);
mList.add(a);
mList.add(a);
}
mListView=(ListView)findViewById(R.id.lv);
mAdapter=new MyAdapter();
mAdapter.update(mList,MainActivity.this);
mListView.setAdapter(mAdapter);
}
}
MyAdapter.java
public class MyAdapter extends BaseAdapter{
private List<String> mList;
private Context mContext;
public void update(List<String> list,Context context){
mContext=context;
Collections.sort(list);//如果是乱序输入的字母,需要排序一下,不然getView的时候会显示很多相同的Title
mList=list;
this.notifyDataSetChanged();
}
class ViewHolder{
TextView title;
TextView content;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=new ViewHolder();
//听说用convertView是提升ListView性能的好习惯
if(convertView!=null){
holder=(ViewHolder)convertView.getTag();
}else{
convertView=LayoutInflater.from(mContext).inflate(R.layout.item, null);
holder.title=(TextView) convertView.findViewById(R.id.item_title);
holder.content=(TextView)convertView.findViewById(R.id.item_content);
convertView.setTag(holder);
}
holder.content.setText(mList.get(position));
//显示title的逻辑
/*看到下面的item.xml文件就可以知道,其实每个listview item都是包含了title和content两个TextView的,只不过title都被隐藏了,我们只要把在首字母相同的分块中的第一个item的title显示出来并setText为该分块的首字母即可*/
//判断一个item是否是一个分块的第一个item的办法:该item的首字母与它的前一个item首字母不相同
String cur=mList.get(position);
String pre=position-1>=0?mList.get(position-1):"";//mList的第一个元素做特殊处理,防止数组越界
if(!(pre.equals(cur))){
holder.title.setVisibility(View.VISIBLE);
holder.title.setText(cur);
}else{
holder.title.setVisibility(View.GONE);
}
return convertView;
}
}
item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/item_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:textColor="#ffffff"
android:textSize="18sp"
android:visibility="gone"
android:text="A"
android:paddingLeft="10dip"
android:background="#40E0D0" />
<TextView
android:id="@+id/item_content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:textColor="#000000"
android:textSize="18sp"
android:text="content"
android:paddingLeft="10dip"
android:background="#ffffff" />
/>
</LinearLayout>
main.xml