内部Button点击事件,转到Activity处理。
在BaseAdapter里面添加一个接口,并定义一个接口变量(用于接收Activity,传进来的接口函数)
//变更按钮的监听接口
public interface onItemButtonClick {
void onButtonClick(int position ,View view);
}
private onItemButtonClick User_onItemButtonClick ;
定义一个User_onItemButtonClick 设置函数,
public void setOnItemButtonClick (onItemButtonClick user_onItemButtonClick ) {
this.User_onItemButtonClick = user_onItemButtonClick ;
}
MyAdapter.class:
public class MyAdapter extends BaseAdapter {
private List<Beam> mylist;
private Context context;
public MyAdapter(List<Beam> mylist, Context context) {
this.mylist = mylist;
this.context = context;
}
public interface onItemButtonClick {
void onButtonClick(int position ,View view);
}
private onItemButtonClick User_onItemButtonClick ;
public void setOnItemButtonClick (onItemButtonClick user_onItemButtonClick ) {
this.User_onItemButtonClick = user_onItemButtonClick ;
}
@Override
public int getCount() {
return mylist.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
mytextview m = new mytextview();
if (view==null)
{
view=LayoutInflater.from(context).inflate(R.layout.itme_view,viewGroup,false);
m.textView=view.findViewById(R.id.tv);
m.button=view.findViewById(R.id.delete);
view.setTag(m);
}else
{
m= (mytextview) view.getTag();
}
m.textView.setText(mylist.get(i).getName()+mylist.get(i).getId());
m.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
User_onItemButtonClick .onButtonClick(i,v);
}
});
return view;
}
private class mytextview{
TextView textView;
Button button;
}
}
在Activity里面调用定义的MyAdapter对象,调用setOnItemButtonClick方法,并创建一个新的MyAdapter对象并调用接口onItemButtonClick实现void onButtonClick(int position ,View view)方法。
private MyAdapter myAdapter ;
//ListView 中的按钮点击事件
myAdapter .setOnItemButtonClick (new MyAdapter .onItemButtonClick () {
@Override
public void onButtonClick(int position ,View view) {
/*处理按键事件 */
}
});
ListView点击事件
在主函数Activity中添加上面第1步创建的ListView组件,并调研setAdapter()方法,并给该方法添加一个继承BaseAdapter的类参数。
ListView listView = findViewById(R.id.list);
listView.setAdapter(new MyAdapter(data,this));
//ListView中行的点击事件
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
/*处理ListView本体点击事件 */
}
});
遇到的问题:
点击按键事件有反应,点击ListView事件没有反应。
Item中存在诸如ImageButton,Button,CheckBox等子控件,会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应。
这时候就可以使用descendantFocusability来解决,其中descendantFocusability对应的属性有3个
该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。
属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
解决方法
通常使用第三种,即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性。