ListView学习

ListView是什么?
         listview是一套视图组件。
ListView通常以列表的形式在android客户端显示一些列表选项。
ListView应用场合?
淘宝客户端、微信、新闻。
ListView构成分析?
   ListView是一个容器,ListView中包含Item,每个Item承载数据
ListView 实现分析
     本身是一个容器
      会有很多列表项
Adapter应用分析?
       ListView从Adapter中提取数据,Adapter加载界面,读取所需要的数据。
       把数据跟加载出来的界面对象组建成一个View Item,返回给ListView,对一个ListView来说
       ,最重要的是Adapter。
    实现步骤
        创建ListView布局
创建Item布局
获取数据
创建适配器
为ListView控件设置适配器




ArrayAdapter
         ArrayAdapter
      最简单的适配器,用于为ListView提供承载简单数据的Item界面


      其数据源必须是数组或简单的List集合


      其加载的Item布局中必须包含至少一个TextView控件,数据源中的数据将逐条显示在
          每一个ItemView的TextView控件中
ArrayAdapter
   ArrayAdapter的构造方法
          ArrayAdapter<T>(Context context,int layoutRes)
  ArrayAdapter<T>(Context context,int layoutRes,int TextViewResId)
  ArrayAdapter<T>(Context context,List<T> data)
  ArrayAdapter<T>(Context context,int layoutRes,T[] data)
  ArrayAdapter<T>(Context context,int layoutRes,int TextViewResId,T[] data)
  ArrayAdapter<T>(Context context,int layoutRes,int TextViewResId,List<T> data)
            ArrayAdapter的静态方法
          Publicstatic ArrayAdaptercreateFromResource(Context context,int layoutRes,int textViewRes)
     
       SimpleAdapter
          SimpleAdapter
     一种简单的通用适配器


     其数据源必须是由结构相同的Map集合构成的List集合


     每个Map中的数据将被显示在一个Item中,所以必须为Item
           中的每个控件指定该控件对应显示的值是map集合中的哪个值。


       SimpleAdapter的构造方法
                SimpleAdapter(Context context,List<? extends Map<String,?>>data,int layoutRes,String[] from,int[] to)


data:数据集,必须是由结构相同的map集合构成的List集合。
layoutRes:item的布局资源id
from:map集合中的key构成的数组
to:item布局中的控件id构成的数组。

from和to两个参数存在对应关系,其含义是map集合中指定key值,存储在对应的id控件中

小案例:

     布局:

<ListView 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:id="@+id/lvFriends"
 />

item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textSize="20sp"
    android:textColor="#FFFF0000" >
    

</TextView>

适配器:

    

package com.example.listview;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {
    private ListView lvFriends;
    private ArrayAdapter<String> adapter;
    private void setupView(){
    	lvFriends = (ListView) findViewById(R.id.lvFriends);
    	
    	String[] friends = {"关羽","赵云","张飞","马超","黄忠"};
        adapter = new ArrayAdapter<String>(this,R.layout.item,friends);
        lvFriends.setAdapter(adapter);
    }
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		setupView();
	}
}

SimpleAdapter实现的一个小项目:

显示图片跟字体:


       界面布局:

               

<ListView 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:id="@+id/lvFriends"
 />

item布局:

       

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
     xmlns:android="http://schemas.android.com/apk/res/android"
     >
    <ImageView 
        android:id="@+id/ivHead"
        android:layout_width="64dp"
        android:layout_height="64dp"/>
    <TextView 
        android:id="@+id/tvName"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:textSize="30sp"
        android:layout_weight="1.0"
        android:layout_marginLeft="20dp"/>
</LinearLayout>

类:

   

package com.example.listview;

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

public class DataSource {
         public static List<HashMap<String,Object>>getData(){
        	 List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>();
        	 HashMap<String, Object> item = new HashMap<String,Object>();
        	 item.put("photo_id", R.drawable.ic_launcher);
        	 item.put("name", "关羽");
        	 data.add(item);
        	 
        	 item = new HashMap<String,Object>();
        	 item.put("photo_id", R.drawable.image);
        	 item.put("name", "张飞");
        	 data.add(item);
        	 
        	 item = new HashMap<String,Object>();
        	 item.put("photo_id", R.drawable.image);
        	 item.put("name", "黄忠");
        	 data.add(item);
        	 
        	 item = new HashMap<String,Object>();
        	 item.put("photo_id", R.drawable.ic_launcher);
        	 item.put("name", "赵云");
        	 data.add(item);
        	 
        	 item = new HashMap<String,Object>();
        	 item.put("photo_id", R.drawable.image);
        	 item.put("name", "魏延");
        	 data.add(item);
        	 
        	 
        	 return data;
         }
}

 

主界面:

package com.example.listview;

import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity {
   private ListView lvFriends;
   private SimpleAdapter adapter;
   
   private void setupView(){
	   lvFriends = (ListView) findViewById(R.id.lvFriends);
	   
	   List<HashMap<String ,Object>> data = DataSource.getData();
	   
	   String[] from = {"photo_id","name"};
	   int[] to = {R.id.ivHead,R.id.tvName};
	   adapter = new SimpleAdapter(this,data, R.layout.item, from, to);
	   
	   lvFriends.setAdapter(adapter);
   }
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		setupView();
	}
}


Listview的懒加载模式:

ListView滚动懒加载模式
      要点
         为自定义适配器,添加boolean型控制变量,用于控制是否加载数据
 为ListView添加滚动事件监听器
      在onScrollStateChanged方法中,判断当前的滚动状态,并设置到adapter中的控制变量

主Activity:
            
package com.example.listview1;

import java.util.ArrayList;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

public class MainActivity extends Activity {
    private ListView lvMusics;
    private MusicAdapter adapter;
    private int page;
    private AlertDialog dialog;
    
    private void setupView(){
    	lvMusics = (ListView) findViewById(R.id.lvMusics);
    	page = 1;
    	adapter = new MusicAdapter(this, MusicBiz.getMusics(page++));
    	lvMusics.setAdapter(adapter);
    	
    	
    	
    }
    
    private void addListener(){
    	lvMusics.setOnScrollListener(new OnScrollListener() {
			
    		private int lastVisibleItem;
    		
			@Override
			public void onScrollStateChanged(AbsListView view, int scrollState) {
				// TODO Auto-generated method stub
			     switch (scrollState) {
				case OnScrollListener.SCROLL_STATE_IDLE:
					adapter.setIdle(true);
					adapter.notifyDataSetChanged();
					
					break;
				case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
				case OnScrollListener.SCROLL_STATE_FLING:
					adapter.setIdle(false);
					break;
				}
			}
			
			@Override
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {
                   
			}
		});
    }
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		setupView();
		addListener();
	}
}


对象:
        
package com.example.listview1;

public class Music {
     private String name;
     private String album;
     private int id;
     private String duration;
     private String artist;
     private String musicPath;
     private String albumPicPath;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAlbum() {
		return album;
	}
	public void setAlbum(String album) {
		this.album = album;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getDuration() {
		return duration;
	}
	public void setDuration(String duration) {
		this.duration = duration;
	}
	public String getArtist() {
		return artist;
	}
	public void setArtist(String artist) {
		this.artist = artist;
	}
	public String getMusicPath() {
		return musicPath;
	}
	public void setMusicPath(String musicPath) {
		this.musicPath = musicPath;
	}
	public String getAlbumPicPath() {
		return albumPicPath;
	}
	public void setAlbumPicPath(String albumPicPath) {
		this.albumPicPath = albumPicPath;
	}
    
	public String toString(){
		return "Music [id=" + id +
				",name=" + name + ",album=" + album +
				",duration=" + duration + ",artist=" + artist +
				",musicPath=" + musicPath + ",albumPicPath=" 
				+ albumPicPath + "]";
	}
}

适配器:
           
package com.example.listview1;



import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MusicAdapter extends BaseAdapter {
    private ArrayList<Music> musics;
    private LayoutInflater inflater;
    private boolean isIdle;
    
    
	public void setIdle(boolean isIdle) {
		this.isIdle = isIdle;
	}

	public MusicAdapter(Context context,ArrayList<Music> musics) {
		if(musics != null)
		     this.musics = musics;
		else
			this.musics = new ArrayList<Music>();
		this.inflater = LayoutInflater.from(context);
	}
	
	public void addData(ArrayList<Music> musics){
		if(musics != null){
			this.musics.addAll(musics);
			notifyDataSetChanged();
		}
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return musics.size();
	}

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

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		
		ViewHolder holder = null;
		
		if(convertView == null){
			convertView = inflater.inflate(R.layout.item, null);
			holder = new ViewHolder();
			holder.tvName = (TextView)convertView.findViewById(R.id.tvName);
			holder.tvAlbum = (TextView)convertView.findViewById(R.id.tvAlbum);
			holder.tvArtist = (TextView)convertView.findViewById(R.id.tvArtist);
			holder.tvDuration = (TextView)convertView.findViewById(R.id.tvDuration);
			
			convertView.setTag(holder);
		}else{
			holder = (ViewHolder)convertView.getTag();
		}
		
		if(isIdle){
		Music m = musics.get(position);
		holder.tvName.setText(m.getName());
		holder.tvAlbum.setText(m.getAlbum());
		holder.tvArtist.setText(m.getArtist());
		holder.tvDuration.setText(m.getDuration());
		
		}
		return convertView;
	}
	
	class ViewHolder{
		private TextView tvName;
		private TextView tvDuration;
		private TextView tvArtist;
		private TextView tvAlbum;
	}

}

数据处理:

package com.example.listview1;

import java.util.ArrayList;

public class MusicBiz {
        public static ArrayList<Music> getMusics(int page){
        	ArrayList<Music> musics = new ArrayList<Music>();
        	int i=(page - 1) * 20 +1;
        	int end = i+20;
        	for(;i<end;i++){
        		Music m = new Music();
        		m.setId(i);
        		m.setName("歌曲" + i);
        		m.setAlbum("专辑" + i);
        		m.setAlbumPicPath("D:/www.123/123/1.jpg");
        		m.setDuration("14:23");
        		m.setArtist("陈奕迅");
        		m.setMusicPath("http://www.123wer/123/music.jpg");
        		musics.add(m);
        	}
           
           
           return musics;
        }
}

布局:
       
<ListView
    android:id="@+id/lvMusics"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     xmlns:android="http://schemas.android.com/apk/res/android"
     />

<?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:layout_width="64dp"
        android:layout_height="64dp"
        android:src="@drawable/image"/>
     <TableLayout 
         android:layout_width="0dp"
         android:layout_height="match_parent"
         android:layout_weight="1.0"
         android:stretchColumns="*">
         <TableRow 
             android:layout_height="0dp"
             android:layout_weight="1.0">
             <TextView 
                 android:id="@+id/tvName"
                 android:layout_height="match_parent"
                 android:gravity="center_vertical"
                 android:textSize="20sp"/>
             <TextView 
                 android:id="@+id/tvDuration"
                 android:layout_height="match_parent"
                 android:gravity="center_vertical"
                 android:textSize="20sp"/>
         </TableRow>
         <TableRow 
             android:layout_height="0dp"
             android:layout_weight="1.0">
             <TextView 
                 android:id="@+id/tvArtist"
                 android:layout_height="match_parent"
                 android:gravity="center_vertical"
                 android:textSize="20sp"/>
             <TextView 
                 android:id="@+id/tvAlbum"
                 android:layout_height="match_parent"
                 android:gravity="center_vertical"
                 android:textSize="20sp"/>
         </TableRow>
     </TableLayout>
</LinearLayout>



posted @   wojiaohuangyu  阅读(4)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示