您的位置:首页 > 移动开发 > Android开发

Android开发笔记----listview的使用

2015-08-09 10:00 429 查看
建立一个listview

我们需要建立两个变量,一个listview型的,一个adapter类型的,其中listview是用来建立目录栏项的,adapter是一种适配器,会有不同的子类,用于控制如何显示每一个列表项,并且还可以控制显示多少个列表项,即listview是一个容器,可以装入多个adapter,来显示列表项。我们这里采用的是arrayAdapter这个子类,我们需要选定adapter的样式,所以我们需要在layout下建立一个新的xml文件,由于arrayAdapter是需要textview型的,所以我们只需要建立这样的xml文件即可(我们也可以用Android写好的提供给我们的),然后我们把adapter加入到listview中,并通过adapter加入几个列表项。

private ListView lv;

private ArrayAdapter<String> adapter;

adapter=new ArrayAdapter<String>(this, R.layout.user_listview);



lv=(ListView) findViewById(R.id.listView1);

v.setAdapter(adapter);



adapter.add("hello");

adapter.add("learn");

baseadapter的使用

baseadapter比arrayAdapter更加地灵活,人为操作性更强,我们可以更加方便地控制每一个列表项的样子。但是baseadapter是一个抽象类我们要想实现它的功能,所有的方法均需要自己重写。因为是把抽象类建立对象,所以我们需要建立其匿名子类,并重写方法。我们在这个子类中可以建立我们自己所需要的一切数据,比如我代码中写的string[]这个数据,与上面提到的arrayAdapter<string>就是相似的功能,但是我们可以写更多的数据以便我们使用

private BaseAdapter adapter=new BaseAdapter() {

private String[] usr=new String[]{"hello1","hello2","hello3","hello4","hello5","hello6"};

@Override

public View getView(int position, View convertView, ViewGroup parent) {

//这个是整个adapter的核心函数,通过这个函数,我们就能把每个列表项的信息返回出来,用于显示,为此我们建立了一个textview这就是我们每个列表项的样式,

//之后我们设置字体,与内容,并将这个textview返回,这样在显示的时候就可以将这个textview显示出来,可以认为listview中每一个子元素都是textview,可以把listview理解成

//一个外部容器,向其中添加各类相同的元素

TextView tv =new TextView(custom_listview.this);

tv.setTextSize(20);

tv.setText(getItem(position));

return tv;

}

@Override

public long getItemId(int position) {

// 这个是返回列表项的位置数值

return position;

}

@Override

public String getItem(int position) {

// 这个是你要返回的item的信息值

return usr[position];

}

@Override

public int getCount() {

// 这个是返回listview中表项的个数

return usr.length;

}

};

以上的代码可以简单地实现列表项的显示,但存在着一个占用内存的问题就是,没显示一个列表项,就会需要建立一个textview型的变量,如果列表较多,且用户不断地上滑下滑,那么久会建立许多的变量,会让程序便的异常的卡,难执行。我们可以看getView那个函数,在参数中,有一个 View convertView,这个是Android自带的view回收机制,用来回收使用过的view,也就是一旦,列表项在滑动的时候移开屏幕,是会被回收到convertView中的,我们便无需新建一个textview,而是直接获取回收的就ok了,代码如下

TextView tv;

if(convertView!=null)

{

tv=(TextView) convertView;

}

else

{

tv =new TextView(custom_listview.this);

}

更高级的自定义列表项

我们还是用上面所提到过的baseadapter,只不过我们更改上面所用的textview,我们通过自己新建一个view来实现每一个列表,由于列表是一行一行的,所以我们采取了linearLayout的布局方式来xml代码如下

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal" >

<ImageView

android:id="@+id/img"

android:layout_width="120dp"

android:layout_height="wrap_content"

android:layout_weight="1"

/>

<LinearLayout

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_weight="1"

android:orientation="vertical"

>

<TextView

android:id="@+id/textView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Large Text"

android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView

android:id="@+id/textView2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Small Text"

android:textAppearance="?android:attr/textAppearanceSmall" />



</LinearLayout>

</LinearLayout>

就是一个普通的linearlayout只不过是在加一个linearLayout,做成一个复合的列表项,之后我们在主activity上重写getView方法,我们需要返回的是一个linearLayout型的变量,并让这个变量中的值弄好,代码如下,我们需要特别注意图片型资源变量,怎么弄,由于Android都通过R.java来控制资源,所以我们把各类资源变量均弄成int型的更加方便我们使用以及控制,然后在调用方法,将图片绑定上即可

new data("image1","dec img1",R.drawable.img1),

new data("image2","dec img2",R.drawable.img2),

new data("image3","dec img3",R.drawable.img3)

};

@Override

public View getView(int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

LinearLayout ll =null;

if(convertView != null)

{

ll=(LinearLayout) convertView;

}

else

{

ll=(LinearLayout) LayoutInflater.from(custom_listview.this).inflate(R.layout.img_listview,null);

}

data dd=getItem(position);

ImageView icon=(ImageView) ll.findViewById(R.id.img);

TextView tv1=(TextView) ll.findViewById(R.id.textView1);

TextView tv2=(TextView) ll.findViewById(R.id.textView2);

icon.setImageResource(dd.iconId);

tv1.setText(dd.name);

tv2.setText(dd.dec);

return ll;

最后呢,我们试一下简单地构建一个带listview的activity

我们采用的继承类是ListActivity,这是一个带有listview的activity,我们只需要调用这个setAdapter方法调用我们上面所写的继承于baseAdapter类即可。

这个继承的类还可以方便地组合listview和其他元素,我们只要在新建一个这样的xml文件即可,然后用setContentView(R.layout.new_list_aty);方法即可,即能够将新建的带有listview的布局建立,并能够将listview中的没一项设成baseAdapter子类的模式。但是需要注意一点,这个xml文件中的listview的id必须是@android:id/list才行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: