转发自:http://m.blog.csdn.net/article/details?id=52040100
面试的时候被问到这个问题,只能说见识短啊,没遇到过这个问题,回来赶紧搜了一下解决方案。
如果列表中有一个按钮,那么点击列表时,列表的点击事件将不会被触发,因为点击事件被Button点击事件屏蔽了,因此无法点击。
解决方法
在ItemLayout的根部局加上属性android:descendantFocusability= “blocksDescendants”
在需要点击的控件上如Button加上属性 android:focusable=”false”
这样就可以都触发点击事件了。但是这样的话Button的点击事件的处理是写在Adapter里面的,那如何写在Activity里面呢?使用接口回调可以实现。
在Adapter里面定义一个接口叫CallBack,接口的抽象方法为click(View view)然后在getView方法里面对button的点击事件进行注册,并重写onClick方法,方法体为mCallBack.click(view),也就是说点击Button按钮时就去调用CallBack的click方法在getView里面给button setTag,Tag值为position,这样可以记录button所在的具体位置在Adapter的抽象方法里面加上CallBack参数,这样当listView设置adapter时就必须new CallBack,然后重写click方法。
这样就利用接口回调实现了在Adapter之外对Button的按钮点击事件处理的功能了
这可能就是传说中的回调吧!!!
Adapter代码
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import java.util.List;
/**
* Created by DELL on 2016/7/26.
*/
public class MyAdapter extends BaseAdapter implements View.OnClickListener{
private Context mContext;
private LayoutInflater mInflater;
private List<String> mList;
private int mItemLayoutId;
private CallBack mCallBack;
public MyAdapter(Context context,List<String> list,
int itemLayoutId,CallBack callBack){
mContext=context;
mInflater=LayoutInflater.from(context);
mList=list;
mItemLayoutId=itemLayoutId;
mCallBack=callBack;
}
public interface CallBack{
public void click(View view);
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object
getItem(
int position) {
return mList.get(position);
}
@Override
public long getItemId(
int position) {
return position;
}
@Override
public View
getView(
int position, View convertView, ViewGroup parent) {
ViewHolder holder=
null;
if(convertView==
null){
convertView=mInflater.inflate(mItemLayoutId,
null);
holder=
new ViewHolder();
holder.mButton= (Button) convertView.findViewById(R.id.item_Button);
convertView.setTag(holder);
}
holder= (ViewHolder) convertView.getTag();
holder.mButton.setText(mList.get(position));
holder.mButton.setOnClickListener(
this);
holder.mButton.setTag(position);
return convertView;
}
@Override
public void onClick(View v) {
mCallBack.click(v);
}
static class ViewHolder{
Button mButton;
}
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
Activity代码
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class Main2Activity extends AppCompatActivity implements AdapterView.OnItemClickListener,MyAdapter.CallBack{
private ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main2);
mListView= (ListView) findViewById(R.id.main2_listView);
List<String> mList=
new ArrayList<>();
for (
int i=
0;i<=
50;i++){
mList.add(
"按钮 "+i);
}
mListView.setAdapter(
new MyAdapter(Main2Activity.
this, mList, R.layout.item_layout,
this));
mListView.setOnItemClickListener(
this);
}
@Override
public void click(View view) {
Toast.makeText(Main2Activity.
this,
"按钮 "+view.getTag()+
" 被点击了",Toast.LENGTH_SHORT).show();
}
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position,
long id) {
Toast.makeText(Main2Activity.
this,
"列表 "+position+
" 被点击了",Toast.LENGTH_SHORT).show();
}
}
123456789101112131415161718192021222324252627282930313233343536373839
item_layout布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="70dp"
android:descendantFocusability= "blocksDescendants"
android:background="@android:color/holo_green_dark"
android:padding="10dp">
<Button
android:id="@+id/item_Button"
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_marginLeft="20dp"
android:layout_alignParentRight="true"
android:focusable="false"
/>
</RelativeLayout>
123456789101112131415161718
如图
转载请注明原文地址: https://ju.6miu.com/read-673168.html