部分内容借鉴自一下网站:
listview与adapter用法
http://www.cnblogs.com/zhengbeibei/archive/2013/05/14/3078805.html
Baseadapter的 getItem 跟 getItemId 的作用和重写
http://www.csdn123.com/html/exception/667/667664_667666_667660.htm
getView方法详解
http://blog.csdn.net/yelbosh/article/details/7831812
Adapter内的onItemClick监听器四个arg参数
http://blog.sina.com.cn/s/blog_618199e60101071l.html
ListView的使用是结合适配器adapter,这里我只介绍使用BaseAdapter的情况。
基本步骤:
定义一个类继承BaseAdapter,我这里将名字设为TextImageAdapter .
public class TextImageAdapter extends BaseAdapter{}
(1)
类里面一般需要创建LayoutInflater类型的变量。
Private LayoutInflater mInflater;
(2)
然后重写构造函数:
Public TextImageAdapter(Context context){
this.mInflater = LayoutInflater.from(context);
}
(3)
定义getItem(int position),getItemId(int position)函数。前者表示获取特定位置的数据项,后者得到的是position对应的id。
(4)
定义getCount(),系统要开始创建ListView时,先调用getCount()函数,得到ListView的总长度。然后每一行再根据getView()函数进行创建。所以我们需要在该函数里面返回要显示数据的总长度。
(5)
重写getView(int position, View convertView, ViewGroup viewgroup),第一个参数表示在列表中下一个要消失的item的位置,即如果是向上滑就是最上端的item的位置,下滑就是最下端。第二个表示列表中刚刚消失的item,最后一个保存的是整个要显示的item的集合。接下来我们看看代码:
public View getView(int position, View convertView, ViewGroup viewgroup){
ViewHolder viewHolder;
int imageId;
if(convertView == null){
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.activity_speakers_home_item, null);
viewHolder.text_name = (TextView)convertView.findViewById(R.id.speakers_name);
viewHolder.icon = (ImageView)convertView.findViewById(R.id.speakers_head);
viewHolder.text_title = (TextView)convertView.findViewById(R.id.speakers_title);
convertView.setTag(viewHolder );
}else{
viewHolder = (ViewHolder)convertView.getTag();
}
String str_name = mspeakerlist.get(position).getPicture();
imageId= getResources().getIdentifier(str_name, "drawable", getPackageName() );
if(imageId >0) {
viewHolder.icon.setImageResource(imageId);
}else{
viewHolder.icon.setImageResource(R.drawable.default_speaker);
}
viewHolder.text_name.setText(mspeakerlist.get(position).getName());
viewHolder.text_title.setText(mspeakerlist.get(position).getTitle() );
return convertView;
}
class ViewHolder{
public ImageView icon;
public TextView text_name;
public TextView text_title;
}
首先需要创建一个缓冲区,该缓冲区是一个新建的类,保存有每个item的控件。然后对convertView进行判断,等于null表示是刚刚载入ListView,所以需要在这里将缓冲区内的控件进行初始化,指明他们对应的是每个item里面的控件,初始化完之后还需要使用setTag()将缓冲区放入到convertView中。如果不等于null,即并不是刚开始载入该ListView,是所以我们需要用getTag()从convertView提取出放到缓冲区中。
之后就是对缓冲区的每个控件进行内容的设定。这里需要注意到是:使用BaseAdapter我们并不一定要将数据保存在ArrayList<Map<Object, Object>>
的形式中,你可以自己定义保存数据的类型。
以上的函数是放在onCreate(Bundle savedInstanceState)之外,但以上这些前提都设置好了之后,我们就应该把ListView显示出来,一下操作是放在onCreate(Bundle savedInstanceState)。
1.创建ListView
ListView listView = (ListView) findViewById(android.R.id.list);
3.通过.setAdapter()来设置适配器。
listView.setAdapter(new TextImageAdapter(this));
到这里时ListView的显示就完成了。但如果你想要对每一项的点击做出反应的话,就需要定义监听器了。代码如下:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
startActivity(intent_Item);
}
});
重点讲解onItemClick函数的参数,第一个相当于适配器的一个指针,告诉你该ListView对应的适配器是谁,可以获得适配器中的一切东西。第二个表示你所点击的那个item的view的句柄,可以通过这个view获得对应item里的控件。第三个和第四个大部分情况都一样,表明你点击的那个item是在第几行。