一开始有人说使用HashMap先把值存进去,然后再取,这样的方法思想简单,就是用起来有点复杂。
后来一想一定有相应的点击事件,果不其然
ListView list = (ListView) findViewById(R.id.listview);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Object listItem = list.getItemAtPosition(position);
}
});
这个listItem就是得到的点击对象,但是无法调用setOnClickListener事件,为什么呢
进一步研究
getItemAtPosition
方法的定义
public Object getItemAtPosition(int position) {
T adapter = getAdapter();
return (adapter == null || position < 0) ? null : adapter.getItem(position);
}
public long getItemIdAtPosition(int position) {
T adapter = getAdapter();
return (adapter == null || position < 0) ? INVALID_ROW_ID : adapter.getItemId(position);
}
发现最终还是调用
getItem
方法,这个方法是在继承BaseAdapter的时候重写的方法
@Override
public Object getItem(int position) {
return null;
}
可以看出这个方法返回的是一个空对象,当然就没有点击事件了。但是想触发点击事件怎么办呢,返回一个当前的点击对象?怎么做呢?
// parent 相当于listview Y适配器的一个指针,可以通过它来获得Y里装着的一切东西,再通俗点就是说告诉你,你点的是Y,不是X - -
// view 是你点b item的view的句柄,就是你可以用这个view,来获得b里的控件的id后操作控件
// position 是b在Y适配器里的位置(生成listview时,适配器一个一个的做item,然后把他们按顺序排好队,在放到listview里,意思就是这个b是第position号做好的)
// id 是b在listview Y里的第几行的位置(很明显是第2行),大部分时候position和id的值是一样的不妨笔锋一转,回到源头上来。如果只想识别特殊位置的对象,不如做一个判断,直接通过position判断那些固定位置的List。
比如说第0个位置上的:
if(position == 0){
//write your logic
}else{
//write your logic
}
经过实践证实:通过修改getItem返回的对象就可以获得当前点击对象
这里贴出模板代码:
list_friend.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
if(position == 0){
//write your code
}else{
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Object_Item = your_Adapter.getItem(position);
}
});
}
}
});
@Override
public Object getItem(int position) {
return datalist.get(position);
}
your_Adapter和datalist替换成你的适配器和数据列表,Object_Item是你返回的对象也就是datalist里面的泛型对象