listviewitem(listviewitem隐藏)
如何在ListView中设置item的点击事件
给Listview里面Item里的每一个控件怎么设定点击事件
adpter用的是继承的baseadapter,给整个listview 上的 Item 设置点击事件就用listview.setOnItemClickListener(listener)就可以, 下面介绍 如果 给 I tem里面某一 控件设置点击事件。方法是重写 Adapter。
ListView工作原理(针对下面代码):
1. 给ListView设置数据适配器,此处程序是自己重写的Adapter,创建Adapter 的时候主要做下面的工作:
(1)把ListView需要显示的数据传给Adapter
(2)把ListView显示Item的界面传给Adapter
(3)把上下文对象传给Adapter,主要用来得到LayoutInflater对象来得到Item界面
2. 给ListView设置当点击Item对象的时候执行的操作,此处要实现给Item中的各项也就是该程序的三个TextView设置监听器,也就是调用Adapter中的getView函数。
3. getView函数实现的操作是:第一要将Item要显示的数据显示,然后设置监听器,为监听器设置操作。
如何获取listview的item中的内容
解决方案:重写BaseAdapter,然后自行获取ListView中每行输入的EditText值.
大概算法:重写BaseAdapter.getView函数,用一个数组存储EditText中的值,根据position即数组下标,在getView
中动态更新EditText和动态获取EditText中的值.因为ListView中的item是复用的,如果不动态清空或动态获取EditText中
值,就会出现数据紊乱,或者没数据.那么在生成EditText的时候要监控其值的变化.存储下来.
使用方法:
private ListMapString, Object mCheckItemList = new ArrayListMapString, Object();
mAdapter = new ListEditorAdapter(this, mCheckItemList);
m_lvListView.setAdapter(mAdapter);
直接改变mCheckItemList中的数据,然后调用mAdapter.notifyDataSetChanged();就可以更新ListView的数据
当然,直接从mCheckItemList也可以获得用户在EditText中输入的数据.比较方便
其他:
ListView list= (ListView)findViewById(R.id.list);//获得listview
for (int i = 0; i list.getChildCount(); i++) {
LinearLayout layout = (LinearLayout)list.getChildAt(i);// 获得子item的layout
EditText et = (EditText) layout.findViewById(R.id.et);// 从layout中获得控件,根据其id
// EditText et = (EditText) layout.getChildAt(1)//或者根据位置,在这我假设TextView在前,EditText在后
System.out.println("the text of "+i+"'s EditText:-----------"+et.getText());
}
如何获取ListView可见Item数
项目需要统计listview中每个“曝光”的item的数据,即,随着滑动,某个item由不可见到可见,那我就需要把这个item的index获取到,以便后续操作。当然,如果某个item已经是可见的,那么在滑动的时候如果没有划出屏幕之外,就不再“曝光”,以免造成重复“曝光”,但是当已经“曝光”的item划出屏幕之后再次划入屏幕变成可见,那么需要重新“曝光”,解决办法如下:
实现OnScrollListener接口,重写onScroll方法,listview滑动时会调用onScroll方法,在这个方法里展开逻辑判断,具体代码如下:
先定义一个visibleList存储上一次屏幕上可见的item的index:
private ListInteger visibleList = new ArrayListInteger
在定义一个list存储每次滑动后屏幕上可见的item的index,然后在onscroll里比较两个list,找出两个list里不同的元素即可得到新“曝光”的item的index,这些新的index必定是由不可见变为可见的。代码如下:
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
if (performanceWidgetTicket != null mLiveShowTicketList != null) {//这行代码是我的数据操作所需要的null判断,可换成你需要的条件
// 比较两次可见的item的序号,只曝光新出现的
ArrayListInteger list = new ArrayListInteger(visibleItemCount);
// 将最新可见item的index加入到临时list中
for (int i = firstVisibleItem; i firstVisibleItem + visibleItemCount; i++) {
list.add(i);
}
if (visibleList != null list != null) {
//新可见item的index的集合
ArrayListInteger diffList = getDiffrent(list, visibleList);
if (diffList != null) {
for (int x = 0; x diffList.size(); x++) {
// 曝光操作
// 在这里做相应操作
LogUtils.LOGD(TAG, "diffList.get(x):" + diffList.get(x));
}
//更新list,将最新的可见item的index加入到list
visibleList.clear();
visibleList.addAll(list);
}
}
//清空最新可见item的index的list
if (list != null) {
list.clear();
}
}
}
/**
* @MethodName:getDiffrent
* @tags:@param list1
* @tags:@param list2
* @tags:@return
* @return_type:ArrayListInteger
* @exception
* @TODO:取出两个list中不同的元素加入到新的list
* @since
*/
private ArrayListInteger getDiffrent(ListInteger list1, ListInteger list2) {
long st = System.nanoTime();
ArrayListInteger diff = new ArrayListInteger();
for (Integer index : list1) {
if (!list2.contains(index)) {
diff.add(index);
}
}
return diff;
}
如何获取listview的item
得到listview中的itemview具体方法如下:
在getView()方法中,给convert View设置setTag(),可以将position或者view设置完成后进去,然后在on Click方法中通过getTag()获得所设置的值,就完成获取任务了。
ListView项(Item)的三种布局
自定义的布局,使用了相对布局(RelativeLayout,见list_item.xml),左侧一个图片,右侧上方是字体比较大的title,下方是字体稍小的description;
第二种是Android自带的布局(见源码里的simple_list_item_2.xml),主要是一个垂直的LinearLayout,里面包含两个ID分别为text1、text2的TextView,这两个TextView的字体大小不一样,一个带textAppearanceLarge属性,另外一个带textAppearanceSmall属性;
第三种也是Android自带的布局(见源码里的two_line_list_item.xml),主要是一个垂直的LinearLayout,里面包含两个ID分别为text1、text2的TextView,这两个TextView的字体大小一样,但每个TextView还带一个字体加粗的属性。
构造函数: SimpleAdapter(Context context, List data, int resource, String[] from, int[] to)
参数有5个:
context:也就是上下文,而Activity都是继承于Context的,所以这个参数一般使用Activity的实例;
data:类型要为一个List的子类,且List中的每个元素都必须为Map的子类,每个Map中以有一对或多对的Key-Value对,这些值与下面的参数from有对应;
resource:这是每个List项(Item)对应的XML布局资源文件名,在里面控制List项显示的元素以及相对位置;
from:是一个字符串数组,可以理解为列名,对应于data数据中Map元素的Key值,只有包含在这个字符串数组的元素对应到Map中的Value值才能显示到TextView中(这些TextView在最后一个参数to配置),所以这些Value值需要为字符串或者有toString()的方法;
to:TextView组件ID的数组,上面的from参数配置了Key值,而根据这个Key值从data参数里的map取出的value值需要设置到TextView中,而这些TextView的id需要在这个数组中配置。而且这些TextView需要在参数resource对应的XML资源文件中配置。