ListView 資源整理

1.ListView中讓onClick和onItemClick事件共存

將具有點擊事件控件的android:focusable屬性置成false就可以了。


2.listView的選中顏色 
ListView選中時默認是黃色,很多時候會和我們軟件的配色不符合,那麼我就教你如何修改默認的ListView配色,改變ListView選中顏色有兩個方法: 

(1). 在程序中: 

Java代碼 
  1. Drawable drawable=getResources().getDrawable(R.drawable.touch_feedback);  
  2. ListView.setSelector(drawable);  

(2). 在xml裏面的ListView標籤下添加: 
Java代碼 
  1. android:listSelector=”#00000000″ //後面的顏色可以自己定這樣寫是透明的  



3.記錄和恢復ListView滾動的位置 

有時候我們需要記錄當前ListView滾動到的位置,重新加載的時候要回到原位,不羅嗦,給出代碼: 

Java代碼 
  1. //列表滾動  
  2. private OnScrollListener ScrollLis = new OnScrollListener() {  
  3.    
  4.     @Override  
  5.     public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {  
  6.     }  
  7.    
  8.     @Override  
  9.     public void onScrollStateChanged(AbsListView view, int scrollState) {  
  10.         if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){  
  11.                     ListPos=list.getFirstVisiblePosition();  //ListPos記錄當前可見的List頂端的一行的位置  
  12.             }  
  13.     }  
  14. };  


接下來就是還原位置,放在ListView加載之後: 

Java代碼 
  1. list.setSelection(ListPos);  



4.關於android ListView的美化 

用心的朋友應該會發現,listview中在設置了背景之後。會有些問題。 
1.、listview在拖動的時候背景圖片消失變成黑色背景。等到拖動完畢我們自己的背景圖片才顯示出來。 
2 、listview的上邊和下邊有黑色的陰影。 
3、lsitview的每一項之間需要設置一個圖片做爲間隔。 
針對以上問題 在listview的xml文件中設置一下語句。 


問題1 有如下代碼結解決 android:scrollingCache=”false” 或 android:cacheColorHint=”#00000000″ 
問題2 用如下代碼解決:android:fadingEdge=”none” 
問題3 用如下代碼解決: android:divider=”@drawable/list_driver” 其中 @drawable/list_driver 是一個圖片資源 
 


5.ListView 中添加按鈕,動態刪除添加ItemView的操作 

要實現添加按鈕的操作,必須自定義Adapter,使用Button View的setTag()方法,將Button所屬的位置設置到tag當中
要實現動態添加刪除ItemView的操作,必須首先調整調整Adapter所綁定的數據源,然後調用Adapter的notifyDataSetChanged()方法 

以下爲實現的一個實例 

Java代碼 
  1. package com.jason.joysmsyd;  
  2.    
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.    
  8. import android.app.ListActivity;  
  9. import android.content.Intent;  
  10. import android.os.Bundle;  
  11. import android.view.LayoutInflater;  
  12. import android.view.View;  
  13. import android.view.ViewGroup;  
  14. import android.view.Window;  
  15. import android.view.View.OnClickListener;  
  16. import android.widget.BaseAdapter;  
  17. import android.widget.Button;  
  18. import android.widget.EditText;  
  19. import android.widget.TextView;  
  20.    
  21. public class SendMain extends ListActivity implements OnClickListener{  
  22.    
  23.     Button buttonMessage,buttonContact,buttonHistory;  
  24.     EditText textMessage;  
  25.    
  26.     List<Map<String,String>> contacts = new ArrayList<Map<String,String>>();  
  27.    
  28.    
  29.    
  30.     @Override  
  31.     protected void onCreate(Bundle savedInstanceState) {  
  32.         // TODO Auto-generated method stub  
  33.         super.onCreate(savedInstanceState);  
  34.         this.requestWindowFeature(Window.FEATURE_NO_TITLE);  
  35.    
  36.         this.setContentView(R.layout.layout_send);  
  37.    
  38.         buttonMessage = (Button) this.findViewById(R.id.ButtonMessage);  
  39.         buttonContact = (Button) this.findViewById(R.id.ButtonContact);  
  40.         buttonHistory = (Button) this.findViewById(R.id.ButtonHistory);  
  41.    
  42.         textMessage = (EditText)this.findViewById(R.id.EditTextMessage);  
  43.         textMessage.setText(this.getIntent().getExtras().getString("message"));  
  44.    
  45.     }  
  46.    
  47.     public void onClick(View v) {  
  48.         // TODO Auto-generated method stub  
  49.         switch(v.getId()){  
  50.         case R.id.ButtonMessage:  
  51.             this.finish();  
  52.             break;  
  53.         case R.id.ButtonContact:  
  54.         {  
  55.             Intent intent = new Intent();  
  56.             intent.setAction("com.jason.action.contact");  
  57.             this.startActivityForResult(intent, 0);  
  58.         }  
  59.             break;  
  60.         case R.id.ButtonHistory:  
  61.         {  
  62.             Intent intent = new Intent();  
  63.             intent.setAction("com.jason.action.history");  
  64.             this.startActivityForResult(intent, 1);  
  65.         }  
  66.             break;  
  67.         }  
  68.    
  69.     }  
  70.    
  71.    
  72.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  73.         // TODO Auto-generated method stub  
  74.         super.onActivityResult(requestCode, resultCode, data);  
  75.          if (requestCode == 0 && resultCode == RESULT_OK) {  
  76.             this.getcontactFromString(data.getExtras().getString(  
  77.                     UserSelectActivity.RETURN_LIST));  
  78.             bindDataToList();  
  79.         }  
  80.     }  
  81.    
  82.     private void getcontactFromString(String data) {  
  83.         if (data == null || data.length() == 0) {  
  84.             return;  
  85.         }  
  86.    
  87.    
  88.         String[] arrayContact = data.split("#");  
  89.         for (String singleContact : arrayContact) {  
  90.             if (singleContact != null && singleContact.length() > 0) {  
  91.                 String[] props = singleContact.split(":");  
  92.                 if (props.length == 2) {  
  93.                     Map<String,String> contact = new HashMap<String,String>();  
  94.                     contact.put("name", props[0]);  
  95.                     contact.put("phone", props[1]);  
  96.                     contacts.add(contact);  
  97.    
  98.                 }  
  99.             }  
  100.    
  101.         }  
  102.    
  103.     }  
  104.    
  105.     private void bindDataToList(){  
  106.         this.setListAdapter(new MyAdapter());  
  107.     }  
  108.    
  109.     public class MyAdapter extends BaseAdapter{  
  110.    
  111.         public int getCount() {  
  112.             // TODO Auto-generated method stub  
  113.             return contacts.size();  
  114.         }  
  115.    
  116.         public Object getItem(int position) {  
  117.             // TODO Auto-generated method stub  
  118.             return contacts.get(position);  
  119.         }  
  120.    
  121.         public long getItemId(int position) {  
  122.             // TODO Auto-generated method stub  
  123.             return position;  
  124.         }  
  125.    
  126.    
  127.         public View getView(int position, View convertView, ViewGroup parent) {  
  128.             // TODO Auto-generated method stub  
  129.             LayoutInflater inflater = SendMain.this.getLayoutInflater();  
  130.              final View view = inflater.inflate(R.layout.layout_user_item, null);  
  131.              final TextView textPhone = (TextView) view.findViewById(R.id.text1);  
  132.              final TextView textName = (TextView) view.findViewById(R.id.text2);  
  133.              Button button = (Button)view.findViewById(R.id.buttonDelete);  
  134.    
  135.              textPhone.setText(contacts.get(position).get("phone"));  
  136.              textName.setText(contacts.get(position).get("name"));  
  137.    
  138.              button.setTag( position);  
  139.    
  140.              button.setOnClickListener(new OnClickListener(){  
  141.    
  142.                 public void onClick(View v) {  
  143.                     // TODO Auto-generated method stub  
  144.                     int position = Integer.parseInt(v.getTag().toString());  
  145.                     contacts.remove(position);  
  146.                     MyAdapter.this.notifyDataSetChanged();  
  147.    
  148. //                  SendMain.this.getListView().refreshDrawableState();  
  149.                 }});  
  150.    
  151.    
  152.    
  153.    
  154.             return view;  
  155.         }  
  156.    
  157.     }  
  158. }  



6.Android ListView 清單與其Trigger 觸發事件 

Android ListView 清單與其選擇時的觸發事件, 

可以參考下面的程式範例 : 

Java代碼 
  1. public class helloWorld extends Activity {  
  2.    
  3.     String[] vData = null;  
  4.    
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.    
  8.         // 要做爲ArrayAdapter的資料來源  
  9.         vData = new String[]{"足球","棒球","籃球"};  
  10.    
  11.         // 建立"陣列接收器"  
  12.         ArrayAdapter<String>  arrayData = new ArrayAdapter<String>(  
  13.                 this  
  14.                 , android.R.layout.simple_list_item_1  
  15.                 , vData  
  16.                 );  
  17.    
  18.         // 建立ListView 物件  
  19.         ListView  lv = new ListView(this);  
  20.    
  21.         // 設定ListView 的接收器, 做爲選項的來源  
  22.         lv . setAdapter ( arrayData );  
  23.    
  24.         // ListView 設定Trigger  
  25.         lv . setOnItemClickListener ( new OnItemClickListener() {  
  26.    
  27.             public void onItemClick (AdapterView<?> arg0, View arg1, int arg2,  
  28.                     long arg3) {  
  29.                 // TODO Auto-generated method stub  
  30.                 setTitle( getResources().getString(R.string.app_name) + ": " + vData [ arg2 ]);  
  31.             }  
  32.         });  
  33.    
  34.         // 設定ListView 爲ContentView  
  35.         setContentView(lv);  
  36.     }  
  37. }  

 
 
 



7.ListView內容刷新問題 

最近在學習Android的listView控件時遇到了一個問題,如何添加一個Item到ListView中並及時的刷新出來。在網上查了很多帖子,很多人在問,也很多人在解答,但是總的來說都沒找到詳細的解決方案。對於ListView與數據庫的同步,高手們建議使用ContentProvider對象。但是如果我不使用數據庫呢?也有人回答用notifyDataSetChanged()方法。這倒是一個正確的解決方案,但是對於新手來說,還是比較困惑怎麼去用,這裏我貼一下我的用法: 

Java代碼 
  1. OnClickListener listener2 = new OnClickListener() {  
  2.         @Override  
  3.         public void onClick(View v) {  
  4.             // TODO Auto-generated method stub  
  5.             Map<String, Object> m = new HashMap<String, Object>();  
  6.             String tiString  = tv.getText().toString(); // 注意這裏我爲什麼要取出這個EditText的內容  
  7.             m.put("prod_na", tiString); // 而不這樣寫 m.put("prod_na", tv.getText());  
  8.             m.put("prod_type", tiString); // 因爲tv.getText()返回的是Editable對象,真正的數據是被緩存的,  
  9.                                           // 也就是說你後續的EditText改動都會影響之前添加的Item  
  10.             coll.add(m);  
  11.    
  12.             // 取回Adapter對象,用於調用notifyDataSetChanged方法。  
  13.             SimpleAdapter sAdapter = (SimpleAdapter)lv.getAdapter();  
  14.             sAdapter.notifyDataSetChanged();  
  15.         }  
  16.     };  


這裏涉及到了Android中的MVC模式概念,如何存儲數據,控制和顯示。 

你可以認爲ListView是一個View,那麼mode是什麼呢?顯然是SimpleAdapter對象,而Control又是什麼呢?那隻能是notifyDataSetChanged()了。當數據變化時,也就是SimpleAdapter所處理的數據變化了,那麼我們就需要調用 notifyDataSetChanged 去通知View作出改變。 


8.checkBox的顯示和隱藏。

在listView中,每個item都有一個ChexBox,當顯示的時候在listView外面設置一個按鈕,點擊顯示和隱藏listView中所有的checBox;

開始的我的實現方法爲:

Button add = (Button)findViewById(R.id.add); 
        add.setOnClickListener(new OnClickListener() { 
            @Override 
            public void onClick(View v) {

                if(flage){checkBox.setVisibility(View.VISIBLE);flage=!flage;} 
                else{checkBox.setVisibility(View.GONE);flage=!flage;}                
            } 
        });

後來發現,只能改變listView中第一個checBox,對listView中其他的item不起作用。

以上做法不對,正確的做法是在Adapter中的getView中設置隱藏和顯示,做法如下:

在getView中,

final CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox); 
                if(flage){checkBox.setVisibility(View.VISIBLE);} 
                else{checkBox.setVisibility(View.GONE);}

 

然後在按鈕點擊事件中:

@Override 
            public void onClick(View v) { 
                flage=!flage; 
                mySubscriptionsListAdapt.notifyDataSetChanged(); 
            }

notifyDataSetChanged();是實現listView刷新的功能,不需要再次加載整個listView。

源代碼見:http://henzil.googlecode.com/svn/trunk/android.ListAsyncActivty/


10.ListView隔行設置顏色

Java代碼 
  1. import java.util.HashMap;  
  2. import java.util.List;  
  3.   
  4. import android.content.Context;  
  5. import android.view.View;  
  6. import android.view.ViewGroup;  
  7. import android.widget.SimpleAdapter;  
  8.   
  9. public class SpecialAdapter extends SimpleAdapter {  
  10.     private int[] colors = new int[] { 0x30FF00000x300000FF };  
  11.   
  12.     public SpecialAdapter(Context context, List<HashMap<String, String>> items, int resource, String[] from, int[] to) {  
  13.         super(context, items, resource, from, to);  
  14.     }  
  15.   
  16.     @Override  
  17.     public View getView(int position, View convertView, ViewGroup parent) {  
  18.       View view = super.getView(position, convertView, parent);  
  19.       int colorPos = position % colors.length;  
  20.       view.setBackgroundColor(colors[colorPos]);  
  21.       return view;  
  22.     }  
  23. }  

 

Java代碼 
  1. SpecialAdapter adapter = new SpecialAdapter(this,fillMaps,R.layout.grid_item,from,to);  
  2. ...  

 


11.ListView橫向移動

public class MyListView extends LinearLayout implements OnGestureListener {
    
private GestureDetector mGestureDetector;
    
private ListView mListView;
    
    
public MyListView(Context context) {
        super(context);
        mGestureDetector 
= new GestureDetector(this);
        mListView 
= new ListView(context);
        String[] items 
= createStrings();
        mListView.setAdapter(
new ArrayAdapter<String>(context,
                android.R.layout.simple_list_item_single_choice, items));
        mListView.setCacheColorHint(Color.TRANSPARENT);
        mListView.setScrollBarStyle(SCROLLBARS_OUTSIDE_INSET);
        mListView.setOnItemClickListener(
new OnItemClickListener() {
            @Override
            
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    
long arg3) {
                Log.i(
"info""click");
            }
        });
        
this.addView(mListView, new LinearLayout.LayoutParams(350, LayoutParams.FILL_PARENT));
    }
    
    @Override
    
public boolean onDown(MotionEvent arg0) {
        
return false;
    }

    @Override
    
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            
float velocityY) {
        
return true;
    }

    @Override
    
public void onLongPress(MotionEvent e) {
        
//empty    
    }

    @Override
    
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            
float distanceY) {
        
int scrollWidth = mListView.getWidth() - this.getWidth();
        
if ((this.getScrollX() >= 0&& (this.getScrollX() <= scrollWidth) && (scrollWidth > 0)) {
            
int moveX = (int)distanceX;
            
if (((moveX + this.getScrollX()) >= 0&& ((Math.abs(moveX) + Math.abs(this.getScrollX())) <= scrollWidth)) {
                
this.scrollBy(moveX, 0);
            }
            
else {
                
if (distanceX >= 0) {
                    
this.scrollBy(scrollWidth - Math.max(Math.abs(moveX), Math.abs(this.getScrollX())), 0);
                }
                
else {
                    
this.scrollBy(-Math.min(Math.abs(moveX), Math.abs(this.getScrollX())), 0);
                }
            }
        }
        
return true;
    }

    @Override
    
public void onShowPress(MotionEvent e) {
        
//empty
    }

    @Override
    
public boolean onSingleTapUp(MotionEvent e) {
        
return false;
    }
    
    @Override
    
public boolean dispatchTouchEvent(MotionEvent ev){
        mGestureDetector.onTouchEvent(ev);
        super.dispatchTouchEvent(ev);
        
return true;
    }
    
    
private String[] createStrings() {
        
return new String[] {
                
"Abbaye de Belloc""Abbaye du Mont des Cats""Abertam""Abondance""Ackawi",
                
"Acorn""Adelost""Affidelice au Chablis""Afuega'l Pitu""Airag""Airedale",
                
"Aisy Cendre""Allgauer Emmentaler""Alverca""Ambert""American Cheese",
                
"Ami du Chambertin""Anejo Enchilado""Anneau du Vic-Bilh""Anthoriro""Appenzell",
                
"Aragon""Ardi Gasna""Ardrahan""Armenian String""Aromes au Gene de Marc",
                
"Asadero""Asiago""Aubisque Pyrenees""Autun""Avaxtskyr""Baby Swiss",
                
"Babybel""Baguette Laonnaise""Bakers""Baladi""Balaton""Bandal""Banon",
                
"Barry's Bay Cheddar""Basing""Basket Cheese""Bath Cheese""Bavarian Bergkase",
                
"Baylough""Beaufort""Beauvoorde""Beenleigh Blue""Beer Cheese""Bel Paese",
                
"Bergader""Bergere Bleue""Berkswell""Beyaz Peynir""Bierkase""Bishop Kennedy",
                
"Blarney""Bleu d'Auvergne""Bleu de Gex""Bleu de Laqueuille",
                
"Bleu de Septmoncel""Bleu Des Causses""Blue""Blue Castello""Blue Rathgore",
                
"Blue Vein (Australian)""Blue Vein Cheeses""Bocconcini""Bocconcini (Australian)",
                
"Boeren Leidenkaas""Bonchester""Bosworth""Bougon""Boule Du Roves",
                
"Boulette d'Avesnes""Boursault""Boursin""Bouyssou""Bra""Braudostur",
                
"Breakfast Cheese""Brebis du Lavort""Brebis du Lochois""Brebis du Puyfaucon",
                
"Bresse Bleu""Brick""Brie""Brie de Meaux""Brie de Melun""Brillat-Savarin",
                
"Brin""Brin d' Amour""Brin d'Amour""Brinza (Burduf Brinza)",
                
"Briquette de Brebis""Briquette du Forez""Broccio""Broccio Demi-Affine",
                
"Brousse du Rove""Bruder Basil""Brusselae Kaas (Fromage de Bruxelles)""Bryndza",
                
"Buchette d'Anjou""Buffalo""Burgos""Butte""Butterkase""Button (Innes)",

                "Buxton Blue""Cabecou""Caboc""Cabrales""Cachaille""Caciocavallo"

轉自:http://blog.csdn.net/skydsai/article/details/6745277

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章