android listview listadapter,Android学习笔记:ListView及BaseAdapter使用

ListView是Android中常用的重要组件之一,基本上所有软件基本都会使用ListView,所以要对ListView非常熟悉。

先看看程序效果图:

28d636952bf0d2cf8b3e2346119b0ee9.png

ListView的样式很多,有纯文字型,带图片显示,带按钮的等等。本次演示一个带图片的ListView。

①布局文件:

在ListView程序中,布局文件相比其他普通控件会多出至少一个,其原因是还需要一个关于ListView里面内容条目的布局文件。

内容条目的布局文件 listview_item.xml :<?xml  version="1.0" encoding="utf-8"?>

android:layout_width="match_parent"

android:layout_height="?android:attr/listPreferredItemHeight">

android:id="@+id/id_p_w_picpathview"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/ic_launcher"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true"/>

android:id="@+id/id_tv_title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_toRightOf="@id/id_p_w_picpathview"

android:layout_marginLeft="15dp"

android:layout_alignParentTop="true"

android:textSize="22sp"

android:textStyle="bold"

android:text="title"/>

android:id="@+id/id_tv_desc"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_toRightOf="@id/id_p_w_picpathview"

android:layout_below="@id/id_tv_title"

android:layout_marginLeft="15dp"

android:textSize="18sp"

android:text="long long ago story"/>

看了代码应该就明白了我上面说的ListView内容条目的布局指的就是

17f1a0609ba692d6df1f9c1e14ac8aab.png这样一条条的布局文件

另外一个布局文件,整个android程序的总体布局文件 activity_main.xml :

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.example.testlistview.MainActivity" >

android:id="@+id/listview_ll"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

android:id="@id/android:list"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:drawSelectorOnTop="true"

android:scrollbars="vertical"/>

只有一个 其中scrollbars="vertical"意思是如果条目很多,滚动时会滚动条是垂直的。

②Android代码

MainActivity.javapackage com.example.testlistview;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import android.app.ListActivity;

import android.content.Context;

import android.os.Bundle;

import android.widget.SimpleAdapter;

/**

* 注意继承的是ListActivity

* @author jam

*

*/

public class MainActivity extends ListActivity {

private List> list;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

list = new ArrayList>();

Map map1 = new HashMap();

Map map2 = new HashMap();

Map map3 = new HashMap();

//三项,分别是图片,大标题,内容

map1.put("avatar", R.drawable.add_option);

map1.put("user_name", "zhangsan");

map1.put("user_ip", "192.168.1.0");

map2.put("avatar", R.drawable.add_pic);

map2.put("user_name", "lisi");

map2.put("user_ip", "192.168.1.1");

map3.put("avatar", R.drawable.ic_launcher);

map3.put("user_name", "wangwu");

map3.put("user_ip", "192.168.1.2");

list.add(map1);

list.add(map2);

list.add(map3);

//使用SimpleAdapter的方法

/**

* 四个参数

* 第一个参数是当前的Context

* 第二个参数,是数据来源list

* 第三个第四个相当于键值对的关系

*/

/*setListAdapter(new SimpleAdapter(getApplicationContext(), list,

R.layout.listview_item,

new String[] {"user_name", "user_ip"},

new int[] {R.id.id_tv_title, R.id.id_tv_desc}));*/

//设置Adapter

setListAdapter(new MyBaseAdapter(getApplicationContext(), list));

}

}

其中MyBaseAdapter.java代码:package com.example.testlistview;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.TextView;

/**

* 继承BaseAdapter

* 相对于SimpleAdapter来说显得麻烦,但带来了更多好处

* @author jam

*

*/

public class MyBaseAdapter extends BaseAdapter {

private LayoutInflater myInfalater;

private List> list;

public MyBaseAdapter(Context context, List> list) {

super();

this.list = list;

myInfalater = LayoutInflater.from(context);

}

@Override

public int getCount() {

return list.size();

}

@Override

public Object getItem(int position) {

return position;

}

@Override

public long getItemId(int positionId) {

return positionId;

}

//重要的重写方法

@Override

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

ViewHolder viewHolder;

if(convertView == null) {

convertView = myInfalater.inflate(R.layout.listview_item, null);

viewHolder = new ViewHolder();

viewHolder.avatar = (ImageView) convertView.findViewById(R.id.id_p_w_picpathview);

viewHolder.title = (TextView) convertView.findViewById(R.id.id_tv_title);

viewHolder.desc = (TextView) convertView.findViewById(R.id.id_tv_desc);

convertView.setTag(viewHolder);

} else {

viewHolder = (ViewHolder) convertView.getTag();

}

viewHolder.avatar.setBackgroundResource((Integer) list.get(position).get("avatar"));

viewHolder.title.setText((CharSequence) list.get(position).get("user_name"));

viewHolder.desc.setText((CharSequence) list.get(position).get("user_ip"));

return convertView;

}

private class ViewHolder {

ImageView avatar;

TextView title;

TextView desc;

}

}

说明

BaseAdapter是一个很常用的Adapter,是一个抽象类,需要重写很多方法。

在Adapter中先调用getCount()方法,得到ListView的长度,根据这个长度逐一绘制ListView的每一行

onvertView相当于一个缓存,开始为0,当有条目变为不可见,它缓存了它的数据,后面再出来的条目只需要更新数据就可以了,这样大大节省了系统资料的开销

ViewHolder的应用 :

View的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,之后就用convertView.getTag();方法来获得ViewHolder对象。

通俗的说,inflate就相当于将一个xml中定义的布局找出来.

因为在一个Activity里如果直接用findViewById()的话,对应的是setConentView()的那个layout里的组件.

因此如果你的Activity里如果用到别的layout,比如对话框上的layout,你还要设置对话框上的layout里的组件(像图片ImageView,文字TextView)上的内容,你就必须用inflate()先将对话框上的layout找出来,然后再用这个layout对象去找到它上面的组件。

另外这里有些BaseAdapter相关资料:

http://www.open-open.com/lib/view/open1339485728006.html

http://android.tgbus.com/Android/tutorial/201104/348009.shtml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
以下是Android Studio中ListView学习方法和实现步骤: 1. 在布文件中添加ListView控件,设置其id和布局参数。 ```xml <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 在Activity中获取ListView控件,并为其设置适配器。 ```java ListView listView = findViewById(R.id.list_view); listView.setAdapter(adapter); ``` 3. 创建适配器Adapter,继承自BaseAdapter,并实现其中的四个方法:getCount()、getItem()、getItemId()和getView()。其中getView()方法是最重要的,用于设置每个列表项的布局和内容。 ```java public class MyAdapter extends BaseAdapter { private List<String> mData; private LayoutInflater mInflater; public MyAdapter(Context context, List<String> data) { mData = data; mInflater = LayoutInflater.from(context); } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item, parent, false); holder = new ViewHolder(); holder.textView = convertView.findViewById(R.id.text_view); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.textView.setText(mData.get(position)); return convertView; } private static class ViewHolder { TextView textView; } } ``` 4. 创建列表项的布局文件list_item.xml,设置其中的控件和布局参数。 ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:padding="16dp" /> </LinearLayout> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值