[英]ListView with custom adapter, inside a Fragment doesn't fire onItemClick event
我有一个Fragment内容的ViewProvider类,该类返回其中一个片段的ListView。 ListView具有扩展BaseAdapter类的自定义适配器。 当我尝试实现项目单击侦听器时,它根本不起作用。 我为侦听器提供了以下代码:
lv.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View vi, int pos,
long id) {
try {
Object o = lv.getItemAtPosition(pos);
Event obj_itemDetails = (Event) o;
Toast.makeText(context, "You have chosen : " + " " + obj_itemDetails.getName(), Toast.LENGTH_LONG).show();
Log.d("xxx", "output: "+obj_itemDetails.getName());
} catch(Exception e) {
Log.d(Log.TAG, "Something is wrong...");
}
}
});
...甚至没有例外发生。 在同一个ViewProvider类中,我添加了另一个带有SimpleAdapter的列表,并且效果很好。 我初始化列表相同:
EventAdapter sta = new EventAdapter(context, events);
final ListView lv = new ListView( context );
lv.setTextFilterEnabled(true);
lv.setAdapter(sta);
另一个:
final ListView v = new ListView( context );
String[] from = new String[] { "str" };
int[] to = new int[] { android.R.id.text1 };
List<Map<String, String>> items = new ArrayList<Map<String, String>>();
for ( int i = 0; i < 20; i++ )...//set the items here
SimpleAdapter adapter = new SimpleAdapter( context, items,
android.R.layout.simple_list_item_1, from, to );
v.setAdapter( adapter );
我想念的是什么?
这是我的EventAdapter:
public class EventAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List<Event> items = new ArrayList<Event>();
Context ctx;
public EventAdapter(Context context, List<Event> items) {
mInflater = LayoutInflater.from(context);
this.items = items;
this.ctx = context;
}
public int getCount() {
return items.size();
}
public Event getItem(int position) {
return items.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
final Event s = items.get(position);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.eventTitle);
holder.timestamp = (TextView) convertView.findViewById(R.id.eventTime);
holder.location = (TextView) convertView.findViewById(R.id.eventLocation);
holder.pic = (ImageView) convertView.findViewById(R.id.eventLogo);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.name.setText(s.getName());
holder.timestamp.setText(s.getTimestamp());
holder.location.setText(s.getLocation());
if (s.getImage() != null) {
holder.pic.setImageBitmap(s.getImage());
} else {
// MY DEFAULT IMAGE
holder.pic.setImageResource(R.drawable.ic_launcher);
}
return convertView;
}
static class ViewHolder {
TextView name;
TextView timestamp;
TextView location;
ImageView pic;
}
}
如果自定义列表行中有可聚焦的项目,则项目单击侦听器上的ListView不会触发。也就是说,如果您有任何按钮或进度条或任何获得焦点的控件,onitemclick将不会触发
我想建议您,Activity和Fragment几乎相同,但是不同之处在于我们使用“ this”或“ ActivityName.this”的地方,我们必须将其替换为getActivity(),并使用使类布局夸大的视图声明变量:
确保您正在使用ListView通过ID查找这样的视图。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.yourlayoutfile, container,
false);
listView = (ListView) v
.findViewById(R.id.your_listview_id);
listView.setOnItemClickListener(YourFragmentClassName.this);
}
尝试通过实现onItemClickListener来默认使用onItemClick侦听器。
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
Log.d("OnItemClicked>>", "called");
}
希望对您有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.