自定义Spinner下拉列表样式

从前天开始一直在忙活制作Spinner下拉列表的制作,相关的ListView列表自定义样式倒是很成熟,但是Spinner的制作一直不顺利,脑袋很疼现在.从开发者文档看到源码,所获甚少,主要是大环境都不清楚.我整理一下思路,这个问题一定会解决,我要找的是最好最快的方法.


 一:问题:

   1.主要是代码看的不透彻,粗略看过去没什么收获的,明天找相关源码看的时候要细节化处理,就算没搞懂,最起码多了一些正确的思路,而不是瞎想.

   2.相关的方法和类要吃透,要去看源码和文档,就算当时看不懂,但是积少成多,总有能看懂的那天.得培养这个习惯.

 

    二:优点:

           1.测试类的处理很好,这是个稳法子,值得新手开发使用

   2.即使再乱,再迷惑,也没放弃要找到最佳答案的决心,思路还算明确,要加油.


 三:解决进展

   1.Spinner由两部分组成,显示行和下拉行.

   2.getDropDownView负责下拉的样式,需要在适配器中声明


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

   1.显示行的源代码(注意根节点必须为TextView类,)


命名为title_of_spinner.xml;





   2.下拉行的源代码(我选用了图像和文本结合的形式)

命名为item_of_spinner.xml;




   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和汇编可能是个好办法.





         


 

   


你可能感兴趣的:(Android)