- 浏览: 120487 次
- 性别:
- 来自: 广州
文章分类
最新评论
- 首先,说明一下,ListView中每一行包括以下三项:
- res/layout/main.xml
|
因为继承了ListActivity,所以ListView 的id设置为"@id/android:list"是必须的
- res/layout/lvitem.xml
注意:
在< RelativeLayout>中
android:descendantFocusability= "blocksDescendants"
和< ImageButton>中
android:focusable = "false"
这两项的设置很关键,如果不设置,将导致ListView的ItemClick事件将无法触发,该事件被ImageButton的click事件屏蔽了。
|
- 接下来,我们看看继承ListActivity的实现
在lvWithButtonExt中,为了能处理ImageButton的click事件,我继承了BaseAdapter类,并重新实现了getView()接口,在其中加入了Button的clicklistener,详见 lvButtonAdapter类的实现。
|
- 接下来,我们看看lvButtonAdapter 的实现
为了响应按钮的点击事件,首先要记录按钮的位置,然后为按钮设置clicklistener。
在重新实现的getView()接口中,我使用了lvButtonListener监听类,在构造函数中,记录行号,以便在OnClick接口中能准确的定位按钮所在的位置,进而对相应的行进行处理。
public class lvButtonAdapter extends BaseAdapter {
private class buttonViewHolder {
ImageView appIcon;
TextView appName;
ImageButton buttonClose;
}
private ArrayList < HashMap < String , Object > > mAppList;
private LayoutInflater mInflater;
private Context mContext;
private String [ ] keyString;
private int [ ] valueViewID;
private buttonViewHolder holder;
public lvButtonAdapter( Context c, ArrayList < HashMap < String , Object > > appList, int resource,
String [ ] from , int [ ] to) {
mAppList = appList;
mContext = c;
mInflater = ( LayoutInflater) mContext. getSystemService( Context . LAYOUT_INFLATER_SERVICE) ;
keyString = new String [ from . length ] ;
valueViewID = new int [ to. length ] ;
System . arraycopy ( from , 0, keyString, 0, from . length ) ;
System . arraycopy ( to, 0, valueViewID, 0, to. length ) ;
}
@Override
public int getCount ( ) {
return mAppList. size ( ) ;
}
@Override
public Object getItem ( int position ) {
return mAppList. get ( position ) ;
}
@Override
public long getItemId( int position ) {
return position ;
}
public void removeItem ( int position ) {
mAppList. remove ( position ) ;
this . notifyDataSetChanged( ) ;
}
@Override
public View getView ( int position , View convertView, ViewGroup parent ) {
if ( convertView ! = null ) {
holder = ( buttonViewHolder) convertView. getTag ( ) ;
} else {
convertView = mInflater. inflate ( R. layout . lvitem, null ) ;
holder = new buttonViewHolder( ) ;
holder. appIcon = ( ImageView ) convertView. findViewById( valueViewID[ 0] ) ;
holder. appName = ( TextView) convertView. findViewById( valueViewID[ 1] ) ;
holder. buttonClose = ( ImageButton) convertView. findViewById( valueViewID[ 2] ) ;
convertView. setTag( holder) ;
}
HashMap < String , Object > appInfo = mAppList. get ( position ) ;
if ( appInfo ! = null ) {
String aname = ( String ) appInfo. get ( keyString[ 1] ) ;
int mid = ( Integer ) appInfo. get ( keyString[ 0] ) ;
int bid = ( Integer ) appInfo. get ( keyString[ 2] ) ;
holder. appName. setText ( aname) ;
holder. appIcon. setImageDrawable( holder. appIcon. getResources ( ) . getDrawable( mid) ) ;
holder. buttonClose. setImageDrawable( holder. buttonClose. getResources ( ) . getDrawable( bid) ) ;
holder. buttonClose. setOnClickListener( new lvButtonListener( position ) ) ;
}
return convertView;
}
class lvButtonListener implements OnClickListener {
private int position ;
lvButtonListener( int pos) {
position = pos;
}
@Override
public void onClick( View v) {
int vid= v. getId ( ) ;
if ( vid = = holder. buttonClose. getId ( ) )
removeItem ( position ) ;
}
}
}
////////////////////////////////////////
备注1; 对于Android开发来说处理一些界面需要和Adapter适配器打交道,虽然Android自带了一些比如ArrayAdapter但是大多数情况下无法满足我们需要,所以就要从BaseAdapter派生一个类满足我们特殊的需要。
首先我们可能重写getView(),通过LayoutInflater的inflate方法映射一个自己定义的Layout布局xml加载或从xxxView中创建。这些大家可能滚瓜烂熟了但是仍然很多Android 开发者对于BaseAdapter中notifyDataSetChanged()方法不是很理解,notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容。
http://blogimg.chinaunix.net/blog/upfile2/101203142001.jpg
发表评论
文章已被作者锁定,不允许评论。
-
stopSelf()与stopSelf(startId)的区别
2016-04-14 14:44 1106startId:表示启动服务的次数 stopSelf(sta ... -
安装/卸载/替换成功广播接收
2016-01-08 11:59 789<receiver android:name=" ... -
ContentProivder
2015-12-09 09:26 486ContentProvider 我们实现了其中的几个方法 ... -
Android获取网络时间
2015-11-19 11:27 11771、实时获取: LocationManager locatio ... -
android animation知识
2015-11-14 11:47 574<?xml version="1.0" ... -
代码中设置android:drawableTop等
2015-11-14 10:42 1016btnAttachment.setCompoundDrawab ... -
自定义View
2015-11-04 15:09 400一般来说,自定义View都会去重写onMeasure()方法, ... -
SimpleOnGestureListener
2015-11-04 12:03 539onScroll()缓慢滑动,手指滑动屏幕的过程中执行; on ... -
设置dialog在底部并宽度全屏显示
2015-11-02 11:53 2288pickerDialog.setContentView(vie ... -
横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效
2015-10-29 10:51 1778在之前的版本中都是在Manifest文件中设置Activity ... -
Dialog注意点
2015-10-28 17:14 510dialog:setCancelable与setCancele ... -
清除setBackgroundResource的原有值
2015-10-23 16:50 1157setBackgroundResource(0);清除原有的s ... -
接收隐式意图
2015-10-22 11:29 543想接收隐式意图,必须在他们的意图过滤器中配有:android. ... -
严苛模式
2015-10-14 20:25 1373//启用严苛模式,StrictMode可以用于捕捉发生在应用程 ... -
Android使用Animation完成动画保留最后一帧的办法
2015-09-08 10:43 2417在动画效果的xml中,在set标签中加上一条android:f ... -
控件getHeight和getWidth等于0的解决办法
2015-09-07 17:27 1420//监听layoutContainer是否初始化完成 l ... -
Service和Thread的区别?
2015-08-19 13:25 494servie是系统的组件,它由系统进程托管(servicema ... -
避免内存泄露
2015-08-18 19:21 4791、尽量避免在Activity使用static。 2、能使用A ... -
需要context的时候用activity还是application?
2015-08-17 17:02 747需要context的时候用activity还是applicat ... -
谈谈UI中, Padding和Margin有什么区别?
2015-08-10 17:18 1097Padding 文字对边框, margin是控件与控件之间的距 ...
相关推荐
综上所述,解决Android程序中ListView与Button共存的问题,主要是通过合理的布局设计、事件处理和属性设置,确保ListView的item点击事件和Button的点击事件能够正确分发和响应。同时,随着技术的发展,开发者也可以...
使用BaseAdapter自定义适配器,采用了回收converView和ViewHolder优化代码,并且解决了在ListView中使用Button时,ListView的itemClick不能被触发的问题。
同时,为了避免内存泄漏,记得在不再使用Adapter时调用`adapter.notifyDataSetChanged()`或`listView.setAdapter(null)`来解除对Context的引用。 以上就是关于“Android ListView添加Button及其事件”的详细知识,...
然而,这样处理后,虽然解决了Button获取焦点的问题,但新的问题是,点击ListView项时,Button仍会出现按下的视觉效果。这是因为即使Button没有焦点,它的`setPressed()`方法仍会被调用。 为了解决这个问题,我们...
最近在做android项目时 发现要在listView用到Button等各种点击事件 经过各种百度 发现有两个简单的方法实现 我把demo放上去 为了方便自己以后用到 也方便学习listview实现button监听的同学们 注意 我用最新sdk...
在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表,比如新闻列表的展示。本项目"android listview实现新闻列表展示效果 .zip"应该是包含了一个完整的示例,教你如何在Android应用中利用...
本文将详细介绍如何在Android应用中将ListView与Button结合使用,以及如何处理它们的点击事件,实现不同的操作。 首先,我们需要创建一个ListView。在布局文件(如activity_list_view.xml)中,添加ListView元素,...
本文用两种方法BaseAdapter 和SimpleAdapter分别实现三种情况。listview中有button事件的时候,针对不同的需求,响应不同的事件。只实现响应listview的点击事件。只响应listview中的button事件。两个事件都需要。
listView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() { @Override public void onRefresh() { // 在这里加载新的数据,完成后调用setRefreshing(false)停止刷新指示器 } @...
在Android开发中,ListView是一个非常重要的组件,常用于展示大量数据列表,如微信好友列表。本教程将聚焦于如何在Android应用中实现一个类似于显示微信...在运行代码时,如果遇到问题,开发者可能需要自行调试和解决。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 这里处理ListView的点击事件,...
### Android ScrollView与ListView/GridView共存冲突解决方案 #### 背景介绍 在Android开发过程中,经常需要将多个UI组件组合在一起以实现丰富的界面效果。其中,`ScrollView`是一种常用的容器,可以用来包裹一系列...
在Android开发中,ListView是一种常用的视图组件,用于展示大量数据列表。...同时,这也是一个锻炼你解决问题和调试代码的好机会。记得在实际应用中,不仅要关注功能实现,还要注重代码的可读性和维护性。
同时,为了防止状态丢失,我们还需要在`getView()`中处理View的复用问题,确保每次显示的数据与数据集中的对应项匹配。 代码示例: ```java public class MyAdapter extends ArrayAdapter<String> { private ...
在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。当需要在列表项中加入可选择的功能时,我们通常会结合使用CheckBox。本示例"Android中ListView结合CheckBox获取选中项.rar"旨在教授如何在...
总之,解决ListView和ScrollView共存问题的关键在于理解它们的滚动机制,并根据具体需求选择合适的方法。通常,尽量避免直接嵌套,而是利用RecyclerView的灵活性和NestedScrollView的嵌套滚动特性。对于复杂的布局...
Android listview viewpager 滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 blog 地址 : http://blog.csdn.net/aaawqqq/article/details/43824631
listView.setOnScrollListener(new AbsListView.OnScrollListener() { private boolean isLoadingMore = false; @Override public void onScrollStateChanged(AbsListView view, int scrollState) {} @...
listView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, totalHeight)); ``` 此外,还可以考虑使用NestedScrollView作为ListView的父视图,以实现更灵活的滚动效果。但需要...
当需求涉及列表中的每个条目本身也需要展示一个子列表时,我们就会遇到ListView的嵌套问题。本教程将详细讲解如何在Android Studio环境下实现ListView的嵌套,以满足这种复杂布局的需求。 首先,我们需要了解基本的...