
首先不推荐这种模式ItemsSource 已经绑定了源 Items 集合的数量变化很随机, 每个单元格的控件取决於默认的DataTemplate(设置 DisplayMemberBinding 时) 或者CellTemplate 定义的控件, 或者CellTemplateSelector 指定的 Template 定义的控件通过 rowIndex 和 cellIndex 来取得某单元格控件其实不是好的解决问题的办法 你完全可以在数据层面上捕抓到改变, 然后根据改变后的值判断是否应该采用新值, 而不应在 UI 元素上下功夫------------------回到问题,要取得, 必须要了解 ListView 是一种 Items 的控件, 它的每一个 Item 都由 ListViewItem 作为容器来承载它要显示的内容ListViewListViewItem1ListViewItem2即使在 DataTemplate 没有使用 ListViewItem , ListView 显示时也使用 ListViewItem 来承载它 对於使用 GridView 的 ListView 来说, 每一个 ListViewItem 的控件树结构就像下面所示的:ListViewItem (default, non-styled)BorderGridViewRowPresenterContentPresenter 1承载数据所用的控件1 (你问题的目标控件就是这个了, 单元格1)ContentPresenter 2承载数据所用的控件2 (单元格2)ContentPresenter N承载数据所用的控件N (单元格N)显然, ContentPresenter 的 Content 正是我们目标所要得到的东西於是有了下面的函数:
我很奇怪你为什么要这么做,这样的做法是不可取的。报错的原因是在Activity的onCreate方法里,listview是还没有子View的,listgetChildAt()得到的自然是null,你再对其 *** 作当然要报空指针异常。还有在listview有Header的时候,getChildAt(0)得到的是会是Header,需要注意一下。
这个首先需要确定你item里面有什么自适应或控制显示隐藏的控件,如果没有的话可以通过adaptergetView()来获取item的view,然后再用 getHeight()来获取屏幕显示的item的高度,如果有隐藏的控件什么的,那就用getMeasuredHeight()来获取控件的物理高度吧,希望可以帮到你
首先写个ListView 的数据适配器,抽离出来,写一个对象,用来设置listView 每条Item 的 的对象,可以采用ConvertView 设置setTag 将View 房子tag中,可以通过ListvIEW getChildAt()getTag 取得你想要的对象,设置参数,还是铁代码吧!
getView:
ItemObj viewHolder = null;
if(convertView == null){
viewHolder = new ItemObj();
convertView = mLayoutInflateinflate(Rlayoutsimple_item, null);
viewHoldermSimpleCardName = (TextView) convertViewfindViewById(Ridsimple_name);
viewHoldermIsReTake = (TextView) convertViewfindViewById(Ridsimple_num);
viewHoldermContentNext = (TextView)convertViewfindViewById(Ridstatus);
viewHoldermIsNext = (TextView) convertViewfindViewById(Ridicon_next);
convertViewsetTag(viewHolder);
}else{
viewHolder = (ItemObj) convertViewgetTag();
}
PhotoList aPotoLists = (PhotoList) getItem(position);
if(aPotoLists!= null){
viewHoldermSimpleCardNamesetText(aPotoListsphotoName);
if(KeyInMapITFTAKESIMPLE_PIC_TEP!= null){
viewHoldermIsReTakesetText("("+0+")");
if(KeyInMapITFTAKESIMPLE_PIC_TEPequals(aPotoListsphotoName)){
ArrayList<PhotoList> aLists= (ArrayList<PhotoList>) GlobalParameterget(KeyInMapITFTAKESIMPLE_PIC_TEP);
viewHoldermIsReTakesetText("("+aListssize()+")");
}
}
if(aPotoListsstatusequals("0")){
viewHoldermContentNextsetText("未审核");
viewHoldermIsNextsetBackgroundDrawable(mContextgetResources()getDrawable(Rdrawabletask_list_arrows));
}else{
viewHoldermContentNextsetText("已审核");
viewHoldermIsNextsetText("");
convertViewsetOnClickListener(null);
}
}
obj 对象:
public class ItemObj extends Object{
public TextView mSimpleCardName;// 单证的名称
public TextView mIsReTake;// 0 是 单证拍照 1是重拍照片
public TextView mContentNext;// 未提交 未审核等
public TextView mIsNext;// 箭头
public TextView getmSimpleCardName() {
return mSimpleCardName;
}
public void setmSimpleCardName(TextView mSimpleCardName) {
thismSimpleCardName = mSimpleCardName;
}
public TextView getmIsReTake() {
return mIsReTake;
}
public void setmIsReTake(TextView mIsReTake) {
thismIsReTake = mIsReTake;
}
public TextView getmContentNext() {
return mContentNext;
}
public void setmContentNext(TextView mContentNext) {
thismContentNext = mContentNext;
}
public TextView getmIsNext() {
return mIsNext;
}
public void setmIsNext(TextView mIsNext) {
thismIsNext = mIsNext;
}
默认的情况下,是listview的item自身获得了焦点(如上图右),也就是说listview的item获得焦点后,没有传递给子控件或者子控件默认不能获得焦点。 这时候我们可能会想到在布局文件里设置listview的descendantFocusability属性(焦点传递性)
一:程序说明:
题目是一位网友在我留言板上的留言,不知道大家看没看过我曾经写过的《如何向其他程序的ListView控件发送LVM_GETITEMTEXT消息》一文?在那篇拙文中,我的目的是得到某一Item的TEXT。于是我将LVITEM结构插入到了目标进程中,才使得目标进程正确响应LVM_GETITEMTEXT消息。
要得到某一Item的TEXT,需要发送LVM_GETITEMTEXT消息,而要选中某个Item则要发送LVM_SETITEMSTATE消息:
LVM_GETITEMTEXT
wParam = (WPARAM) (int) iItem;
lParam = (LPARAM) (LV_ITEM FAR ) pitem;
LVM_SETITEMSTATE
wParam = (WPARAM) (int) i;
lParam = (LPARAM) (LV_ITEM FAR ) pitem;
看到了吗?两个消息的参数一模一样!再来看看LV_ITEM结构的设置:只需将state和stateMask设置成LVIS_SELECTED,并指定iItem即可。直接修改上篇拙文中的代码就能轻松搞定本篇要解决的问题
作为演示,下面的这段程序将选中TaskManager中第6个项目。
二:具体实践:
/
Send LVM_SETITEMSTATE
版权所有 (C) 2005 天津 赵春生
20050804
>
使用同一个数据源,点击某一项时,不管是listView还是gridView,比如是选中,那么数据源中每个item对应的数据可以添加一个选中focused字段,只要改变共同的数据源,然后调用adapternotifydatasetchanged就可以了
获取RecyclerView 的滑动距离: 滑动到一定程度后清零是因为 getChildAt(0) 获得的是第一个可见view 用LinearLayoutManager的recyclerview测试了一下确实如此。 如果LayoutManager用的是LinearLayoutManager 可以用下面的办法,还能向下滑动多。
处理点击listview中item的事件,推荐使用 listViewsetOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView parent,Viewview, int position, long id) {// TODO Auto-generated method。
思路是:因为ViewHolder我们可以拿到每个Item的根布局,所以如果我们为根布局设置单独的OnClick监听并将其开放给Adapter,那不就可以在组装RecyclerView时就能够设置ItemClickListener,只不过这个Listener不是设置到RecyclerView上而是设置到Ad。
项目中使用到了横向的ListView样子的功能,一开始使用Gallery做,由于Gallery的自带d性功能,效果不理想,于是使用网上的一些开源的横向ListView,但是效果很卡, 最后使用了v7包中的RecyclerView,初次使用,不太熟练,对其进行了简单的封装 pa。
public View getViewByPosition(int pos, ListView listView) {final int firstListItemPosition = listViewgetFirstVisiblePosition();final int lastListItemPosition = firstListItemPosition + listViewgetChildCount() - 1;if (pos < fir。
RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持。 在开发RecyclerView时充分考虑了扩展性,因此用它可以创建想到的任何种类的的布。
RecyclerView显示Item布局不一致 在自定义RecyclerAdapter的时候,在重写onCreateViewHolder方法是使用了 @Override public H onCreateViewHolder(ViewGroup parent, int viewType) { View view=Viewinflate(context,layoutId,null); return vi。
直接在Adapter中的onBindViewHolder()方法中实现点击事件 @Override public void onBindViewHolder(MyViewHolder viewHolder, final int postion) { viewHoldertextViewsetText(mDatasget(postion)); viewHolderrootViewsetOnCli。
以上就是关于WPF如何获得ListView内各单元格控件全部的内容,包括:WPF如何获得ListView内各单元格控件、安卓listview 获取某个item中组件、如何正确获得ListView的每一个item高度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)