1. 程式人生 > >自定義實現帶checkbox的listView(用於專案中的多語言實現介面)

自定義實現帶checkbox的listView(用於專案中的多語言實現介面)

我感覺自定義listview最主要的原因就是系統自帶的一些佈局不能夠滿足我們的專案需求。

我這裡實現的自定義listview是用來實現之前部落格中提到的多語言切換的,在展示應用支援的語言的同時要讓使用者知道當前使用的語言是哪一種。

public static class MyAdapter extends BaseAdapter {
    public static HashMap<Integer, Boolean> isSelected;
    private Context context = null;
    private LayoutInflater inflater 
= null; private List<HashMap<String, Object>> list = null; private String keyString[] = null; private String itemString = null; private int idValue[] = null;// idֵ public MyAdapter(Context context, List<HashMap<String, Object>> list, int resource,
String[] from, int[] to) { this.context = context; this.list = list; keyString = new String[from.length]; idValue = new int[to.length]; System.arraycopy(from, 0, keyString, 0, from.length); System.arraycopy(to, 0, idValue, 0, to.length); inflater = LayoutInflater.from(context); init(); } public void
init() { isSelected = new HashMap<Integer, Boolean>(); String filename_pos="LoginDataStore"; String field_pos="Language_pos"; int position=ForDataStoreAndRead.getSharePreInt(MyApplication.getContext(),filename_pos,field_pos); isSelected.put(position,true); if (position==list.size()-1){ for (int i = 0; i < list.size()-1; i++) { isSelected.put(i, false); } }else { for (int i = 0; i < list.size(); i++) { if (i==position) i++; isSelected.put(i, false); } } } @Override public int getCount() { return list.size(); } @Override public Object getItem(int arg0) { return list.get(arg0); } @Override public long getItemId(int arg0) { return 0; } @Override public View getView(int position, View view, ViewGroup arg2) { ViewHolder holder = null; if (holder == null) { holder = new ViewHolder(); if (view == null) { view = inflater.inflate(R.layout.item_listview, null); } holder.tv = (TextView) view.findViewById(R.id.item_tv); holder.cb = (CheckBox) view.findViewById(R.id.item_cb); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } HashMap<String, Object> map = list.get(position); if (map != null) { itemString = (String) map.get(keyString[0]); holder.tv.setText(itemString); } holder.cb.setChecked(isSelected.get(position)); return view; } }

lv = (ListView) this.findViewById(R.id.listView_lang);

HashMap<String, Object> map = new HashMap<String, Object>();
map.put("item_tv", name[i]);
map.put("item_cb", false);
list.add(map);
adapter = new MyAdapter(this, list, R.layout.item_listview, new String[] { "item_tv", "item_cb" }, new int[] {
        R.id.item_tv, R.id.item_cb });
lv.setAdapter(adapter);





今天發現一個問題:
       語言選擇的功能可以簡單的使用ArrayAdapter來實現:
       通過指定android.R.layout.simple_list_item_multiple_choice這個資源實現帶CheckBox的ListView。同樣的,需要用setChoiceMode()方法來設定單選或者多選,
                實現程式碼如下:
                lv.setAdapter(new ArrayAdapter<String>(this,
                                android.R.layout.simple_list_item_multiple_choice, strs));
                lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);//setChoiceMode(ListView.CHOICE_MODE_SINGLE);
                //////這裡的關鍵是怎麼實現頁面剛開啟時,就顯示當前語言對應條目為選中狀態


        那,什麼時候使用BaseAdapter呢?
                   有時候還需要在裡面加入按鈕等控制元件,實現單獨的操作。也就是說,這個ListView不再只是展示資料,也不僅僅是這一行要
            來處理使用者的操作,而是裡面的控制元件要獲得使用者的焦點。讀者可以試試用SimpleAdapter新增一個按鈕到ListView的條目中,會發
            現可以新增,但是卻無法獲得焦點,點選操作被ListView的Item所覆蓋。這時候最方便的方法就是使用靈活的介面卡BaseAdapter了。
                   需要注意的是,自己定義的佈局中的Button會搶奪ListView的焦點,需要將Button設定為沒有焦點。設定非常簡單,只需要在xml的Button標籤下加入一行:
            android:focusable=“false”程式碼就可以了。


       詳見:http://blog.csdn.net/liyuchong2537631/article/details/49076067