在Android中ListView中添加两个点击事件,一个是OnItemClick,另一个是一个图片的OnClick事件

这个是我在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事件,我就不知道啥原因了。

 

谢谢您的阅读。

 

若水飞天

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值