【问题标题】:Trouble catching onClick event from listview无法从列表视图中捕获 onClick 事件
【发布时间】:2014-01-06 20:59:07
【问题描述】:

我通过 editText 向我的用户询问邮政编码,然后我使用一个按钮来获取并使用 simpleCursorAdapter 在 listView 中显示商店位置。

现在我希望能够通过在 listView 中选择一个项目并传递一些字符串信息来启动一个新活动。

我无法让 onClickListener 注册我的点击。

是不是因为我使用的是 Activity 而不是 ListActivity?

我宁愿将输入(EditText)和结果(ListView)都放在同一个活动中。

activity_pcentry:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/enter_post" />

    <EditText
        android:id="@+id/etPostCode"
        android:imeOptions="actionSearch"
        android:inputType="textCapCharacters"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >
        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/search_button"
        android:onClick="DoPostSearch" />

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

stockrow_group:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:clickable="true"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/branch"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" >
    </TextView>

    <TextView
        android:id="@+id/post"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" >
    </TextView>

    <TextView
        android:id="@+id/telephone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" >
    </TextView>


</LinearLayout>

PostCodeEntryActivity.java:

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;    

public class PostCodeEntryActivity extends Activity{

        private MyDatabase stockistsDB;
        public EditText enteredCode;
        private ListView listView;

        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_pcentry);
            stockistsDB = new MyDatabase(this);
        }


        public void DoPostSearch(View v) {

            enteredCode = (EditText)findViewById(R.id.etPostCode);
            String postalCode = enteredCode.getText().toString();
            Cursor results = stockistsDB.getStockistsFromPostCode(postalCode);

            if (results != null && results.getCount() > 0) {
                SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                        R.layout.stockrow_group,
                        results, new String[]{"fld_BranchName","fld_PostCode","fld_Tel"},
                        new int[]{R.id.branch,R.id.post,R.id.telephone},
                        0);

                listView = (ListView)findViewById(R.id.list);
                listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener()
                {
                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1,
                            int arg2, long arg3) {
                        Toast.makeText(PostCodeEntryActivity.this, "Clicked", Toast.LENGTH_SHORT).show();
                    }
                });
                listView.setAdapter(adapter);


            } else {
                Toast.makeText(PostCodeEntryActivity.this, "No results found, please check your postcode", Toast.LENGTH_SHORT).show();
            }
        }
    }

【问题讨论】:

  • 你能发帖stockrow_group.xml
  • 我的错,应该从一开始就有。

标签: android listview onclicklistener listactivity simplecursoradapter


【解决方案1】:

行本身是否有任何可点击的元素?请从 R.layout.stockrow_group 发布 XML。

如果您在该布局上有按钮,例如,您可能需要将以下内容添加到这些按钮:

android:focusable="false"
android:focusableInTouchMode="false"

这将确保对列表项的单击不会被行本身的可单击项阻止。

实际解决方案:

不要使列表视图的行可点击。这将通过注册一个空的点击处理程序来“吃掉”点击事件。从列表视图的行中删除以下行:

android:clickable="true"

【讨论】:

  • 暂时没有,但计划是在行中添加一个图像按钮并启动地图。我在上面添加了缺少的 xml。
  • 如果从 stockrow_group 的 LinearLayout 中删除 android:clickable="true" 会发生什么?
  • 你知道这真的是小事。非常感谢。快速搜索似乎 android:clickable="true" 注册了一个空的 onClickListener。请参阅here 了解更多信息。
  • 没问题。我已经用解决方案更新了我的答案。
【解决方案2】:
  1. 在您的活动中实现AdapterView.onItemClickListener`
  2. 改变

    listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener()

    listView.setOnItemClickListener(this)

  3. 添加未实现的方法

【讨论】:

  • 我很确定我以前试过这个,但我会再试一次。
  • 不,它仍然没有触发。也没有在调试模式下注册。我的 editText 可以保持焦点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 2015-12-12
  • 2016-02-18
  • 1970-01-01
  • 2011-08-27
  • 2016-06-02
相关资源
最近更新 更多