在Android中ListView中添加兩個點擊事件,一個是OnItemClick,另一個是一個圖片的OnClick事件

來源:互聯網
上載者:User

這個是我在csdn裡面寫的第一篇文章,再加上我剛參加工作不久,是一個真真的新手,所以還望大家多多指導。

這裡要分享的是在一個listview中添加兩個點擊事件的解決辦法,效果就像android qq的好友名單中,點擊一個好友,會進入聊天介面,點擊後面的表徵圖,就會進入好友詳細資料介面。這樣的好處就是既不去掉ListView的OnItemClick事件,而且又添加了一個新的事件。

 

接下來是如何?了,首先需要一個自訂的view,我選擇的是定義一個LinearLayout的子類,叫ClickIcon

ClickIcon.java

 

package com.hhg.test.listview2;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;

public class ClickIcon extends LinearLayout {

 public ClickIcon(Context context, AttributeSet attrs) {
  super(context, attrs);
 }

 @Override
 public void setPressed(boolean pressed) {
  
  if (pressed && ((View) getParent()).isPressed()) {
   return;
  }
  super.setPressed(pressed);
 }
}

 

 

然後把這個自訂的view寫到ListView的Adapter的布局檔案中。

list_view_item.xml   

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="horizontal">
 
  <ImageView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/Photo">
  </ImageView>
  <TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/Name"
    android:layout_marginLeft="20dip">
  </TextView>  
  <com.hhg.test.listview2.ClickIcon
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/ClickIconLayout"
    android:layout_marginLeft="50dip">
    
    <ImageView android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:src="@drawable/icon"
     android:id="@+id/img">
    </ImageView>
           
  </com.hhg.test.listview2.ClickIcon>
</LinearLayout>

 

然後在是ListView的Adapter,我是用BaseAdapter的子類。在getView方法中為每一個ClickIcon添加點擊事件。

MyAdapter.java

 

package com.hhg.test.listview2;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

public class MyAdapter extends BaseAdapter {

 private Context context;
 private List<Dog> dogs;

 public MyAdapter(Context context, List<Dog> dogs) {
  this.context = context;
  this.dogs = dogs;
 }

 @Override
 public int getCount() {
  return dogs.size();
 }

 @Override
 public Object getItem(int position) {
  return position;
 }

 @Override
 public long getItemId(int position) {
  return position;
 }

 @Override
 public View getView(final int position, View convertView, ViewGroup parent) {

  LayoutInflater inflater = (LayoutInflater) LayoutInflater.from(context);
  ViewHolder vh = null;

  if (convertView == null) {
   vh = new ViewHolder();
   convertView = inflater.inflate(R.layout.list_view_item, null);

   vh.photo = (ImageView) convertView.findViewById(R.id.Photo);
   vh.name = (TextView) convertView.findViewById(R.id.Name);
   vh.clickIcon = (ClickIcon) convertView
     .findViewById(R.id.ClickIconLayout);

   convertView.setTag(vh);
  } else {
   vh = (ViewHolder) convertView.getTag();
  }

  Dog d = dogs.get(position);

  vh.photo.setImageResource(d.getImgId());
  vh.name.setText(d.getName());
  vh.clickIcon.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    Toast.makeText(context, "Icon clicked, position is:" + position,
      Toast.LENGTH_SHORT).show();
   }
  });

  return convertView;
 }

 private static class ViewHolder {
  ImageView photo;
  TextView name;
  ClickIcon clickIcon;
 }
}
為了省事,我用一個Toast提示那個部分被點擊。

接下來是在Activity中產生ListView,設定Adapter,添加OnItemClick事件。

MainActivity.java

package com.hhg.test.listview2;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

public class MainActivity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  ListView lv = (ListView) findViewById(R.id.TestListView);

  MyAdapter adapter = new MyAdapter(this, getDogs());

  lv.setAdapter(adapter);

  lv.setOnItemClickListener(new OnItemClickListener() {

   @Override
   public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
     long arg3) {
    Toast.makeText(MainActivity.this, "Item clicked, position is:" + arg2,
      Toast.LENGTH_SHORT).show();
   }

  });
 }

 private List<Dog> getDogs() {
  List<Dog> dogs = new ArrayList<Dog>();
  ApplicationInfo appInfo = getApplicationInfo();
  final String packageName = appInfo.packageName;
  for (int i = 0; i < 8; i++) {
   Dog d = new Dog();
   d.setName("Dog No." + i);
   d.setImgId(getResources().getIdentifier("sample_thumb_" + i,
     "drawable", packageName));
   dogs.add(d);
  }
  return dogs;
 }
}

 

這裡用到了一個Dog類,主要是用來組合圖片和文字,圖片資源在ApiDemos裡面可以找到。

Dog.java

package com.hhg.test.listview2;

public class Dog {

 private int id;
 
 private String name;
 
 private int imgId;

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getImgId() {
  return imgId;
 }

 public void setImgId(int imgId) {
  this.imgId = imgId;
 }
 
 
 
}

好了接下來貼圖看效果。

當我們點擊一個Icon時,提示Icon被點擊,位置是多少。

然後當我們點擊一個ListItem時,提示Item被點擊,位置是多少。

 

提示,如果吧LinearLayout的子類換成button的任何子類,如果丟掉了OnItemClicked事件,我就不知道啥原因了。

 

謝謝您的閱讀。

 

若水飛天

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.