关于android listview 的onItemClick方法

guomingyue1991 2013-07-30 11:08:38
我自己写了一个adapter继承baseAdapter,能填充数据,但是我想在listView的onItemClick()中得到item中的值,这个方法里面有4个参数大概知道,但是我怎么获取之前put进去的值啊,我这里找了一个模板,但是不行,单击item以后,总在String number = map.get("number").toString();这一行报空指针,是哪里没有取出来呢?
这是在mainActivity中使用数据
cardList.setAdapter(cardItemAdapter);
//为每个列表项添加单击事件,点击进入名片详情
cardList.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
ListView listView = (ListView)parent;
@SuppressWarnings("unchecked")
HashMap<String, Object> map = (HashMap<String, Object>)listView.getItemAtPosition(position);
String number = map.get("number").toString();
Intent intent = new Intent(MainActivity.this,CardDetailActivity.class);
startActivity(intent);
Log.v("abc", "你点击了ListView条目" + position+"电话是"+number);//在LogCat中输出信息
}
});

这是我写的适配器
package com.wisesoft.cloudwab.adapter;

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

import com.wisesoft.cloudwab.R;
import com.wisesoft.cloudwab.bean.Data;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;


public class CardItemAdapter extends BaseAdapter {

private LayoutInflater mInflater;//得到一个LayoutInfalter对象用来导入布局

/*构造函数*/
public CardItemAdapter(Context context) {
this.mInflater = LayoutInflater.from(context);
}

@Override
public int getCount() {

return getData().size();//返回数组的长度
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}
/*书中详细解释该方法*/
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
//观察convertView随ListView滚动情况
Log.v("MyListViewBase", "getView " + position + " " + convertView);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.card_list_item,
null);
holder = new ViewHolder();
/*得到各个控件的对象*/
holder.alpha = (TextView) convertView.findViewById(R.id.alpha);
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.number = (TextView) convertView.findViewById(R.id.number);
holder.headImg = (ImageView)convertView.findViewById(R.id.headImg);
holder.bt_call = (ImageButton) convertView.findViewById(R.id.bt_call);
convertView.setTag(holder);//绑定ViewHolder对象
}
else{
holder = (ViewHolder)convertView.getTag();//取出ViewHolder对象
}
/*设置TextView显示的内容为我们存放在动态数组中的数据*/
holder.alpha.setText(getData().get(position).get("alpha").toString());
holder.name.setText(getData().get(position).get("name").toString());
holder.number.setText(getData().get(position).get("number").toString());
holder.headImg.setImageResource(R.drawable.mn);
holder.bt_call.setImageResource(R.drawable.call);
if(position!=0&&!(getData().get(position).get("alpha").equals(getData().get(position-1).get("alpha"))))
holder.alpha.setVisibility(View.VISIBLE);
/*为Button添加点击事件---打电话*/
holder.bt_call.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Log.v("abc", "你点击了按钮" + position);//打印Button的点击信息

}
});

return convertView;
}

/*添加一个得到数据的方法,方便使用*/
private ArrayList<HashMap<String, Object>> getData(){

ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
/*为动态数组添加数据*/
int card_num = Data.cardList.size();
for(int i=0;i<card_num;i++)
{
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("alpha", Data.cardList.get(i).getHeadSpell());
map.put("number", Data.cardList.get(i).getTelNumber());
map.put("name", Data.cardList.get(i).getName());
listItem.add(map);
}
return listItem;

}

public final class ViewHolder{
public TextView alpha;
public TextView number;
public TextView name;
public ImageView headImg;
public ImageButton bt_call;
}
}


...全文
814 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪月弦歌 2015-04-14
  • 打赏
  • 举报
回复
你这样是得不到的
梦_枫 2015-04-14
  • 打赏
  • 举报
回复
map = (HashMap<String, Object>) arg0.getItemAtPosition(arg2); Log.e("======", map.get("url_tv") + "");
The_Murderer 2015-04-14
  • 打赏
  • 举报
回复
输出一下onItemClick()方法中的postion,看看值是多少,getItem()方法中要return position。
zhyntc54321 2013-07-31
  • 打赏
  • 举报
回复
而且listView持有的item是固定的,一般是一屏的数量加上下两个,通过listView去取数据很容易空指针 你的adapter都在复用item了,应该明白这点的
zhyntc54321 2013-07-31
  • 打赏
  • 举报
回复
取数据不该从listView去取,概念错了 数据应该是存在adapter里,如果你需要数据,从adapter开个方法get出来,这样就不会出问题,而且效率高
YiDianluckily 2013-07-30
  • 打赏
  • 举报
回复
parent.getItemAtPosition(position).toString() 用这个应该是可以的吧
顾小林 2013-07-30
  • 打赏
  • 举报
回复
holder.alpha = (TextView) convertView.findViewById(R.id.alpha); holder.name = (TextView) convertView.findViewById(R.id.name); holder.number = (TextView) convertView.findViewById(R.id.number); 通过读取 你点击的这个view 里面的 textview 是否就OK了?
guomingyue1991 2013-07-30
  • 打赏
  • 举报
回复
引用 1 楼 shen332401890 的回复:
holder.alpha = (TextView) convertView.findViewById(R.id.alpha); holder.name = (TextView) convertView.findViewById(R.id.name); holder.number = (TextView) convertView.findViewById(R.id.number); 通过读取 你点击的这个view 里面的 textview 是否就OK了?
但是还有的值我没有放到控件里面去呢?那就提取不出来了啊
guomingyue1991 2013-07-30
  • 打赏
  • 举报
回复
引用 2 楼 YiDianluckily 的回复:
parent.getItemAtPosition(position).toString() 用这个应该是可以的吧
试过用这个 还是不行parent.getItemAtPosition(position)返回的值就是空的

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧