android_ ListView 详解

       学习ListView实际上就是学习Adapter的使用,Adapter采用的是适配器设计模式!适配器模式将在以后的章节中讨论

实现ListView效果大家只需要分三步走

1.在布局文件中定义ListView对象,并在窗体文件中实例化它

2.实例化适配器

如:ArrayAdapter adapter =new ArrayAdapter(Context contex,int Layout,List list<T>);

 context代表的是上下文,其实就是说明数据显示在哪里,一般就是当前窗体 :如 MainActivity.this

 Layout 代表的是布局的资源,即是ListView中每个条目的布局

 第三个参数既可以是List 也可以是数组,代表要在ListView中显示的数据

3.定义数据,给ListView设置适配器

4.给ListView设置事件处理程序

1.ArrayAdapter

public class MainActivity extends Activity {
private ListView list;
private final String []demos={"线性布局","相对布局","表格布局","网格布局","CheckBox应用","Spinner应用"};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.实例化对象
list=(ListView) findViewById(R.id.demo);
//2.定义适配器
ArrayAdapter<String>adapter=new ArrayAdapter<String>(this,R.layout.listview,demos);
//3.将适配器放到ListView中
list.setAdapter(adapter);
//4.给ListView绑定方法
}
}

 R.layout.listView代码:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center_vertical"
android:drawableLeft="@drawable/aa"
/>

2.simpleAdapter

 如果我们要实现ListView中的条目中带有多个控件,比如一个图片,一个文本,那么此时就可以选择simpleAdapter了

public class MainActivity extends Activity  {
private ArrayList companyList;
private HashMap companyMap;
private ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.实例化ListView
mListView =(ListView)findViewById(R.id.city);

//2.定义数据
companyList = new ArrayList();
companyMap = new HashMap();

companyMap.put("image", R.mipmap.ic_launcher);
companyMap.put("company", "美国苹果公司");
companyMap.put("product", "Mac&OSX&iPhone&iPad");
companyList.add(companyMap);

companyMap = new HashMap();
companyMap.put("image", R.mipmap.ic_launcher);
companyMap.put("company", "美国Google公司");
companyMap.put("product", "Nexus&Android&Chrome");
companyList.add(companyMap);

companyMap = new HashMap();
companyMap.put("image", R.mipmap.ic_launcher);
companyMap.put("company", "美国Oracle公司");
companyMap.put("product", "Java&Oracle&MySQL");
companyList.add(companyMap);
//3.建立SimpleAdapter对象
SimpleAdapter adapter =new SimpleAdapter(this,companyList,R.layout.simple_list,
new String[]{"image","company","product"},//数据的来源
new int[]{R.id.iconImageView,R.id.companyTextView,
R.id.productTextView}); //数据的去向
//4.向listView中添加adapter
mListView.setAdapter(adapter);
//5.为ListView设置监听方法
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
getCompanyInfo(position);
}
});
//设置选择监听
mListView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
getCompanyInfo(position);
}

@Override
public void onNothingSelected(AdapterView<?> parent) {

}
});
}
public void getCompanyInfo(int position){
HashMap infoMap=(HashMap) companyList.get(position);
Toast.makeText(MainActivity.this,infoMap.get("company").toString(),
Toast.LENGTH_SHORT).show();
}
}

3.BaseAdapter(自定义Adapter)

 

package com.example.zh.myapplication;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

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

public class Sencond extends Activity {
private ArrayList <HashMap>songList;
private String songName;
private ListView mListView;
private myAdapter adapter;


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载布局
setContentView(R.layout.activity_sencond);
//1.实例化ListView
mListView=(ListView)findViewById(R.id.mListView);
songList=new ArrayList<HashMap>();
//2.定义数据
HashMap songMap = new HashMap();
songMap.put("image", R.mipmap.ic_launcher);
songMap.put("singer", "陈奕迅");
songMap.put("songName", "好久不见.mp3");
songList.add(songMap);

songMap = new HashMap();
songMap.put("image", R.mipmap.ic_launcher);
songMap.put("singer", "王菲");
songMap.put("songName", "旋转的木马.mp3");
songList.add(songMap);

songMap = new HashMap();
songMap.put("image", R.mipmap.ic_launcher);
songMap.put("singer", "陈奕迅");
songMap.put("songName", "婚礼的祝福.mp3");
songList.add(songMap);

songMap = new HashMap();
songMap.put("image", R.mipmap.ic_launcher);
songMap.put("singer", "王菲");
songMap.put("songName", "棋子.mp3");
songList.add(songMap);

songMap = new HashMap();
songMap.put("image", R.mipmap.ic_launcher);
songMap.put("singer", "王菲");
songMap.put("songName", "红豆.mp3");
songList.add(songMap);

songMap = new HashMap();
songMap.put("image", R.mipmap.ic_launcher);
songMap.put("singer", "陈奕迅");
songMap.put("songName", "幸福摩天轮.mp3");
songList.add(songMap);

songMap = new HashMap();
songMap.put("image", R.mipmap.ic_launcher);
songMap.put("singer", "陈奕迅");
songMap.put("songName", "爱情转移.mp3");
songList.add(songMap);

songMap = new HashMap();
songMap.put("image", R.mipmap.ic_launcher);
songMap.put("singer", "陈奕迅");
songMap.put("songName", "稳稳的幸福.mp3");
songList.add(songMap);

songMap = new HashMap();
songMap.put("image", R.mipmap.ic_launcher);
songMap.put("singer", "王菲");
songMap.put("songName", "我愿意.mp3");
songList.add(songMap);

songMap = new HashMap();
songMap.put("image", R.mipmap.ic_launcher);
songMap.put("singer", "王菲");
songMap.put("songName", "传奇.mp3");
songList.add(songMap);
//3.定义适配器
adapter=new myAdapter(this,songList);

//4.将适配器加入到ListView中
mListView.setAdapter(adapter);

}

class myAdapter extends BaseAdapter{
private Context context;
private ArrayList<HashMap> myList;
public myAdapter(Context c, ArrayList<HashMap> a){
context=c;
myList=a;
}
@Override
public int getCount() {
return myList.size();
}
@Override
public Object getItem(int position) {
return position;
}

@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//只有窗体对象才具有getLayoutInflater方法
LayoutInflater mInflater = LayoutInflater.from(context);
//返回一个view对象
View view =mInflater.inflate(R.layout.listview_item,null);

//实例化activity_sencond中的控件是为了将数据放到指定的控件中
ImageView image=(ImageView) view.findViewById(R.id.iconIv);
TextView singer=(TextView) view.findViewById(R.id.singerTv);
TextView songName=(TextView)view.findViewById(R.id.songNameTv);
Button delect=(Button)view.findViewById(R.id.deleteBtn);
Button download=(Button)view.findViewById(R.id.downloadBtn);

//绘制Item
HashMap infoMap=(HashMap)myList.get(position);

//通过包装类将object类型的数据转化我int类型
image.setImageResource((Integer)(infoMap.get("image")));
singer.setText(infoMap.get("singer").toString());
songName.setText(infoMap.get("songName").toString());
delect.setTag(position);
download.setTag(position);
//给按钮添加监听事件
delect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//
int position=Integer.parseInt(v.getTag().toString());
songList.remove(position);
//更新当前适配器的数据
adapter.notifyDataSetChanged();
}
});

download.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

int position=Integer.parseInt(v.getTag().toString());
HashMap infoMap=songList.get(position);
Toast.makeText(Sencond.this,infoMap.get("songName").toString(),Toast.LENGTH_SHORT).show();
}
});

return view;
}
}
}

listview_item:
<?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:id="@+id/iconIv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/singerTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"
android:singleLine="true" />
<TextView
android:id="@+id/songNameTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="2"
android:singleLine="true" />
<!--
ListView的item中加入Button后 导致ListView对OnItemClick事件无法响应
原因是因为Button的事件响应优先级高于List Item,所以屏蔽了ListItem的单击事件
android:focusableInTouchMode="false"
android:clickable="false"
-->
<Button
android:id="@+id/deleteBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:focusable="false"
android:text="删除" />
<Button
android:id="@+id/downloadBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:focusable="false"
android:text="下载" />
</LinearLayout>
BaseAdapter中还没有涉及到ListView的优化,有关ListView的优化将在后续的章节中介绍。

转载于:https://www.cnblogs.com/xiaozhouboke/p/5357200.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值