Android 列表活动';s onListItemClick不起作用
在我的具有ListActivity的应用程序中,通过单击Android 列表活动';s onListItemClick不起作用,android,android-listview,adapter,listactivity,Android,Android Listview,Adapter,Listactivity,在我的具有ListActivity的应用程序中,通过单击ListView项不会触发覆盖的onListItemClick回调 我用以下xml文件permissionview.xml定义了一个自定义listview <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_widt
ListView
项不会触发覆盖的onListItemClick
回调
我用以下xml文件permissionview.xml定义了一个自定义listview
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/btn_Apply"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_apply"
android:onClick="onApplyClick" />
<Button
android:id="@+id/btn_install"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_install"
android:onClick="onInstallClick" />
<Button
android:id="@+id/btn_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cancel" />
</LinearLayout>
<ListView android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false">
</ListView>
</LinearLayout>
定义的ArrayAdapter
定义如下:
public class InteractiveArrayAdapter extends ArrayAdapter<Model> {
private final List<Model> list;
private final Activity context;
private boolean changeable;
public InteractiveArrayAdapter(Activity context, List<Model> list, boolean changeable) {
super(context, R.layout.checkable, list);
this.context = context;
this.list = list;
this.changeable = changeable;
}
static class ViewHolder {
protected TextView text;
protected CheckBox checkbox;
protected ImageView image;
protected int pos;
}
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView == null) {
LayoutInflater inflater = context.getLayoutInflater();
view = inflater.inflate(R.layout.checkable, null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) view.findViewById(R.id.label);
viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
viewHolder.image = (ImageView) view.findViewById(R.id.img);
viewHolder.pos = position;
view.setClickable(true);
if (!changeable)viewHolder.checkbox.setEnabled(false);
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Model element = (Model) viewHolder.checkbox.getTag();
element.setActive(buttonView.isChecked());
}
}
);
view.setTag(viewHolder);
viewHolder.checkbox.setTag(list.get(position));
} else {
view = convertView;
((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.text.setText(list.get(position).showPermission());
holder.checkbox.setChecked(list.get(position).isActive());
if (list.get(position).isRedundant()) {
holder.image.setImageDrawable(context.getResources().getDrawable(R.drawable.warning));
} else {
holder.image.setImageDrawable(context.getResources().getDrawable(R.drawable.ok));
}
return view;
}
}
不会执行onListItemClick
方法。在ArrayAdapter中定义onClickListener时,单击事件起作用:
view.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
System.out.println("Klick D1 " + list.get(viewHolder.pos));
}
});
为什么ArrayAdapter中的click事件定义有效,但ListActivity中的覆盖无效?我找不到失败。如果您想要一个“常规”单击侦听器(适用于listview中的所有项目),您的活动应该实现一个“常规”单击侦听器
public class PermissionViewActivity extends ListActivity implements OnItemClickListener
您需要重写该方法
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3)
{
Toast.makeText(this, "Clicked", Toast.LENGTH_SHORT).show();
}
如果您希望有一个“常规”单击侦听器(适用于listview中的所有项目),那么您的活动应该实现一个“常规”单击侦听器
public class PermissionViewActivity extends ListActivity implements OnItemClickListener
您需要重写该方法
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3)
{
Toast.makeText(this, "Clicked", Toast.LENGTH_SHORT).show();
}
尝试将行布局中的
复选框设置为不可聚焦:
//...
<CheckBox
android:id="@+id/check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginLeft="4px"
android:layout_marginRight="10px"
android:focusable="false"
android:clickable="true">
//...
/。。。
//...
尝试将行布局中的复选框设置为不可聚焦:
//...
<CheckBox
android:id="@+id/check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginLeft="4px"
android:layout_marginRight="10px"
android:focusable="false"
android:clickable="true">
//...
/。。。
//...
我通过以下方式在包含ListView的视图中执行此操作:
ListView lv = (ListView)findViewById(R.id.myList);
lv.setAdapter(new myCustomAdapter,items);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id){
/* do something i've been clicked */
});
ListView lv=(ListView)findviewbyd(R.id.myList);
lv.setAdapter(新的myCustomAdapter,项目);
lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView arg0、视图arg1、整型位置、长id){
/*做一些我被点击过的事情*/
});
或者在一个选定的事件中
lv.setOnItemSelectedListener(new AdapterView.onItemSelectedListener(){
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id){
...
}
public void onNothingSelected(AdapterView<?> arg0){
...
}
});
lv.setOnItemSelectedListener(新的AdapterView.onItemSelectedListener(){
已选择公共位置(AdapterView arg0、视图arg1、整型位置、长id){
...
}
未选择公共无效(AdapterView arg0){
...
}
});
希望这有帮助我通过以下方式在包含ListView的视图中执行此操作:
ListView lv = (ListView)findViewById(R.id.myList);
lv.setAdapter(new myCustomAdapter,items);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id){
/* do something i've been clicked */
});
ListView lv=(ListView)findviewbyd(R.id.myList);
lv.setAdapter(新的myCustomAdapter,项目);
lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView arg0、视图arg1、整型位置、长id){
/*做一些我被点击过的事情*/
});
或者在一个选定的事件中
lv.setOnItemSelectedListener(new AdapterView.onItemSelectedListener(){
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id){
...
}
public void onNothingSelected(AdapterView<?> arg0){
...
}
});
lv.setOnItemSelectedListener(新的AdapterView.onItemSelectedListener(){
已选择公共位置(AdapterView arg0、视图arg1、整型位置、长id){
...
}
未选择公共无效(AdapterView arg0){
...
}
});
希望这对您有所帮助如果您在ListItem中有可单击的视图,则需要将focusable标志设置为false。通过在布局中设置focusable=false,当以编程方式设置侦听器时,它将被覆盖
我的解决方案通过编程方式调用并设置焦点来为我工作
listview.setOnItemClickListener(this);
listview.setFocusable(false);
如果ListItem中有可单击的视图,则需要将focusable标志设置为false。通过在布局中设置focusable=false,当以编程方式设置侦听器时,它将被覆盖
我的解决方案通过编程方式调用并设置焦点来为我工作
listview.setOnItemClickListener(this);
listview.setFocusable(false);
阅读有关可聚焦问题的内容并尝试了此操作,但没有任何帮助。@user1411093您是否也尝试了ListView
上的android:genderantfocusability=“beforestendersons”
属性(并从ListView
中删除android:focusable=“false”
)(但保留android:focusability=“false”
在复选框中找到了解决方案,它是android:genderantfocusability=“aftergenders”
感谢您的帮助。阅读有关聚焦问题的内容并尝试了此方法,但没有帮助。@user1411093您是否也尝试过android:genderantfocusability=“beforesgenders”列表视图上的属性(并从列表视图中删除android:focusable=“false”
)(但保留复选框上的android:focusable=“false”
)最终找到了解决方案,它是android:genderantfocusability=“aftergenders”
感谢您的帮助。尝试了此操作,但无效。getListView()
提供了一个对象,也可以使用getOnItemClickListener
访问它,但侦听器没有“启动”当我单击时。我找不到问题所在,是否有任何选项可以阻止执行侦听器事件?是的!您的listview中有一个复选框,它将从listview中“窃取”单击功能。在checkable.xml中的标记下添加安卓:focusable=“false”是的,我发现,复选框“窃取”单击事件,当我为复选框设置clickable=“false”
时,单击vor列表项起作用,但我需要两者,而focusable不起作用。最终找到了解决方案,它是android:genderantfocusability=“aftergenders”
感谢您的帮助。尝试了这个,但没有起作用。getListView()
传递一个对象,也可以使用getOnItemClickListener
访问它,但是当我单击时,侦听器没有“激发”。我找不到问题,是否有任何选项可以阻止执行侦听器事件?是的!您的listview中有一个复选框,它实质上是“窃取”listview中的单击功能。在checkable.xml中的标记下添加android:focusable=“false”是的,我发现,当我设置clickable=“false”时,checkbos“窃取”单击事件
对于复选框,click vor listitem起作用,但我需要两者,focusable不起作用。最终找到了解决方案,它是android:DegenantFocusability=“AfterDegenders”
感谢您的帮助。我尝试了类似的方法,但我定义了ListView lv=getListView()
。我不明白idmyList
是在哪里定义的?思想列表视图必须使用@android:id/list
?I来定义