WPF如何获得ListView内各单元格控件

WPF如何获得ListView内各单元格控件,第1张

首先不推荐这种模式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高度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9493879.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存