Android基础核心总结之一-----ListView和GridView

 一、ListView是安卓中应用非常广泛的一个控件:

1.listView显示适配器有三个步骤:

 ①.获得控件ListView
 ②.适配器adapter
 ③.ListView关联Adapter

一个最简单的适配器只需要几行代码就能搞定:

public class MainActivity extends ListActivity {
 
       @Override
       protectedvoid onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);            
              //setContentView(R.layout.activity_main);
              //数组适配器
              ArrayAdapter<String>adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,new String[]{"1","2","3","4","5"});
              //关联适配器,因为MainActivity继承ListActivity,ListActivity自带一个listView
              setListAdapter(adapter);         
       }
}


显示效果为:


*如果activity继承了ListActivity则不需要获得控件,因为其本身自带ListView
*ListView还可以代码创建出来:ListView lsv=new ListView(this);


2.ListView适配器:
①ArrayAdapter数组适配器,可将数组显示在listView上
  ArrayAdapter<String>adapter2=newArrayAdapter<String>(context,textViewResourceId,objects)
  ArrayAdapter<String>adapter2=newArrayAdapter<String>(context,int Resource,textViewResourceId,objects)

各参数所代表的含义:
Context:指向的activity对象就是Context(资源访问对象)
resource:listView中的一个item对应的资源文件
textViewResourceId : resource中的控件id
objects: 数据集合,可以是List集合或数组

例如:    
  ArrayAdapter<String>adapter=newArrayAdapter<String>(this,R,layout.item_textview_1,newString[]{"1","2"});

②SimpleAdapter简单适配器,可将ListView上List<Map<K, V>>键值对集合显示在
SimpleAdapter(context, data, resource, from, to)

各参数所代表的含义:
data:ListView中要显示的数据
from: date中map对应的key
to:显示到的item中的对应的view上
例如:
  SimpleAdapter adapter=newSimpleAdapter(this,data,R.layout.list_item_2,newString[]{"contentKey","dateKey"},new int[]{R.id.textView1,R.id.textView2});


*List<Map<String,Object>>放入数据的方法:
  ①List<Map<String,Object>> list=newArrayList<Map<String,Object>>();
  ②Map<String,Object> map=new HashMap<String, Object>();
  ③map.put("contentKey", "Content"+i);
    map.put("dateKey",System.currentTimeMillis());
  ④list.add(map);

3.SimpleCursorAdapter简单查询适配器,将查询结果显示到ListView上
  SimpleCursorAdapter(context, layout, c, from, to, flags)

各参数所代表的含义:
layout:布局文件
c :Cursor对象查询到的结果
from、to和SimpleAdapter一样
flags是一个标识,标识当数据改变调用onContentChanged()的时候,是否通知ContentProvider数据的改变

例如:
  SimpleCursorAdapter adapter=new SimpleCursorAdapter(this,R.layout.list_item_2, cursor, new String[]{"_content"}, newint[]{R.id.input01},CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

4.自定义适配器,即自写类继承BaseAdapter,重写BaseAdapter方法,注意getView中的优化
下面我们实现一个简单的自定义适配器,如下图所示:

 

先看Activity代码MainActivity.java:

<span style="font-size:18px;">package com.example.listView;

import java.util.ArrayList;
import java.util.List;
import com.example.ListView.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ListView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	    //假设此数据来自于数据库
		List<Contact> list=new ArrayList<Contact>();
	    list.add(new Contact("小明", "电话:110", R.drawable.png_01));
	    list.add(new Contact("小红", "电话:120", R.drawable.png_02));
	    list.add(new Contact("小丽", "电话:119", R.drawable.png_03));
	    //要求:将此数据显示在ListView中
	    ContactAdapter adapter=//继承BaseAdapter
	    new ContactAdapter(this,
	    R.layout.list_item_3,list);
	    //ListView
	    ListView lsv=(ListView)findViewById(R.id.lsvId);
	    //关联adapter
	    lsv.setAdapter(adapter);
	}
}</span>


一个实体类Contact.java:

<span style="font-size:18px;">package com.example.listView;
/**借助此类的对象封装联系人信息*/
public class Contact {//VO (Value Object)
    /**联系人的名字*/
	private String name;
	/**联系人手机号*/
	private String phone;
	/**联系人头像*/
	private int photo;
	
	/**通过构造方法对属性初始化*/
	public Contact(String name,String phone,int photo){
		this.name=name;
		this.phone=phone;
		this.photo=photo;
	}
	public String getName() {
		return name;
	}
	public String getPhone() {
		return phone;
	}
	public int getPhoto() {
		return photo;
	}
}
</span>

一个适配器ContactAdapter.java

<span style="font-size:18px;">package com.example.listView;

import java.util.List;
import com.example.listView.R;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
/**自定义适配器:负责加载联系人信息构建item*/
public class ContactAdapter extends BaseAdapter{
    /**资源访问对象*/
	private Context context;
	/**item 布局资源id(是构建item view的模板)*/
	private int resource;
	/**ListView中要显示的数据*/
	private List<Contact> contacts;
	public ContactAdapter(Context context,int resource,List<Contact> contacts) {
	  this.contacts=contacts;
	  this.resource=resource;
	  this.context=context;
	}
	/**返回数据(item)的个数*/
	@Override
	public int getCount() {
		return contacts.size();
	}
    /**此方法返回指定位置的item数据*/
	@Override
	public Object getItem(int position) {
		return contacts.get(position);
	}
    /**返回item postion*/
	@Override
	public long getItemId(int position) {
		return position;
	}
    /**借助此方法构建item对象(饺子)
     * 此方法实现的功能:包饺子
     * 每显示一个item此方法就会执行一次
     * */
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		Log.i("TAG", "getView()");
		//1.item view 
		//1.1通过context找到resource对应的xml文件
		//1.2借助pull解析xml
		//1.3通过反射构建xml元素的对象
		View v=View.inflate(context, resource, null);
		//2.item data
		Contact c=contacts.get(position);
		//3.将item data放到item View 
		ImageView imgView=(ImageView) v.findViewById(R.id.imageView1);
		TextView nameTv=(TextView) v.findViewById(R.id.textView1);
		TextView phoneTv=(TextView) v.findViewById(R.id.textView2);
		imgView.setImageResource(c.getPhoto());
		nameTv.setText(c.getName());
		phoneTv.setText(c.getPhone());
		return v;//(item)
	}
	
}</span>

MainActivity布局:

<span style="font-size:18px;"><ListView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/lsvId"
    android:background="#fff"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
</ListView></span>

ListView中list_item_3的布局:

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#fff"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/png_01" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginTop="18dp"
        android:layout_toRightOf="@+id/imageView1"
        android:text="Large Text"
        android:textColor="#000"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:textColor="#000"
        android:text="TextView" />

</RelativeLayout></span>

这样一个简单的ListView就搞定啦!


***特殊的ListView:expandableListView可折叠、分组适配器:可显示二维数组
  SimpleExpandableListAdapter adapter2 = newSimpleExpandableListAdapter(context, groupData, expandedGroupLayout, collapsedGroupLayout, groupFrom, groupTo, childData, childLayout, childFrom,childTo)

 也可以自定义适配器,继承BaseExpandableListAdapter


下面演示一个简单的ExpandableListView的运用,先上效果图:



这里为了方便只用了一个类,MainActiviy.java:

package com.example.expandable;

import com.example.expandable.R;
import android.app.ExpandableListActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.TextView;
public class MainActivity
extends ExpandableListActivity {
	String groups[]={"我的好友","我的家人","我的同事"};
	String childs[][]={{"Tom","Nick","Cat"},{"琳琅天上","少校多怪"},{"调皮捣蛋"}};
	int imgs[][]={{R.drawable.png_01,R.drawable.png_02,R.drawable.png_03},{R.drawable.png_03,R.drawable.png_04},{R.drawable.png_05}};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//setContentView(R.layout.activity_main);
	    setListAdapter(
	    new MyAdapter());
	    //设置第一组默认展开
	    getExpandableListView().expandGroup(0); 
	    //添加在元素事件
	    getExpandableListView().setOnChildClickListener(new OnChildClickListener() {
		@Override
		public boolean onChildClick(ExpandableListView parent,View v,int groupPosition,int childPosition, long id) {
			Toast.makeText(MainActivity.this,childs[groupPosition][childPosition],1).show();
			return true;
		}
	   });
	}
	class MyAdapter extends BaseExpandableListAdapter{

		@Override
		public int getGroupCount() {
			return groups.length;
		}
		@Override
		public int getChildrenCount(
			int groupPosition) {//groupPosition分组的下标值
			return childs[groupPosition].length;
		}
		/**返回 分组item的数据*/
		@Override
		public Object getGroup(int groupPosition) {
			// TODO Auto-generated method stub
			return groups[groupPosition];
		}
        /**返回每个分组中子元素item对应的数据*/
		@Override
		public Object getChild(int groupPosition,int childPosition) {
			// TODO Auto-generated method stub
			return childs[groupPosition][childPosition];
		}
           
		@Override
		public long getGroupId(int groupPosition) {
			return groupPosition;
		}

		@Override
		public long getChildId(int groupPosition, int childPosition) {
			return childPosition;
		}
        /**用于判定id的稳定性
         * 在刷新时同样的id值是否指向的是相同的数据
         * ,假如指向的是相同的则表示是稳定的吗,
         * 假如是不同的则表示不稳定。
         * */
		@Override
		public boolean hasStableIds() {
			return false;
		}
        /**组名 */
		@Override
		public View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {
			//1.item view
			View view=View.inflate(MainActivity.this,android.R.layout.simple_expandable_list_item_1,null);
			//2.item data
			String groupName=groups[groupPosition];
			//3.将item data放到item view上
			((TextView)view).setText(groupName);
			return view;//item
		}
		/***分组中的子元素*/
		@Override
		public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {
			//1.item view
			View view=View.inflate(MainActivity.this,R.layout.list_item_2,null);
			//2.item data
			String childName=childs[groupPosition][childPosition];
			int imgId=imgs[groupPosition][childPosition];
			//3.将item data放到item view上
			TextView tv=(TextView)view.findViewById(R.id.textView1);
			tv.setText(childName);
			ImageView imageView=(ImageView)view.findViewById(R.id.imageView1);
			imageView.setImageResource(imgId);
			return view;//item
		}
		/**某个元素是否可以被选中或者被点击,
		 * 假如希望在ExpandableListView中添加点击事件,
		 * 此方法必须返回为true*/
		@Override
		public boolean isChildSelectable(int groupPosition, int childPosition) {
			return true;
		}
		
	}
}

MianActivity布局文件,activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

</RelativeLayout>

item布局文件,list_item_2.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/imageView1"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>



二、GridView和ListView相似,都需要Adapter显示,只是显示的布局不一样,GridView可以以网格的布局显示

下面我们来显示一个简单的GridView


先看MainActivity代码:

package com.example.gridview;

import java.util.ArrayList;
import java.util.List;
import com.example.gridview.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnItemClickListener{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

        //GridView数据
		List<Item> items=new ArrayList<Item>();
		//添加数据
		items.add(new Item(R.drawable.png_01,"鼠"));
		items.add(new Item(R.drawable.png_02,"牛"));
		items.add(new Item(R.drawable.png_03,"虎"));
		items.add(new Item(R.drawable.png_04,"兔"));
		items.add(new Item(R.drawable.png_05,"龙"));
		items.add(new Item(R.drawable.png_06,"蛇"));
		items.add(new Item(R.drawable.png_01,"鼠"));
		items.add(new Item(R.drawable.png_02,"牛"));
		items.add(new Item(R.drawable.png_03,"虎"));
		items.add(new Item(R.drawable.png_04,"兔"));
		items.add(new Item(R.drawable.png_05,"龙"));
		items.add(new Item(R.drawable.png_06,"蛇"));
		items.add(new Item(R.drawable.png_01,"鼠"));
		items.add(new Item(R.drawable.png_02,"牛"));
		items.add(new Item(R.drawable.png_03,"虎"));
		
		//初始化GridView
		GridView gv=(GridView) findViewById(R.id.gv01);
	    //构建Adapter
		ItemAdapter adapter=new ItemAdapter(this,R.layout.list_item_2, items);
	    //关联Adapter
		gv.setAdapter(adapter);
		//添加item点击事件
		gv.setOnItemClickListener(this);
	}
	
/***
 * GridView点击事件,点击时显示点击的图片
 */
	@Override
	public void onItemClick(
		AdapterView<?> parent,//gridview
		View view,int position,long id) {
		Item item=(Item)parent.getItemAtPosition(position);
		/*Toast.makeText(this,
		item.getName(),1).show();*/
		Toast t=new Toast(this);
		ImageView imageView=new ImageView(this);
		imageView.setImageResource(item.getPhoto());
		t.setView(imageView);
		//弹窗显示时间
		t.setDuration(1);
		//弹窗显示位置
		t.setGravity(Gravity.CENTER, 0, 0);
		t.show();
	}
}

Adapter代码ItemAdapter:

 

package com.example.gridview;

import java.util.List;
import com.example.gridview.R;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ItemAdapter extends BaseAdapter{

	private List<Item> items;
	private Context context;
	private int resource;
	public ItemAdapter(Context context,int resource,List<Item> items) {
		this.items=items;
		this.context=context;
		this.resource=resource;
	}
	@Override
	public int getCount() {
		return items.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return items.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		//1.item view
		View v=View.inflate(context,resource, null);
		//2.item data
		Item item=items.get(position);
		//3.将item data放到item view上
		ImageView iv=(ImageView)v.findViewById(R.id.imageView1);
		TextView tv=(TextView)v.findViewById(R.id.textView1);
		iv.setImageResource(item.getPhoto());
		tv.setText(item.getName());
		return v;
	}
}

实体类代码Item.java:

package com.example.gridview;
/**借助此类封装GridView中相关item数据*/
public class Item {
     private int photo;
     private String name;
	 public Item(int photo, String name) {
		super();
		this.photo = photo;
		this.name = name;
	 }
	 public String getName() {
		return name;
	 }
	 public int getPhoto() {
		return photo;
	 }
}

MainActivity布局activity_main.xml:

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff"
    tools:context=".MainActivity" >

    <GridView
        android:id="@+id/gv01"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="3"
        android:horizontalSpacing="2dp"
        android:verticalSpacing="2dp" 
        android:columnWidth="120dp"    
        />     
</RelativeLayout>

Item布局list_item_2.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="vertical"
    android:background="#cfc" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="5"
        android:src="@drawable/png_01" 
        android:layout_centerHorizontal="true"/>

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/imageView1"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" 
        android:layout_centerHorizontal="true"
        android:gravity="center"/>

</LinearLayout>

效果图:

 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值