1

我通过editText向用户询问邮政编码,然后使用按钮在listView中使用simpleCursorAdapter获取并显示商店位置。从列表视图中收集onClick事件的问题

现在我想能够通过选择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(); 
      } 
     } 
    } 
+1

您可以发布'stockrow_group.xml' – Raghunandan

+0

我的错误,应该从一开始就受够了。 – pdbrito

回答

3

你对行本身的任何可点击元素?请发布R.layout.stockrow_group中的XML。

如果您有关于该布局例如按钮,你可能需要将以下添加到这些按钮:

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

这将确保在列表项目的点击是没有得到阻止的点击项目行本身。

实际的解决方案:

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

android:clickable="true" 
+0

目前还不是,但计划是在行中添加一个图像按钮并启动地图。我已经添加了上面缺少的xml。 – pdbrito

+1

如果从stockrow_group中的LinearLayout中删除'android:clickable =“true”',会发生什么? – doorstuck

+0

你知道这确实是小事。非常感谢。做一个快速搜索似乎android:clickable =“true”注册一个空的onClickListener。请参阅[这里](http://stackoverflow.com/questions/7894815/android-androidclickable-true-means-that-its-not-clickable)了解更多信息。 – pdbrito

1
  1. 在activity`实现AdapterView.onItemClickListener
  2. 变化

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

    listView.setOnItemClickListener(this)

  3. 添加未实现的方法

+0

我很确定我以前试过这个,但我会再给它一次。 – pdbrito

+0

不,它仍然不会着火。在调试模式下也没有任何注册。我的editText可以保持焦点吗? – pdbrito

+0

已更新的答案。 – Aashir