onListItemClick 不起作用...为什么?
onListItemClick doesnt work... Why?
我尝试教我列一个清单,其中包含一些片段。我现在已经创建了一个自定义数组适配器,使列表中的行适合我的应用程序。但是,当我按下该项目时没有任何反应。但是,复选框按预期工作 (?)
我做错了什么?
提前致谢
List_Fragment
public class List_Fragment extends ListFragment{
ArrayList<Detail> items= new ArrayList<Detail>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.list_layout, container, false);
CustomAdapter adapter = new CustomAdapter(getActivity(), items);
setListAdapter(adapter);
return root;
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Detail detail = items.get(position);
Toast.makeText(getActivity(), detail.getTitle(), Toast.LENGTH_LONG).show();
}
public void setItems(ArrayList<Detail> items) {
this.items = items;
}
}
自定义适配器
@Override
public View getView(int position, View convertView, ViewGroup parent){
LayoutInflater theInflater = LayoutInflater.from(getContext());
View view = theInflater.inflate(R.layout.list_row, parent, false);
final Detail title = getItem(position);
TextView titleView = (TextView)view.findViewById(R.id.itemTitle);
titleView.setText(title.getTitle());
CheckBox chkbox = (CheckBox)view.findViewById(R.id.itemDone);
chkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
title.setDone(true);
}
});
return view;
}
你的 OnListItemClicked()
和你的 OnCheckChangedListener
相互冲突。
我认为您需要在 CheckBox 上设置属性 android:focusable="false"
。您可能还需要在 ListFragment 上调用 getListView().setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)
。请参阅 "onitemselected not working" 的其他 SO 问题,因为这方面存在差异。
我还注意到您的 setItems()
方法只是设置了您的成员变量,并没有更新适配器。
public void setItems(ArrayList<Detail> items) {
// this.items = items;
CustomAdapter adapter = (CustomAdapter) getListView().getAdapter();
adapter.clear();
adapter.addAll(items);
adapter.notifyDataSetChanged();
}
这将使您的列表正确更新。
(把我原来的代码拿出来因为我忘了ArrayAdapter
有clear()
、add()
、insert()
等方法所以你不需要扩展BaseAdapter
.)
我尝试教我列一个清单,其中包含一些片段。我现在已经创建了一个自定义数组适配器,使列表中的行适合我的应用程序。但是,当我按下该项目时没有任何反应。但是,复选框按预期工作 (?)
我做错了什么?
提前致谢
List_Fragment
public class List_Fragment extends ListFragment{
ArrayList<Detail> items= new ArrayList<Detail>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.list_layout, container, false);
CustomAdapter adapter = new CustomAdapter(getActivity(), items);
setListAdapter(adapter);
return root;
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Detail detail = items.get(position);
Toast.makeText(getActivity(), detail.getTitle(), Toast.LENGTH_LONG).show();
}
public void setItems(ArrayList<Detail> items) {
this.items = items;
}
}
自定义适配器
@Override
public View getView(int position, View convertView, ViewGroup parent){
LayoutInflater theInflater = LayoutInflater.from(getContext());
View view = theInflater.inflate(R.layout.list_row, parent, false);
final Detail title = getItem(position);
TextView titleView = (TextView)view.findViewById(R.id.itemTitle);
titleView.setText(title.getTitle());
CheckBox chkbox = (CheckBox)view.findViewById(R.id.itemDone);
chkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
title.setDone(true);
}
});
return view;
}
你的 OnListItemClicked()
和你的 OnCheckChangedListener
相互冲突。
我认为您需要在 CheckBox 上设置属性 android:focusable="false"
。您可能还需要在 ListFragment 上调用 getListView().setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)
。请参阅 "onitemselected not working" 的其他 SO 问题,因为这方面存在差异。
我还注意到您的 setItems()
方法只是设置了您的成员变量,并没有更新适配器。
public void setItems(ArrayList<Detail> items) {
// this.items = items;
CustomAdapter adapter = (CustomAdapter) getListView().getAdapter();
adapter.clear();
adapter.addAll(items);
adapter.notifyDataSetChanged();
}
这将使您的列表正确更新。
(把我原来的代码拿出来因为我忘了ArrayAdapter
有clear()
、add()
、insert()
等方法所以你不需要扩展BaseAdapter
.)