android listview 的监听事件
今天遇到了一个比较让我头疼的问题,不过追根揭底只是我对listview理解的不够透彻罢了,
闲言少叙,说说我遇到的问题吧:
上篇随笔我写了关于listview的使用,如果你也已经写好了列表那么恭喜这一篇对你也有用
当然如果你还没有搭好可以先去看看我的上一篇(上篇地址:http://www.cnblogs.com/wobeinianqing/p/5064740.html)
相信很多新手都跟我一样总想这把被点击的item的内容传递给相应对的详情页,其实这种想法是很错误的
listview的功能只管展示给他的数据并不理会数据的内容的。其监听方法
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
}
}
各部分参数:
//adapterView相当于listview Y适配器的一个指针,可以通过它来获得Y里装着的一切东西,再通俗点就是说告诉你,你点的是Y,不是X
// view是你点的b这个view的句柄,就是你可以用这个view,来获得b里的控件的id后操作控件
// i 是b在Y适配器里的位置(生成listview时,适配器一个一个的做item,然后把他们按顺序排好队,在放到listview里,意思就是这个b是第position号做好的)
// l 是b在listview Y里的第几行的位置(很明显是第2行)
可以看出通过这些参数并不能得到对应对的数据的那应该怎么拿到相关数据呢?
其实很简单如果你是静态数据(自己在前面整个数组,里面放些数据)可以直接利用postion(就是上面的 i )对应这数组的下标找到相应对的数据
但如果你不是其实也是这么个理论,只要你能拿到数据,再根据postion对应下标就好了
下面细说下:
public class MyAdapter extends BaseAdapter { private LayoutInflater mLayoutInflater;
// 映射数据
private List<ItemBean> mDataList;
//private long mSumTime;
private int id;
public MyAdapter(Context context, List<ItemBean> list) {
mLayoutInflater = LayoutInflater.from(context);
mDataList = list;
} // 获取数据量
@Override
public int getCount() {
return mDataList.size();
} // 获取对应ID项对应的Item
@Override
public Map<String , String> getItem(int position) { ItemBean itemBean = mDataList.get(position);
Map<String , String> map = new HashMap<String , String>();
map.put("title" , itemBean.itemTitle);
map.put("explain" , itemBean.itemContent);
map.put("price" , itemBean.itemPrice);
map.put("senderPhone" , itemBean.itemSenderPhone);
map.put("sendTime" , itemBean.itemSendTime);
map.put("endTime" , itemBean.itenEndtime);
map.put("sender" , itemBean.itemSender);
map.put("receiver" , itemBean.itemReceiver); return map;
} // 获取对应项ID
@Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) { // 文艺式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//获取纳秒时间 更加精确
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
//由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null
convertView = mLayoutInflater.inflate(R.layout.tasklistitem, null);
holder.title = (TextView) convertView.findViewById(R.id.task_title);
holder.explain = (TextView) convertView.findViewById(R.id.task_explain);
holder.price = (TextView) convertView.findViewById(R.id.task_price);
holder.faraway = (TextView) convertView.findViewById(R.id.task_distance);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// 取出bean对象
ItemBean bean = mDataList.get(position);
// 设置控件的数据
holder.title.setText(bean.itemTitle);
holder.explain.setText(bean.itemContent);
holder.price.setText(bean.itemPrice);
holder.faraway.setText(bean.itemFaraway); return convertView;
// 文艺式 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>163258 20
} // ViewHolder用于缓存控件
class ViewHolder{
public TextView title;//标题
public TextView explain;//说明
public TextView price;//价格
public TextView faraway;//距离
}
}
// 获取对应ID项对应的Item
@Override
public Map<String , String> getItem(int position) { ItemBean itemBean = mDataList.get(position);
Map<String , String> map = new HashMap<String , String>();
map.put("title" , itemBean.itemTitle);
map.put("explain" , itemBean.itemContent);
map.put("price" , itemBean.itemPrice);
map.put("senderPhone" , itemBean.itemSenderPhone);
map.put("sendTime" , itemBean.itemSendTime);
map.put("endTime" , itemBean.itenEndtime);
map.put("sender" , itemBean.itemSender);
map.put("receiver" , itemBean.itemReceiver); return map;
}
我获取的是服务器数据,在自定义adapter 中实现上面的getitem方法,这个方法是默认都要复写的方法(继承baseadapter)继承baseadapter要实现四个方法:
// 获取数据量
@Override
public int getCount() {
return mDataList.size();
} // 获取对应ID项对应的Item
@Override
public Object getItem(int position) {
return postion;
} // 获取对应项ID
@Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {}
看官方多贴心,我们只要重写上面的getitem方法改成你需要的数据类型
上面我复写的方法可以看到我要传递的内容较多所以我用了个map。我们还看到
数据是从bean中拿到的所以我贴出bean的代码:
package com.example.guwie.yaoren.ui.Bean; /**
* Created by guwei on 15-12-17.
*/
public class ItemBean { public String itemTitle;
public String itemContent;
public String itemPrice;
public String itemFaraway;
public String itemSenderPhone;
public String itemSendTime;
public String itenEndtime;
public String itemSender;
public String itemReceiver; /***
* title 标题
* content 说明
* price 价格
* faraway 距离
* */
public ItemBean(String itemTitle, String itemContent, String itemPrice, String itemFaraway, String itemSenderPhone, String itemSendTime, String itenEndtime, String itemSender, String itemReceiver) {
this.itemTitle = itemTitle;
this.itemContent = itemContent;
this.itemPrice = itemPrice;
this.itemFaraway = itemFaraway;
this.itemSenderPhone = itemSenderPhone;
this.itemSendTime = itemSendTime;
this.itenEndtime = itenEndtime;
this.itemSender = itemSender;
this.itemReceiver = itemReceiver;
} }
bean的数据从哪来呢?当然从服务器啦。我们看下获取代码:
/***
* 获取list数据
*
* */
public void getTaskList(int pages) { //Toast.makeText(TaskList.this , pages+"" , Toast.LENGTH_SHORT).show();
RequestQueue mreuestQueut = Volley.newRequestQueue(this); JsonObjectRequest jsreq = new JsonObjectRequest(Request.Method.GET, TASK_LIST_DATE+"page="+pages, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) { Message msg = new Message(); try {
int code = jsonObject.getInt("code");
if(code == 200){ int size = jsonObject.getJSONArray("data").length();
for(int i=0; i<size ; i++){ JSONObject dataObject = jsonObject.getJSONArray("data").getJSONObject(i);
String title = dataObject.getString("title");
String price = dataObject.getString("fee");
String explain = dataObject.getString("description");
String senderPhone = dataObject.getString("senderPhone");
String sendTime = dataObject.getString("sendTime");
String endTime = dataObject.getString("endTime");
String sender = dataObject.getString("sender");
String receiver = dataObject.getString("receiver"); dataList.add(new ItemBean(title , explain , price , "3km" , senderPhone , sendTime, endTime , sender ,receiver ));
}
maxpage = ++page;
page = page-1;
}else if(code == 205){ //已无更多数据
//maxpage = page;
page = maxpage;
msg.what=0x001;
mHandler.sendMessage(msg); }else if(code == 404){
//未找到数据
msg.what = 0x002;
mHandler.sendMessage(msg);
} } catch (JSONException e) {
e.printStackTrace();
Log.i("----------------", "客户端内部错误");
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.i("----------------","服务器出错"+volleyError.toString()); }
});
mreuestQueut.add(jsreq);
}
使用volley获取数据请自行百度
获取的是json数据每次传5条如下:
{
"code":200,
"message":"ok",
"data":[
{
"id":10,
"title":"qwd",
"description":"qwdqwd",
"type":1,
"fee":31,
"senderPhone":"123123",
"sender":23,
"receiver":null,
"sendTime":"2015-12-16 21:11:01",
"endTime":"2015-12-16 21:11:03",
"longtitude":null,
"latitude":null,
"finished":0
},
{
"id":11,
"title":"eqwrwr",
"description":"werwer",
"type":2,
"fee":32,
"senderPhone":null,
"sender":24,
"receiver":null,
"sendTime":"2015-12-18 11:35:41",
"endTime":"2015-12-18 11:35:43",
"longtitude":null,
"latitude":null,
"finished":0
},
{
"id":12,
"title":"sadfef",
"description":"ewqr",
"type":1,
"fee":21,
"senderPhone":"122113",
"sender":24,
"receiver":26,
"sendTime":"2015-12-18 11:35:27",
"endTime":"2015-12-18 11:35:46",
"longtitude":null,
"latitude":null,
"finished":1
},
{
"id":13,
"title":"而通过了",
"description":"435435",
"type":3,
"fee":12,
"senderPhone":"21215",
"sender":26,
"receiver":null,
"sendTime":"2015-12-18 11:36:40",
"endTime":"2015-12-23 11:37:03",
"longtitude":null,
"latitude":null,
"finished":0
},
{
"id":14,
"title":"wefwef",
"description":"23wef",
"type":2,
"fee":12,
"senderPhone":"213214",
"sender":27,
"receiver":25,
"sendTime":"2015-12-18 16:29:42",
"endTime":"2015-12-18 16:29:44",
"longtitude":null,
"latitude":null,
"finished":1
}
]
}
上面处理json数据 的方法是官方对的解析方法当然还有其他方法。通过循环吧数据每次add给自定义的adapter让它
将数据组装给list展示,然后就是对每个item进行监听了:
/**
* item 监听事件
*
* */
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Map<String ,String> map = new MyAdapter(TaskList.this , dataList).getItem(--i);//不减1会出现错位现象
Intent intent = new Intent(TaskList.this, MorInformation.class);
Bundle bundle = new Bundle(); bundle.putString("title" , map.get("title"));
bundle.putString("explain" , map.get("explain"));
bundle.putString("price" , map.get("price"));
bundle.putString("senderPhone" , map.get("senderPhone"));
bundle.putString("sendTime" , map.get("sendTime"));
bundle.putString("endTime" , map.get("endTime"));
bundle.putString("sender" , map.get("sender"));
bundle.putString("receiver" , map.get("receiver")); intent.putExtras(bundle);
startActivity(intent); }
});
这里看到adapter传来的map又被我用bundle包了一遍。其实我也没办法因为intent 并不能传递map 只好借助bundle了
这样在目标页面就已经能拿到这些数据了。什么?bundle如何拿数据?看看吧:
/**
* 放入相关数据
*
* */
private void SetData() { Bundle bundle = this.getIntent().getExtras();
title.setText(bundle.getString("title"));
explain.setText(bundle.getString("explain"));
price.setText(bundle.getString("price"));
phone.setText(bundle.getString("senderPhone"));
date.setText(bundle.getString("endTime"));
add.setText(bundle.getString("explain")); }
其实很简单是吧, Bundle bundle = this.getIntent().getExtras(); 获取bundle对象
然后通过bundle.getString("xxx")的方法来拿相应的数据。
就这么多了
android listview 的监听事件的更多相关文章
- Android ListView的监听事件
Android开发时,最常用的控件之一就是ListView了,而使用ListView的同时,必然需要对它设置监听器,常用的监听器有这么几个1.OnItemClickListener 2.OnTouch ...
- Android 属性动画监听事件与一个菜单的例子
简单监听事件 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3 ...
- Android CheckBox的监听事件
1.在xml文件中定义CheckBox,一定要定义id <CheckBox android:id="@+id/beijing" android:layout_width=&q ...
- Android 软键盘监听事件
Android软键盘的隐藏显示研究 Android是一个针对触摸屏专门设计的操作系统,当点击编辑框,系统自动为用户弹出软键盘,以便用户进行输入. 那么,弹出软键盘后必然会造成原有布局高度的减少 ...
- android的单击监听事件
Button button = (Button) findViewById(R.id.button1); //1.直接new出来 button.setOnClickListener(new View. ...
- android ListView滚动条监听判断滚动到底部还是顶部
代码: lv.setOnScrollListener(new OnScrollListener() { public void onScrollStateChanged(AbsListView vie ...
- 横向滑动的listview和其中用到的触摸监听事件详解
一.首先把横向的listview的代码放上来 HorizontalListView: package com.common.cklibrary.utils.myview; import java.ut ...
- Android开发 ---基本UI组件8:九宫格布局、setOnItemClickListener()项被选中监听事件
效果图: 1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> ...
- Android——监听事件总结
各种监听事件 1.按钮 Button(1)点击监听 btn_1.setOnClickListener(new View.OnClickListener() { (2)长按监听 btn_1.setOnL ...
随机推荐
- 【转帖】4412ARM开发板学习笔记(一)
本文转自迅为论坛:http://www.topeetboard.com 新手在进行开发学习前,建议先看01-迅为电子开发板入门视频.对开发板和开发环境有一定的了解后,不要盲目接线开机.以下是个人的一点 ...
- Hadoop安装lzo实验
参考http://blog.csdn.net/lalaguozhe/article/details/10912527 环境:hadoop2.3cdh5.0.2 hive 1.2.1 目标:安装lzo ...
- Web报表页面如何传递中文参数
1.场景描述 在用报表开发工具FineReport设计的web报表中,给iframe设置src嵌入某个报表时,往往会给报表传递初始的参数值,例如: <iframe id="report ...
- vi/vim实用命令
查找 n是下一个,N是上一个 撤销和重做 u:撤销上一步的操作 ctrl+r:恢复上一步被撤销的操作 替换 :1,$ s/aaa/bbb/g
- 周五了啦啦啦啦-LAMP+PHP‘s OOP
hi 周五咯~~ 1.LAMP配置完结篇 五.LAMP配置环境优化 5.4 虚拟主机工作原理 apache的虚拟主机.virtual-host 用不同的域名访问不同的目录——手动模拟dns 修改hos ...
- 用CSS开启硬件加速来提高网站性能(转)
翻译文章,原文地址:http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-cs ...
- NOIP 2008提高组第三题题解by rLq
啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...
- 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇
始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...
- Docker Network containers
Network containers Estimated reading time: 5 minutes If you are working your way through the user gu ...
- 嵌入式Linux驱动学习之路(四)u-boot编译分析
u-boot编译分析 在配置完成后,执行make开始编译.这里打开Makefile. 首先在目标all前有一句话首先检查是否有include/config.mk文件来判断是否成功配置过. ifeq ( ...