ListView学习(1)-SimpleAdapter的学习
博客专区 > chuiyuan 的博客 > 博客详情
ListView学习(1)-SimpleAdapter的学习
chuiyuan 发表于4年前
ListView学习(1)-SimpleAdapter的学习
  • 发表于 4年前
  • 阅读 412
  • 收藏 3
  • 点赞 0
  • 评论 0

腾讯云 学生专属云服务套餐 10元起购>>>   

摘要: 主要学习SimpleAdapter. 具有很高的扩展性。 先讲一个简单的 ,只显示固定的图片和文字 ,再讲一个显示图片和文字 的。 可以 在最后的程序 中加入 跳转的界面 ,如同一般聊天 软件

注意:

(1) 在Spinner 中监听 用 selected , 在ListView 中用 click。

一。首先是xml文件

    这里公两个部分,一是主要 的listview.xml,一是子项的XMl文件,item.xml

(1) listview.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

(2) item.xml 

    两个部分,图片和文字 。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@android:drawable/ic_menu_edit" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>


二。java部分

步骤:

(1)得到ListView 对象 

(2)将原始数据转换成Adapter 要的数据结构。这个 是使用Adapter  中的一个难点 。

(3)新建Adapter 对象 。选择很多,可以自定义 ,这里先用简单点的,SimpleAdapter类,构造方法为:

SimpleAdapter (Context context ,
                    List<? extends Map<String ,?> >data ,
                    int resource,
                    String [] from,
                    int [] to );

参数二:数据源,键 一定要是String , 值 常常也是用的String 。

参数三:资源 的 Id ,也就是每个子项的布局文件(如item.xml的id )。

参数四:数据源(第二个参数)中的 KEY ,通过 这个 得到数据源中的 value ./

参数五:item.xml 文件中 要显示数据 的地方 的 Id ,如上面 的就是textView1 .

(4) 为 ListView 配置Adpater 

ListView.setAdapter (ListAdapter adapter );


 三。下面开始实例 :

原始安徽据源:String [ ] names

Adapter 要用的数据源的格式 :  List <HashMap<String  ,String >> listItem .   这里不能写成  Map

难点在于怎么将原始数据源转换成  Adapter  可用的数据 源。

可以 将names[i]一个个保存到 一个HashMap name 中,然后将这个 HashMap 加入 到  listItem 中。

(1)下面是整体架构 

public class ListDemo extends Activity {
	private String[] names ;      //原始 数据 源
	private List<HashMap<String, String>> listItem ;  //adapter要用的格式 的数据 源
	private ListView lv ;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.listview);		
		
		loadData();   //还有产生Adapter 要的结构的数据。
		initCtrl ();  //初始化组件 ,
		
		lv.setOnItemClickListener(new OnItemClickListener(){
			public void onItemClick(AdapterView<?> parent, View view, int position,
					long id ) {
				Toast.makeText(getBaseContext(), names[position], Toast.LENGTH_SHORT).show();
			}	
		});
		
	}

注意,这里用Click,而不是 Selected 严密监听。

(3) loadData() 可以 原始 数据 整理成Adapter 要的格式 

private List<HashMap<String, String>> loadData() {
		// TODO Auto-generated method stub
		names = new String []{"android 1.1","android 2.1","android 3.1","android 4.1"};
		listItem = new ArrayList <HashMap<String ,String >>();
		
		for (int i=0;i< names.length;i++){
			HashMap <String ,String > name = new HashMap<String ,String >();
			name.put("name", names[i]);
			listItem.add(name);
		}
		return listItem ;
	}

(3) initCtrl()  中完成 了组件 的初始化和设置 ,

private void initCtrl() {
		// TODO Auto-generated method stub
		lv= (ListView)findViewById(R.id.listView1);   //得到 ListiV	iew
		SimpleAdapter adapter = new SimpleAdapter (getBaseContext(), 
													listItem ,
													R.layout.item,
													new String []{"name"},
													new int [] {R.id.textView1});    //新建 Adapter 
		lv.setAdapter(adapter);
	}




下面开始 讲复杂的listItem的。

    还是用   SimpleAdapter 。

SimpleAdapter (Context context ,
                    List<? extends Map<String ,?> >data ,
                    int resource,
                    String [] from,
                    int [] to );

我们为了显示 下面的效果:

作出下面的修改:

一。item  的布局文件,用两层的 linearLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="80dp"
    android:background="#808080"
    android:orientation="horizontal" 
    >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_margin="5dp"
        android:src="@drawable/a"/>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" 
         android:layout_marginLeft="20dp"
        android:orientation="vertical">
        
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:textColor="#FFFFff"
            android:textSize="20sp"
            android:text="name"/>

        <TextView
            android:id="@+id/info"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:text="info"
            android:textColor="#FFFFff"
            android:textSize="15sp" />
        
    </LinearLayout>

</LinearLayout>

二。java 程序 的修改

    将 Adapter 要用的数据 类型改成

private List<Map<String, Object>> listItem ;  //adapter要用的格式 的数据 源

其它各处都 要进行修改。

初始化部分改成:

private void initCtrl() {
		// TODO Auto-generated method stub
		lv= (ListView)findViewById(R.id.listView1);   //得到 ListiV	iew
		SimpleAdapter adapter = new SimpleAdapter (getBaseContext(), 
													listItem ,
													R.layout.item,
													new String []{"name","img","info"},
													new int [] {R.id.name,R.id.imageView1, R.id.info});    //新建 Adapter 
		lv.setAdapter(adapter);
	}


重点难点 在数据加载 部分,

private List<Map<String, Object>> loadData() {
		// TODO Auto-generated method stub
		names = new String []{"android 1.1","android 2.1","android 3.1","android 4.1"};
		imgs = new int []{R.drawable.a, R.drawable.b,R.drawable.c, R.drawable.d};
		infos =new String [] { "1991","1992","1993", "1994"};
		
		listItem = new ArrayList <Map<String ,Object >>();
		
		for (int i=0;i< names.length;i++){
			Map<String, Object> map = new HashMap<String ,Object >();
			map.put("name", names[i]);
			map.put("img",imgs[i] );
			map.put("info", infos[i]);
			
			listItem.add(map);
		}
		return listItem ;
	}







共有 人打赏支持
粉丝 10
博文 91
码字总数 40993
×
chuiyuan
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: