Day1
今天看了listView,并对简单的列表选择进行了实现。
首先明确一下适配器的概念,就我个人理解而言,就是连接layout.xml和Activity.java的桥梁。在xml中定义一个listView,在Java中创建一个数组,数组用于创建adapter(这里adapter也可以理解成数据源的样子),然后add到listView上。
按适配器分,listView可以分为ArrayAdapter,SimpleAdapter,SimpleCusorAdapter和自定义Adapter。
根据我学习的书本,今天实现了ArrayAdapter和自定义Adapter。
ArrayAdapter:构成listView数据项的就是简单的数组
在xml:简单的拖曳textView和listView,给他们定义id.
在java:创建数组,创建适配器(调用数组),给listView添加适配器。
为了使效果更加明显,给listView添加OnItemClick方法,实现OnCLick方法,获取到它的ToString值,赋给TextView,这样就能很直观的体现出来了。
其中listView又可以实现 单选和多选 两种模式,改一下Adapter的layout和listView的choiceMode就可以.
按照书上的跑了一遍例子,代码如下:
1 public class ListView1 extends ActionBarActivity { 2 3 private TextView textView; 4 private TextView txtContent; 5 private ListView listView; 6 private Button button; 7 int count =0; 8 String [] Balls = new String[]{"basketball","soccer","baseball","篮球","足球","排球"}; 9 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.activity_list_view1); 14 txtContent =(TextView)findViewById(R.id.textView); 15 textView =(TextView)findViewById(R.id.textView2); 16 listView = (ListView)findViewById(R.id.listView); 17 button = (Button)findViewById(R.id.button); 18 //单选 19 // ArrayAdapter<String>adapterBalls = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,Balls); 20 //多选 21 ArrayAdapter<String>adapterBalls = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,Balls); 22 listView.setAdapter(adapterBalls); 23 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);//可多选 24 count = adapterBalls.getCount(); 25 button.setOnClickListener(btnListener); 26 27 listView.setOnItemClickListener(lstListener); 28 listView.setTextFilterEnabled(true); 29 listView.setSelector(R.drawable.tar); 30 listView.setSelection(3); 31 } 32 private ListView.OnItemClickListener lstListener = new ListView.OnItemClickListener(){ 33 public void onItemClick(AdapterView<?>parent,View v,int position,long id){ 34 //单选 35 // String sel = parent.getItemAtPosition(position).toString(); 36 // textView.setText("我最喜欢的球类运动:"+sel); 37 if(listView.isItemChecked(position)){ 38 String sel = parent.getItemAtPosition(position).toString();//parents??? position是指选项的位置。 39 txtContent.setText("目前选择:"+sel); 40 }else{ 41 txtContent.setText("目前选择:"); 42 } 43 } 44 }; 45 46 private Button.OnClickListener btnListener = new Button.OnClickListener(){ 47 public void onClick(View v){ 48 String selAll = ""; 49 for(int i=0;i<count;i++){ 50 if(listView.isItemChecked(i)) {//已复选 51 selAll +=Balls[i]; 52 } 53 } 54 textView.setText(selAll); 55 } 56 }; 57 }
自定义Adapter:构成listView数据项的是由自己定义的,类似结构体。
就是比如你的listView中的每一个选项都需要一张图片,一行简介和一个按钮。
那你最好自己自定义一个layout,里面有你想设计成的item的样式,再在Java中重写适配器,因为要达到一种效果就是new 适配器的时候,要把item里面的所有元素都初始化好。
在xml:一个是本来就有的xml,里面就有textView和ListView,另一个额外的xml是你自己设定的item的样式。
在java:按照普通的listView来实现,然后在onCreat()方法下面新建一个内部类myAdapter,继承自BaseAdapter,主要实现他的getView功能就OK。
1 package com.example.administrator.myapplication; 2 3 import android.content.Context; 4 import android.support.v7.app.ActionBarActivity; 5 import android.os.Bundle; 6 import android.view.LayoutInflater; 7 import android.view.Menu; 8 import android.view.MenuItem; 9 import android.view.View; 10 import android.view.ViewGroup; 11 import android.widget.BaseAdapter; 12 import android.widget.ImageView; 13 import android.widget.ListView; 14 import android.widget.TextView; 15 /* 16 自定义list列表 17 自定义list的item的布局 my_adaoter.xml 18 自定义适配器MyAdapter 内部类 19 */ 20 21 public class ListView2 extends ActionBarActivity { 22 23 private TextView txtName; 24 private ListView listName; 25 int [] resIds = new int[]{R.drawable.tar,R.drawable.serach}; 26 String []Balls = new String[]{"星星","搜索"}; 27 String []engNames = new String[]{"star","search"}; 28 MyAdapter adapter = null; 29 @Override 30 protected void onCreate(Bundle savedInstanceState) { 31 super.onCreate(savedInstanceState); 32 setContentView(R.layout.activity_list_view2); 33 txtName = (TextView)findViewById(R.id.textView3); 34 listName = (ListView)findViewById(R.id.listView2); 35 adapter=new MyAdapter(this); 36 listName.setAdapter(adapter); 37 } 38 39 public class MyAdapter extends BaseAdapter { 40 private LayoutInflater myInflater; 41 public MyAdapter(Context c){ 42 myInflater=LayoutInflater.from(c); 43 } 44 public int getCount(){ 45 return Balls.length; 46 } 47 public Object getItem(int position){ 48 return Balls[position]; 49 } 50 public long getItemId(int position){ 51 return position; 52 } 53 public View getView(int position,View convertView,ViewGroup parent){ 54 convertView=myInflater.inflate(R.layout.activity_my_adapter,null); 55 //获取myadapter.xml中的组件 56 ImageView imgLogo = (ImageView)convertView.findViewById(R.id.imageView); 57 TextView txtName = (TextView)convertView.findViewById(R.id.txtName); 58 TextView txtEngName = (TextView)convertView.findViewById(R.id.txtEngName); 59 //设置组件内容 60 imgLogo.setImageResource(resIds[position]); 61 txtName.setText(Balls[position]); 62 txtEngName.setText(engNames[position]); 63 64 return convertView; 65 } 66 } 67 68 }
THE ENDDING......
1.敲代码的时候打listView.后面就会出现好多的方法,觉得最好的学习还是要看一下API之类的官方文档,学习掌握更加全面。
2.现在过第一遍的确是理解了,但这个东西吧,特别容易忘,几天不上手就容易记忆模糊,需要在记忆方面下点苦功。多尝试不借助外力,徒手实现代码。
3.关于SimpleAdapter,SimpleCusorAdapter,内容和思想也和上述的Adapter也大致相同吧,下次补上。