以前开发不久的时候会犯这种错误,在Activity文件中设置Listview的监听事件,有人会说这个不对么,答案是对,但是分情况,首先如果适配的item中仅仅只有一个组件(例如只有一个文本,按钮等)这样是可以直接在Activity中直接写的,但是,现在的列表内容都是很丰富的,不仅仅只有一个图片或是文本,都是混合式的既有文本又有图片,这时候你会发现,在Activity中再写ListView的监听事件时候,发现不管用了,那该怎么解决呢,答案是,在适配器中对于某个组件进行监听,这样就可以达到不同组件的监听效果了,下面附上一个小例子,看一下就知道怎么回事了。
这里只列举出对应的Activity和布局文件
item布局
<?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="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@+id/list_item_img"
android:layout_width="120dp"
android:layout_height="110dp"
android:src="@drawable/ic_launcher" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="旧版百元人民币多个角" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:maxEms="20"
android:maxLines="3"
android:textSize="10sp"
android:ellipsize="end"
android:text="这张100元面值的人民币编号为AQ03131766,该钞票正面的右上角多出一个近似于边长1厘米的正方形纸张。从事货币收藏鉴定的中国人民银行安陆市支行货币... " />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/list_item_btn"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_gravity="right|bottom"
android:textSize="10sp"
android:text="进入" />
</FrameLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
Activity的布局文件:
<?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="vertical" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
适配器代码:
package com.example.adpterdemo;
import android.annotation.SuppressLint;
import android.app.Activity;
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.Button;
import android.widget.ImageView;
import android.widget.Toast;
/**
* 适配器
*/
public class Adapter extends BaseAdapter{
private LayoutInflater inflater;
Activity activity;
public Adapter(Activity activity) {
super();
this.activity = activity;
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return 10;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@SuppressLint("InflateParams")
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder;
if (view == null) {
inflater = LayoutInflater.from(parent.getContext());
view = inflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.imageView = (ImageView) view.findViewById(R.id.list_item_img);
holder.button = (Button) view.findViewById(R.id.list_item_btn);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
/**
* 在这里监听每个按钮和图片的事件
*/
holder.button.setOnClickListener(new OnClickListener() {//监听按钮
@Override
public void onClick(View v) {
Toast.makeText(activity.getApplicationContext(), position+"", Toast.LENGTH_SHORT).show();;
}
});
holder.imageView.setOnClickListener(new OnClickListener() {//监听图片
@Override
public void onClick(View v) {
Toast.makeText(activity.getApplicationContext(), position+"", Toast.LENGTH_SHORT).show();
}
});
return view;
}
static class ViewHolder {
private ImageView imageView;
private Button button;
}
}
Activity代码:
package com.example.adpterdemo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
/**
* 展示了如何适配图片以及文字的Activity
*
*/
public class ListViewActivity extends Activity{
ListView listView;
Adapter adapter ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
initView();
}
private void initView() {//初始化View并设置适配器
listView = (ListView) findViewById(R.id.listView1);
adapter = new Adapter(this);
listView.setAdapter(adapter);
}
}