排序Listview用字母作为分隔符android

时间:2014-06-19 05:59:19

标签: android listview baseadapter custom-lists

我想显示名称列表以及我使用BaseAdapter创建自定义列表视图的其他信息现在我想按名称的排序顺序显示列表,并在分隔符中添加后者,如下所示

a--------------------
name: abcd
address: 22nd street
---------------------
name: acdb
address: Link Road
---------------------
name: axyz
address: Shankarnagar
b--------------------
name: bacd
address: Mharajbag
c-------------------
name: cabc
address: Wardha Road

1 个答案:

答案 0 :(得分:1)

Try this way,hope this will help you to solve your problem.


activity_main.xml 

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:divider="@android:color/white"
    android:dividerHeight="1dp"/>

list_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/txtHeader"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:textColor="@android:color/black"
        android:textSize="18sp"
        android:padding="5dp"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp">
        <TextView
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text="Name :"
            android:textSize="16sp"/>
        <TextView
            android:id="@+id/txtName"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textSize="16sp"/>
        </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp">
        <TextView
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text="Address :"
            android:textSize="16sp"/>
        <TextView
            android:id="@+id/txtAddress"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textSize="16sp"/>
    </LinearLayout>
</LinearLayout>


MainActivity.java

public class MainActivity extends ListActivity{

    private ArrayList<Character> headerList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        headerList = new ArrayList<Character>();
        ArrayList<HashMap<String,String>> data = new ArrayList<HashMap<String, String>>();
        HashMap<String,String> row1 = new HashMap<String, String>();
        row1.put("name","abcd");
        row1.put("address","1st street");
        data.add(row1);

        HashMap<String,String> row2 = new HashMap<String, String>();
        row2.put("name","bcde");
        row2.put("address","2st street");
        data.add(row2);

        HashMap<String,String> row3 = new HashMap<String, String>();
        row3.put("name","cdef");
        row3.put("address","3st street");
        data.add(row3);

        HashMap<String,String> row4 = new HashMap<String, String>();
        row4.put("name","acde");
        row4.put("address","4st street");
        data.add(row4);

        HashMap<String,String> row5 = new HashMap<String, String>();
        row5.put("name","adef");
        row5.put("address","5st street");
        data.add(row5);

        HashMap<String,String> row6 = new HashMap<String, String>();
        row6.put("name","bdef");
        row6.put("address","6st street");
        data.add(row6);

        HashMap<String,String> row7 = new HashMap<String, String>();
        row7.put("name","pqrs");
        row7.put("address","7st street");
        data.add(row7);

        HashMap<String,String> row8 = new HashMap<String, String>();
        row8.put("name","jklm");
        row8.put("address","8st street");
        data.add(row8);

        HashMap<String,String> row9 = new HashMap<String, String>();
        row9.put("name","fghi");
        row9.put("address","9st street");
        data.add(row9);

        HashMap<String,String> row10 = new HashMap<String, String>();
        row10.put("name","wxyz");
        row10.put("address","10st street");
        data.add(row10);


        Collections.sort(data,new MapComparator("name"));

        for (HashMap<String,String> row :data){
            if(!headerList.contains(row.get("name").toUpperCase().charAt(0))){
                headerList.add(row.get("name").toUpperCase().charAt(0));
                row.put("header",String.valueOf(row.get("name").charAt(0)));
            }
        }

        getListView().setAdapter(new CustomAdapter(this,data));

    }

    class MapComparator implements Comparator<Map<String, String>> {
        private final String key;

        public MapComparator(String key){
            this.key = key;
        }

        public int compare(Map<String, String> first,
                           Map<String, String> second){
            return first.get(key).compareTo(second.get(key));
        }
    }

    class CustomAdapter extends BaseAdapter{

        Context context;
        ArrayList<HashMap<String,String>> list;

        public CustomAdapter(Context context,ArrayList<HashMap<String,String>> list){
            this.context =context;
            this.list = list;
        }

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            ViewHolder holder;
            if(convertView==null){
                holder = new ViewHolder();
                convertView = LayoutInflater.from(context).inflate(R.layout.list_item,null,false);
                holder.txtHeader = (TextView) convertView.findViewById(R.id.txtHeader);
                holder.txtName = (TextView) convertView.findViewById(R.id.txtName);
                holder.txtAddress = (TextView) convertView.findViewById(R.id.txtAddress);

                convertView.setTag(holder);
            }else{
                holder = (ViewHolder) convertView.getTag();
            }
            if(list.get(position).containsKey("header")){
                holder.txtHeader.setText(list.get(position).get("header"));
                holder.txtHeader.setVisibility(View.VISIBLE);
            }else{
                holder.txtHeader.setVisibility(View.GONE);
            }

            holder.txtName.setText(list.get(position).get("name"));
            holder.txtAddress.setText(list.get(position).get("address"));

            return convertView;
        }

        class ViewHolder{
            TextView txtHeader;
            TextView txtName;
            TextView txtAddress;
        }
    }

}