Android之ListView

ListView
         1.三种Adapter构建ListView
                ListView添加条目的时候, 可以使用setAdapter(ListAdapter)方法, 常用的ListAdapter有三种
                BaseAdapter: 定义一个类继承BaseAdapter, 重写4个抽象方法, ListView的条目是由getView()方法构建出来的
                SimpleAdapter: 创建SimpleAdapter对象时, 传入数据(List<Map<String, ?>>), 并指定数据的绑定关系

                SimpleCursorAdapter: 创建SimpleCursorAdapter对象时, 传入一个Cursor, 指定数据的绑定关系

          2.监听ListView的点击
调用ListView.setOnItemClickListener(OnItemClickListener)方法注册一个监听器
在监听器的onItemClick()方法中使用 parent.getItemAtPosition(position) 方法可以获取指定条目上的数据
BaseAdapter:返回的就是自定义的getItem()方法中返回的数据
SimpleAdapter:返回的是一个Map, 就是创建SimpleAdapter时List中的一个Map
SimpleCursorAdapter:返回的是一个Cursor, 这个Cursor就是创建时传入的Cursor, 但是已经通过moveToPosition()方法指定到点击的索引了

一:BaseAdapter添加方式:
1.查询出要被添加的数据
2.获取ListView对象
3.创建一个类继承BaseAdapter,实现其中的方法
4.给ListView对象设置适配器personLV.setAdapter(new MyBaseAdapter());

import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.xxc.dao.PersonDao;
import com.xxc.domain.Person;

/**
 * 注意:
 * 	BaseAdapter生成的条目,进行Item点击事件监听的时候,
 *  parent.getItemAtPosition(position)返回的是person对象
 *  因为调用的是生成条目对象MyBaseAdapter类中的getItem方法
 *   
 */
public class BaseAdapterActivity extends Activity {
    private ListView personLV;
	private List<Person> persons;

	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        PersonDao dao = new PersonDao(getApplicationContext());
        persons = dao.queryAll();//查询数据
        
        
        personLV = (ListView) findViewById(R.id.personLV);//获取ListView
        personLV.setAdapter(new MyBaseAdapter());//给ListView添加适配器,按照adapter中的方法对ListView添加条目
        
        personLV.setOnItemClickListener(new MyOnItemClickListener());//给条目添加条目点击监听器
    }
    
    /**
     * 点击事件监听器
     */
    private class MyOnItemClickListener implements OnItemClickListener {
		public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
			Person p = (Person) parent.getItemAtPosition(position);//其实就是调用了MyBaseAdapter中的getItem方法,返回指定条目上的数据
			Toast.makeText(getApplicationContext(), p.getId()+","+p.getName()+","+p.getBalance(), Toast.LENGTH_SHORT).show();
		}
    }
    
    /**
     * 将每个Person对象生成一个条目,将每个条目添加到ListView中
     */
    private class MyBaseAdapter extends BaseAdapter {
		public int getCount() {//返回ListView中要显示的条目数量(说白了就是,person集合元素的个数)
			return persons.size();
		}
		public Object getItem(int position) {//返回指定位置上的对象
			return persons.get(position);
		}
		public long getItemId(int position) {//返回条目的id,从0开始
			return position;
		}
		//返回指定位置上的View,添加到ListView中,也就是说Person集合有几个元素就调用这个方法几次,一次生成一个条目
		public View getView(int position, View convertView, ViewGroup parent) {//因为屏幕最多显示10个条目,上下移动的时候都是移动的时候创建的,而不是一次创建完的,convertView代表移出屏幕外的那个条目
			Person person = persons.get(position);
			/*
			 * inflate充气的意思,理解为构建一个条目
			 * 参数一:上下文环境
			 * 参数二:item的布局文件
			 * 参数三:将item挂到哪个组件上,如果写null,默认挂到ListView上
			 */
			/**
			 * 千万要注意:
			 * 此时SQLiteNewActivity类中使用findViewById并不能找到条目中的id,name,balance组件
			 * 因为此时还没加载到Activity中
			 * 所以需要靠item(条目)来获取条目里的组件
			 * item.findViewById
			 * 
			 */
			View item = View.inflate(getApplicationContext(), R.layout.item, null);
			TextView idTV = (TextView) item.findViewById(R.id.idTV);
			TextView nameTV = (TextView) item.findViewById(R.id.nameTV);
			TextView balanceTV = (TextView) item.findViewById(R.id.balanceTV);
			
			/**
			 * 千万要注意:
			 * setText(CharSequence text)
			 * setText(int resid)
			 * 这个方法有重载,如果传入int类型的值进去(比如person的id和balance)
			 * 程序会去找R文件中内部类string中的值,所以肯定找不到
			 * 因此setText的时候务必转成字符串
			 */
			idTV.setText(person.getId()+"");
			nameTV.setText(person.getName());
			balanceTV.setText(person.getBalance()+"");
			return item;
		}
    }
}



二.SimpleAdapter添加方式:

         1.查询出要被添加的数据
         2.创建一个Map元素的List集合    List<Map<String,Object>> data = new ArrayList<Map<String,Object>>();
         3.遍历需要被添加的数据,将数据以键值对的方式加入到map集合中,再将Map集合加入到List集合
         4.获取ListView对象   ListView personLV = (ListView) findViewById(R.id.personLV);
         5.给ListView设置适配器 

personLV.setAdapter(new SimpleAdapter(this, data , R.layout.item, new String[]{"id","name","balance"}, new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));
/* SimpleAdapter传入指定的数据和布局文件,以及匹配关系,自动生成View,装入LsitView
 * 参数一:上下文环境
 * 参数二:数据,List<Map<String,Object>>,每个Person的数据装入一个Map,将所有Map装入List
 * 参数三:布局文件的资源id,因为每个条目也有自己的布局方式,这个布局指的是每个item的布局
 * 参数四:Map中的key,和参数五中的id所对应的组件对应,将指定Key对应的Value,放入id对应的组件上
 * 参数五:View中的id
 */

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import com.xxc.dao.PersonDao;
import com.xxc.domain.Person;

/**
 * 注意:
 * 	SimpleAdapter生成的条目,进行Item点击事件监听的时候,
 *  parent.getItemAtPosition(position)返回的是map集合
 *
 */
public class SimpleAdapterActivity extends Activity {
    private ListView personLV;
	private List<Person> persons;

	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        PersonDao dao = new PersonDao(getApplicationContext());
        persons = dao.queryAll();//查询数据
        
        
        personLV = (ListView) findViewById(R.id.personLV);//获取ListView
        List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
      //把每个Person的数据装入一个map,再将所有map装入list
        for (Person p : persons) {
			Map<String,Object> map = new HashMap<String, Object>();
			map.put("id", p.getId());
			map.put("name", p.getName());
			map.put("balance", p.getBalance());
			data.add(map);
		}
		/*
         * 参数一:上下文环境
         * 参数二:遍历Person集合,将一个Person对象数据装入Map集合,再将所有Map集合装入List集合中
         * 参数三:生成条目的布局文件
         * 参数四:map中的key  
         * 参数五:条目中的组件id
         * 参数四和参数五的意思是:
         * 			根据key去找map集合找到对应的value值,将value放到参数五中的组件中(先后顺序)
         */
        personLV.setAdapter(new SimpleAdapter(getApplicationContext(), data , R.layout.item, new String[]{"id","name","balance"}, new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));
        
        
        personLV.setOnItemClickListener(new MyOnItemClickListener());//给条目添加条目点击监听器
    }
    
    /**
     * 点击事件监听器
     */
    private class MyOnItemClickListener implements OnItemClickListener {
		public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
			Map<String,Object> map =  (Map<String, Object>) parent.getItemAtPosition(position);//其实就是调用了MyBaseAdapter中的getItem方法,返回Map
			Toast.makeText(getApplicationContext(), map.get("name").toString(), Toast.LENGTH_SHORT).show();
		}
    }
}



三:SimpleCursorAdapter

1.查询出要被添加的数据,返回的是一个Cursor类型对象

2.获取ListView对象

3.在ListView上设置适配器

注意:查询出来的主键必须以_id命名,最好就是数据库表中的主键列名就是_id,如果不能改变,就在查询的时候取别名。


dao层

/**
 * 查询person表中所有记录,返回 Cursor类型
 */
public Cursor queryAllCursor(){
	SQLiteDatabase db = helper.getReadableDatabase();
	Cursor c = db.query("person", new String[]{"id _id ","name","balance"}, null, null, null, null, "id DESC");
	return c;
}

Activity

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class SimpleCursorAdapterActivity extends Activity {
    private ListView personLV;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        
        PersonDaoNew dao = new PersonDaoNew(getApplicationContext());
        Cursor c = dao.queryAllCursor();
        
        personLV = (ListView) findViewById(R.id.personLV);
        personLV.setAdapter(new SimpleCursorAdapter(this, R.layout.item, c,//
        				new String[]{"_id","name","balance"}, //
        				new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));//
        /*
         *参数一:上下文环境
         *参数二:布局文件资源ID
         *参数三:包含数据的游标
         *参数四:游标中的列名
         *参数五:条目中的组件ID,游标中的数据就会放在这些组件上 
         */
    	personLV.setOnItemClickListener(new MyOnItemClickListener());//添加监听器
    }
    //监听器的实现类
    private class MyOnItemClickListener implements OnItemClickListener{
		public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
			Cursor c = (Cursor) parent.getItemAtPosition(position);
			Toast.makeText(getApplicationContext(), c.getString(0), Toast.LENGTH_SHORT).show();
		}
    }
}

item.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" 
    android:padding="10dp">

    <TextView
        android:id="@+id/idTV"
        android:textSize="20sp"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="1" />

    <TextView
        android:layout_weight="2"
        android:id="@+id/nameTV"
        android:layout_width="0dp"
        android:textSize="20sp"
        android:layout_height="wrap_content"
        android:text="皮卡丘" />

    <TextView
        android:layout_weight="2"
        android:id="@+id/balanceTV"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="1000"
        android:textSize="20sp" />
	
</LinearLayout>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
	
    <!-- 这个是表头的设置,下面拖动,表头不会动 -->
    <LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" 
    android:padding="10dp">

    <TextView
        android:textSize="20sp"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:text="序号" />

    <TextView
        android:layout_weight="2"
        android:layout_width="0dp"
        android:textSize="20sp"
        android:layout_height="wrap_content"
        android:text="姓名" />

    <TextView
        android:layout_weight="2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="余额"
        android:textSize="20sp" />
	
	</LinearLayout>
	<!-- 这个是表头的设置,下面拖动,表头不会动 -->
    
   	<ListView 
   	    android:id="@+id/personLV"
   	    android:layout_width="fill_parent"
    	android:layout_height="fill_parent"/>

</LinearLayout>




四:ArrayAdapter

最简单的数据适配器


Activity

package com.xxc.day4;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ListView array_lv = (ListView) findViewById(R.id.array_lv);
		String[] objs = new String[]{"王立军1","王立军2","王立军3","王立军4","王立军5","王立军6"};
		/**
		 * 参数一:上下文
		 * 参数二:资源文件,是一个TextView,由android自己定义的
		 * 参数三:要显示的数据
		 */
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, objs);
		array_lv.setAdapter(adapter);
	}
}

main.xml

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

    <ListView
        android:id="@+id/array_lv" 
        android:layout_width="match_parent"
    	android:layout_height="match_parent">
    </ListView>
</LinearLayout>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android中使用ListView来显示天气图标和温度,可以按照以下步骤进行操作: 1. 准备数据:首先需要准备一个包含天气图标和温度信息的列表数据,可以使用ArrayList或者其他数据结构来存储。 2. 创建布局:为了显示天气图标和温度,需要为ListView中的每一项创建一个布局,可以使用LinearLayout或者RelativeLayout等布局来设计每一项的布局。 3. 创建适配器:创建一个继承自BaseAdapter的适配器类,实现getView()方法来设置每一项的布局和数据。 4. 设置适配器:在Activity或者Fragment中获取ListView控件,然后设置适配器即可显示列表数据。 以下是一个简单的示例代码,实现了一个包含天气图标和温度的列表: ``` public class MyAdapter extends BaseAdapter { private Context mContext; private ArrayList<WeatherData> mData; public MyAdapter(Context context, ArrayList<WeatherData> data) { mContext = context; mData = data; } @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) { View view = convertView; ViewHolder holder; if (view == null) { view = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false); holder = new ViewHolder(); holder.imageView = view.findViewById(R.id.image_view); holder.textView = view.findViewById(R.id.text_view); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } WeatherData weatherData = mData.get(position); holder.textView.setText(weatherData.getTemperature() + "℃"); holder.imageView.setImageResource(weatherData.getImageResId()); return view; } static class ViewHolder { ImageView imageView; TextView textView; } } public class WeatherData { private int mImageResId; private int mTemperature; public WeatherData(int imageResId, int temperature) { mImageResId = imageResId; mTemperature = temperature; } public int getImageResId() { return mImageResId; } public int getTemperature() { return mTemperature; } } // 在Activity或者Fragment中使用适配器来显示ListView ArrayList<WeatherData> data = new ArrayList<>(); data.add(new WeatherData(R.drawable.weather_sunny, 28)); data.add(new WeatherData(R.drawable.weather_cloudy, 24)); data.add(new WeatherData(R.drawable.weather_rainy, 20)); ListView listView = findViewById(R.id.list_view); MyAdapter adapter = new MyAdapter(this, data); listView.setAdapter(adapter); ``` 在上述代码中,我们定义了一个WeatherData类来存储天气图标和温度信息,然后我们创建了一个MyAdapter类来实现适配器,通过重写getView()方法设置每一项的布局和数据。最后在Activity或者Fragment中使用适配器来显示ListView
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值