您的位置:首页 > 移动开发 > Android开发

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

2013-12-26 13:56 706 查看
这个是我在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事件,我就不知道啥原因了。

谢谢您的阅读。

若水飞天
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐