Android列表视图setOnItemClickListener无法工作

5

我希望在列表视图中最初隐藏编辑文本和按钮字段,并在单击该行时显示该编辑文本和按钮。因此,我尝试在布局xml中将高度设置为0,然后在用户单击某一行时将其设置为其他值,但它不起作用,我认为我的列表视图点击事件不起作用。 在Android布局中,我有一个列表视图,其中包括ImageView作为按钮,EditText字段和ListView。如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainPortal" >

<ListView
    android:id="@+id/employeeListView"
    android:layout_width="650dp"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="25dp"
    android:clickable="true">
</ListView>

<EditText
    android:id="@+id/empPin"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/iv_start_journey_btn"
    android:layout_marginBottom="56dp"
    android:layout_marginRight="17dp"
    android:layout_toLeftOf="@+id/employeeListView"
    android:ems="10"
    android:inputType="number"
    android:hint="@string/add_emp_pin_hint" >

    <requestFocus />
</EditText>

<ImageView
    android:id="@+id/iv_start_journey_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/employeeListView"
    android:layout_alignRight="@+id/empPin"
    android:layout_marginBottom="84dp"
    android:onClick="startJourney"
    android:src="@drawable/start" />

</RelativeLayout>

我已经使用以下自定义布局来呈现列表视图

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ImageView
    android:id="@+id/emp_avatar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginTop="18dp"
    android:adjustViewBounds="true"
    android:maxHeight="80dp"
    android:maxWidth="80dp"
    android:src="@drawable/person" />

<TextView
    android:id="@+id/emp_number"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/emp_avatar"
    android:layout_toRightOf="@+id/emp_avatar"
    android:text="Medium Text"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<EditText
    android:id="@+id/empPin"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_alignBottom="@+id/emp_avatar"
    android:layout_alignRight="@+id/emp_number"
    android:layout_toRightOf="@+id/emp_avatar"
    android:ems="10"
    android:inputType="number" >

    <requestFocus />
</EditText>

<Button
    android:id="@+id/empAdd"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_alignBaseline="@+id/empPin"
    android:layout_alignBottom="@+id/empPin"
    android:layout_marginLeft="20dp"
    android:layout_toRightOf="@+id/empPin"
    android:text="@string/emp_add_btn" />

这里我发布Activity.java代码。

public class MainPortal extends Activity {
private List<Employee> employees = new ArrayList<Employee>();
EditText et;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_portal);
    populateEmployeeList();
    //populsteListView();

    ListView list = (ListView) findViewById(R.id.employeeListView);
    ArrayAdapter<Employee> adapter = new MylistAdapter();
    list = (ListView) findViewById(R.id.employeeListView);
    list.setAdapter(adapter);

     list.setOnItemClickListener(new OnItemClickListener() {
          public void onItemClick(AdapterView<?> parent, View view,
                  int position, long id) {
//I ADDED ON CLICK IMPLEMENTATION HERE, BUT THIS IS NOT WORKING
              Toast.makeText(getApplicationContext(), "CLICKED", Toast.LENGTH_SHORT).show();   
              }
            });


private void populateEmployeeList() {
      ...
}



private class MylistAdapter extends ArrayAdapter<Employee>{


    public MylistAdapter(){
        super(MainPortal.this,R.layout.item_view,employees);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View itemView = convertView;
        if(itemView==null){
            itemView = getLayoutInflater().inflate(R.layout.item_view, parent,false);
        }
        Employee currentEmployee = employees.get(position);
        //Avatar
        ImageView imageView = (ImageView) itemView.findViewById(R.id.emp_avatar);
        imageView.setImageResource(currentEmployee.getAvatarId());
        //Employee number
        TextView emp_id = (TextView) itemView.findViewById(R.id.emp_number);
        emp_id.setText(currentEmployee.getId());

        et = (EditText) itemView.findViewById(R.id.empPin);
        return itemView;
    }
}
}

我在上面发布了一些我认为很重要的代码。 请有人帮忙完成这个任务。 提前致谢。
4个回答

22

1
@Grant 当您单击列表项时,按钮会获得焦点。检查EditText是否也是如此。如果是,则从按钮和EditText中删除焦点。 - Raghunandan
3
你可以在XML的根元素中添加android:descendantFocusability="blocksDescendants",以阻止子元素获取焦点。 - Raghunandan
我在列表视图的点击监听器上设置了EditText.setHeight(某个值),但它没有起作用。可能出了什么问题? - Grant
1
它用于刷新列表视图。假设您更改了填充列表视图的基础数据,则在适配器上调用notifyDataSetChanged()以刷新列表视图。另外,为什么要动态更改EditText的高度?只需将其设置为“wrap_content”。 - Raghunandan
1
那为什么你需要设置高度呢?根据你的需求,你可以将视图的可见性设置为不可见或消失。 - Raghunandan
显示剩余6条评论

2

在列表视图中,您的编辑框拥有全部焦点,所以此列表视图的onClick不起作用。请移除编辑框的焦点,它将开始工作。


0
在我的情况下,setOnItemClickListener 在 Android 版本 5.1.1 及以下的版本中运行良好。但是在 Android 6.0.1 上出现问题。最后我找到了解决方案。尝试这个
从您的 XML 布局中删除这些行。
android:orientation="vertical"
tools:context=".ManageRequest"
android:contextClickable="true"

在安卓 6.0.1 版本上运行正常 希望你的问题解决了..!!! 开心编程 :)


0
// try this
public class MainPortal extends Activity {
    private List<Employee> employees = new ArrayList<Employee>();
    EditText et;
    ListView list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_portal);
        populateEmployeeList();
        //populsteListView();

        list = (ListView) findViewById(R.id.employeeListView);
        ArrayAdapter<Employee> adapter = new MylistAdapter();
        list.setAdapter(adapter);

        list.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
//I ADDED ON CLICK IMPLEMENTATION HERE, BUT THIS IS NOT WORKING
                Toast.makeText(getApplicationContext(), "CLICKED", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接