如何感知在Android List View元素中点击的内容

时间:2014-01-29 04:01:37

标签: android user-interface android-listview onclick

我正在使用ListView构建Android应用程序。我有列表视图项目如下所示。

List Item Index 0

^列出项目索引0

List Item Index 1

^列出项目索引1

xlm如下。

<?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="wrap_content"
    android:orientation="horizontal"
    android:padding="4dip" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:src="@drawable/icon" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_weight="0.93"
        android:orientation="vertical"
        android:padding="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp" >

        <!-- JFN bottom used to be 2, top 6 -->
        <!-- Name Label -->

        <TextView
            android:id="@+id/name"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="0dip"
            android:paddingTop="0dip"
            android:textColor="#43bd00"
            android:textSize="16sp"
            android:textStyle="bold" />
        <!-- Email label -->

        <TextView
            android:id="@+id/email"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="0dip"
            android:textColor="#acacac" />

        <!-- Mobile number label -->

        <TextView
            android:id="@+id/mobile"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:text="Mobile: "
            android:textColor="#5d5d5d"
            android:textStyle="bold" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="right"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/chat"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_marginRight="2dip"
            android:gravity="right"
            android:src="@drawable/chat" />

        <ImageView
            android:id="@+id/calendar"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_marginRight="2dip"
            android:gravity="right"
            android:src="@drawable/calendar" />
    </LinearLayout>

</LinearLayout>

我正在尝试检测四种不同的点击事件:

  1. 点击狗的照片时
  2. 点击中间部分时
  3. 点击聊天按钮时
  4. 点击日历按钮时
  5. 此外,必须根据ListView中的哪个项目单击来区分每个点击次数。

    我知道如何区分每个ListItem:我可以使用ListView.setOnItemClickListener,如下所示,它提供列表中项目的id。但这并没有告诉我四个部分中的哪一部分被点击了。

    ListView lv = getListView();
    
    // Listview on item click listener
    lv.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem
            Log.d("JFN","List item clicked with id: "+id);
        }
    });
    

    我还可以将不同的onClick函数调用绑定到xml中的四个部分中的每个部分,但这不会让我知道单击了哪个列表项。

    android:onClick="imgClicked"
    

    我认为我不能将这两种解决方案结合起来,因为它会引入竞争条件。有没有一种正确的方法来完成检测单击哪个列表项,以及单击该特定列表项的哪一部分?

    更多信息

    以下代码显示了使用适配器创建ListView。

    // Retrieve string, convert to JSON, and extract contacts
    String jsonData = jsonToStringFromAssetFolder("maemployees.json",this);
    JSONObject jsonObj = new JSONObject(jsonData).getJSONObject(TAG_RESULTS);
    int numContacts = jsonObj.getInt(TAG_NUM);
    Log.d("JFN","Number of contacts stated: "+numContacts);
    contacts = jsonObj.getJSONArray(TAG_CONTACTS);
    Log.d("JFN","Number of contacts present: "+contacts.length());
    // Loop over contacts
    for( int i=0; i<contacts.length(); i++) {
        // Extract this one
        JSONObject c = contacts.getJSONObject(i);
    
        // Extract strings
        String first = (c.has(TAG_FIRST)) ? c.getString(TAG_FIRST) : "";
        String last = (c.has(TAG_LAST)) ? c.getString(TAG_LAST) : "";
        String city = (c.has(TAG_CITY)) ? c.getString(TAG_CITY) : "";
        String state = (c.has(TAG_STATE)) ? c.getString(TAG_STATE) : "";
        String country = (c.has(TAG_COUNTRY)) ? c.getString(TAG_COUNTRY) : "";
        String costName = (c.has(TAG_COST_NAME)) ? c.getString(TAG_COST_NAME) : "";
    
        // Temporary hash map for single contact
        HashMap<String, String> contact = new HashMap<String, String>();
        contact.put("name", first+" "+last);
        contact.put("email", city+", "+state+", "+country);
        contact.put("mobile", costName);
    
        // Adding single contact to list
        contactList.add(contact);
    }
    Log.d("JFN","Done looping contacts");
    //Updating parsed JSON data into ListView
    ListAdapter adapter = new SimpleAdapter(
            MainActivity.this, contactList,
            R.layout.list_item, new String[] { "name", "email",
                    "mobile" }, new int[] { R.id.name,
                    R.id.email, R.id.mobile });
    setListAdapter(adapter);
    

3 个答案:

答案 0 :(得分:1)

您必须在适配器中设置列表视图的内容,因此在适配器内部有一个方法getView()。在getView()内部定义每个视图,然后在这些视图中设置onCLickListener。

对于Ex:

dog.setOnClickListener(new OnClickListener() {      
    @Override
    public void onClick(View v) {
       //operation to be performed.
    }
});

同样将onCLickListeners()应用于所有其他观看次数。

答案 1 :(得分:1)

好吧我遇到了类似的问题,但我使用 ViewPager 并使用 ListFragment 和自定义{{1}布局。

在上述情况下,您只使用 ListView ,但是如果您使用ImageViewsImageButtonCheckBox等控件,以防万一会遇到问题herehere

这只是因为此类控件可以从Button窃取焦点,并且无法选择/点击完整的列表项。所以我会说只使用 ListView 是明智之举 我假设您使用适配器来设置列表的内容。在该适配器内,您可以为每个项目指定ImageViews,如下所示:

onClickListener()

但请记住,在使用public class MyListAdapter extends ArrayAdapter<String>{ ....... @Override public View getView(int position, View convertView, ViewGroup parent) { View rowView=inflator.inflate(R.layout.channel_list_item, null, true); ImageView chat=(ImageView) rowView.findViewById(R.id.chat); chat.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //do something } } ImageView calendar=(ImageView) rowView.findViewById(R.id.calendar); calendar.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //do something } } ....... } } ImageButtonCheckBox等控件时,您需要在XML中指定属性 Button 。对于 android:focusable="false" ,您需要在ImageButton方法中执行此操作:

getView()

或者你也可以使用Nathaniel Waggoner的方法。

希望我回答你的问题。

答案 2 :(得分:0)

如果您不想为每个项目设置单击侦听器,则另一个选项是将点击时传递的视图的view.getId()值与视图的ID进行比较,例如:< / p>

switch(view.getId()){
  case(R.id.dog_image):
    //do stuff
    break;
  case(R.id.other_image):
    //do stuff
    break;
}

否则,您可以通过在onCreate中执行以下操作以编程方式执行此操作:

.....
setContentView(myView);
ImageView dogImage = (ImageView) findViewById(R.id.dog_image);
dogImage.setOnClickListener(new View.OnClickListener {
   @Override
   public void onClick(View v) {
     // do stuff...
   }

})

....