自定義Spinner下拉列表樣式

從前天開始一直在忙活製作Spinner下拉列表的製作,相關的ListView列表自定義樣式倒是很成熟,但是Spinner的製作一直不順利,腦袋很疼現在.從開發者文檔看到源碼,所獲甚少,主要是大環境都不清楚.我整理一下思路,這個問題一定會解決,我要找的是最好最快的方法.


 一:問題:

   1.主要是代碼看的不透徹,粗略看過去沒什麼收穫的,明天找相關源碼看的時候要細節化處理,就算沒搞懂,最起碼多了一些正確的思路,而不是瞎想.

   2.相關的方法和類要吃透,要去看源碼和文檔,就算當時看不懂,但是積少成多,總有能看懂的那天.得培養這個習慣.

 

    二:優點:

           1.測試類的處理很好,這是個穩法子,值得新手開發使用

   2.即使再亂,再迷惑,也沒放棄要找到最佳答案的決心,思路還算明確,要加油.


 三:解決進展

   1.Spinner由兩部分組成,顯示行和下拉行.

   2.getDropDownView負責下拉的樣式,需要在適配器中聲明


 四:解決,先寫下我的方法,再寫上我的心得和疑惑,以及下一步方向

   1.顯示行的源代碼(注意根節點必須爲TextView類,)


命名爲title_of_spinner.xml;

<?xml version="1.0" encoding="utf-8"?>



   2.下拉行的源代碼(我選用了圖像和文本結合的形式)

命名爲item_of_spinner.xml;
<?xml version="1.0" encoding="utf-8"?>



   3.因爲是圖像與文本形式,我們新建類:Example進行數據封裝

命名爲Example.java.重寫構造方法,並且對外開放讀取兩種數據的方法
package com.wangxu.ex_of_ps;

public class Example {
	
	private String name;
	private int imageId;
	
	public Example(String name,int imageId){
	    this.name = name;
	    this.imageId = imageId;
	}
	
	public String getName(){
		return name;
	}
	
	public int getImageId(){
		return imageId;
	}

}


   4.定製配適器,重寫方法

命名爲MyAdapter.java
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MyAdapter extends ArrayAdapter {
	private int textViewId;
	
	//重寫構造方法,將spinner第一行的佈局傳入,進行初始化.再次注意:第一行佈局根節點必須是TextView
	public ArrayAdapterofCouple(Context context,int textViewId,List example){
		super(context,textViewId,couple);
		this.textViewId = textViewId;
		
	}
	
	//重寫getDropDownView方法,個性化下拉列表
	@Override
	public View getDropDownView(int position, View convertView, ViewGroup parent) {

        //通過list[position]獲取當前Example實例
		Example example= getItem(position);
		
		//將顯示行佈局傳入,進行顯示行佈局配置
		View view = LayoutInflater.from(getContext()).inflate(R.layout.item_of_spinner, null);
		
		TextView text = (TextView) view.findViewById(R.id.textOfItems);
		ImageView image = (ImageView) view.findViewById(R.id.imageOfItems);
		
		text.setText( example.getName() );
		image.setBackgroundResource( example.getImageId());
		
		return view;
		
	}

}


   5.MainActivity的源代碼(只用一個Spinner演示,命名爲sp)
package com.wangxu.ex_of_ps;

import android.os.Bundle;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import java.util.List;

public class MainActivity extends Activity {
	
	private Spinner sp;
	private List list;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		initialize();
		
//準備數據源
        
        Example one = new Example("first",R.drawable.first);//填充你自己的文字和圖片
	    Example two = new Example("two",R.drawable.second);
	    Example three = new Example("third",R.drawable.third);
	    
	    list = new ArrayList();
	    
        list.add(one);
        list.add(two);
        list.add(three);
        
//將數據源傳入配適器
//             第二個arg要傳入第一行佈局,再再再次強調,根節點必須爲TextView	
		ArrayAdapter adapter = new ArrayAdapter(getBaseContext(), R.layout.title_of_spinner, list) ;
      
//spinner加載配適器
        sp.setAdapter(adapter);
	}
	
	public void initialize(){
	    sp = (Spinner) findViewById(R.id.spinner1);
	    

	}

}



 五:心得要點已經寫入註釋了,下面是疑惑.也就是說,解決的不徹底的
  
   1.Context類.大部分目前我看到的是需要傳入context類的參數.根據面嚮對象語言的特點,利用多態我們可以傳入Context類對象或者其子類對象.根據官方文檔,我們看一下繼承樹:

                java.lang.Object
                            ---->   android.content.Context
                                            ---->  Context.Wrapper   &&   MockContext  

               這裏只寫了下直接子類,它更有幾個我們所熟知的間接子類,比如Activity / Application 等等
   
看一下它的官方簡紹(水平不好,勉強翻譯一下):
:Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
:Context是一個關於應用環境的全局信息的接口,它是一個由安卓系統提供實現方法的抽象類,允許對應用級別的資源和類進行操作,當然也包括應用級別的操作,比如說開啓活動.廣播,接受信使(intent),等等.  

我主要疑惑的是爲什麼要傳入Context context,源碼也沒看懂,主要是太多,完全不知道從何入手,這個問題暫時要遺留下來.   

  2.LayoutInflater.inflate.from(Context context)方法:
             :Obtains the LayoutInflater from the given context
             :從指定Context中獲取LayoutInflater實例
    
             LayoutInflater.inflater(int resource, ViewGroup root);
            :Inflate a new view hierarchy from the specified xml resource.
       :將指定的xml佈局文件轉化爲View對象
這部分還算清楚,可能是因爲官方文檔寫的好吧


   6.最後
     可能是Context類比較接近底層,而我的底層技術不過關.有必要對這一塊進行下補充,也許,只是也許,c和彙編可能是個好辦法.





         


 

   


發佈了56 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章