简介:尝试通过自定义适配器包装器将标题行动态添加到ListView.ListView无法保持滚动位置同步.提供了可运行的演示项目.
我想根据CursorAdapter中的值动态地将项添加到列表中,在用户当前查看的位置之前的几个位置.为此,我有一个包装CursorAdapter的适配器,并将新内容保存在SparseArray中.当项目被添加到自定义适配器时,ListView需要更新,但我遇到了很多陷阱,试图让它工作,并希望得到一些建议.
演示项目可以在这里下载:DynamicSectionedList.zip
在演示中,通过向前看10个位置来动态添加标题,以找到列表项切换到下一个字母的正确位置.notifyDataSetChanged的每个实现都有如下所述的问题:
演示1
此演示显示了notifyDataSetChanged()的重要性.点击任何内容,应用程序将崩溃.这是由于一些理智ListView中检查...... mItemCount != adapter.getItemCount().道德是,我们需要通知列表数据已经改变.
演示2
自然的下一步是在发生更改时通知ListView更改.不幸的是,在ListView滚动时这样做会破坏所有触摸交互,直到应用程序切换到触摸模式.为了注意到这一点,你需要"推动滚动"到足以产生新的标题.点击屏幕不会导致滚动停止,一旦停止,列表项目都不会被点击.这是由于if (!mDataChanged) { /* do very important stuff */ }AbsListView.onTouchEvent()中的一些代码.
演示3 为了解决这个问题,Demo 3引入了pendingChanges标志,自定义适配器获得了一个notifyDataSetChangedIfNeeded(),一旦它进入"安全"状态进行更改,ListView就可以调用它.必须通知更改的第一点是ListView.layoutChildren(),因此我重写该方法以在需要时首先通知更改,然后通过调用.过去至少一个标题然后单击列表项.
虽然我不完全确定原因,但这并不是很正常.使用键盘/轨迹球点击或选择项目会导致列表刷新而不会正确同步旧位置.它滚动到列表的顶部,这是不可接受的.
演示4 演示3中的滚动问题可以被征服,至少在触摸模式下.通过在触摸时添加对notifyDataSetChangedIfNeeded()的调用,数据更改发生在所有触摸交互按预期工作并且列表位置正确同步的时间.
但是,当设备没有处于触摸模式时,我找不到模拟器,更不用说它看起来确实像黑客一样.该列表几乎总是滚动回到顶部,我无法找出导致它偶尔保持正确位置的原因.
由于Android在每一步都在与我作斗争,我觉得应该有更好的方法.请尝试演示,如果可以应用任何修复,让它工作,这将是伟大的!
非常感谢能够对此进行研究的任何人,希望如果我们能够使代码正常工作,那么对于其他试图对带有标题的列表进行相同优化的人来说,这将是有用的.
android android-lazyadapter android-listview android-adapter
(ARC已启用)
假设我在其中有一个类名BasicGameCard,它声明了以下属性:
@property (nonatomic) NSUInteger cardValue;
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个派生类WarGameCard:BasicGameCard.
WarGameCard扩展了套装属性,并希望使用继承的cardValue来表示其排名问题:
如何在不使用属性的情况下在WarGameCard类中使用/调用变量_cardValue?
一)写_cardValue的WarGameCard:导致编译器错误(我想有在Objective-C没有受保护的访问修饰符和变量是私有的)
b)不能使用self.cardValue它会编译但会导致无限循环调用setter
c)尝试编写以下代码WarGameCard:@synthesize cardValue = _cardValue;
但是在调试时我看到2个不同的变量,一个是超类,另一个是派生的,每个都有不同的值
覆盖继承属性的正确方法是什么
我想制作一个Chrome扩展程序来修改Google搜索结果页面.我知道我可以使用内容脚本来执行此操作,因为它具有执行此操作的能力.但不幸的是它失败了.我写了代码
$('h3.r').append('<b>a</b>')
Run Code Online (Sandbox Code Playgroud)
或者与DOM操作相关的其他东西都失败了.但如果我刚写的话
alert('aa')
Run Code Online (Sandbox Code Playgroud)
要么
document.body.style.backgroundColor='green'
Run Code Online (Sandbox Code Playgroud)
, 有用.为什么?顺便说一句,我想进行调试但是当我打开开发工具时,我找不到我的扩展内容脚本.我可以看到其他扩展的内容脚本.
在ColdFusion中转换值数组的最佳方法是什么
[ Fed Jones, John Smith, George King, Wilma Abby]
Run Code Online (Sandbox Code Playgroud)
以及最后一个逗号是或的列表
Fed Jones, John Smith, George King or Wilma Abby
Run Code Online (Sandbox Code Playgroud)
我认为REReplace可能有效,但尚未找到正确的表达方式.
我有样式文件输入:
<div class="fakeFileContainer">
<div class="fakeFile">Do??cz brief</div>
<input id="file" type="file" name="file"/>
</div>
Run Code Online (Sandbox Code Playgroud)
对于这部分代码我有一些js:
var fileInput = $('#contact #file')
fileInput.change(function(){
$this = $(this);
$('#contact form .fakeFile').text($this.val());
})
$('#contact form .fakeFileContainer').on('click', function () {
fileInput.click(); //looping here
}).show();
Run Code Online (Sandbox Code Playgroud)
点击后.fakeFileContainer我在控制台中收到了这个错误信息:
Uncaught RangeError: Maximum call stack size exceeded
Run Code Online (Sandbox Code Playgroud)
它是由循环引起的,但我不知道为什么这个循环在这里形成.可以告诉我这种情况的原因吗?
我遇到的情况是,我收到一个包含XML字符串的查询.我应该将它转换为json.
我编写了一个小的CF函数,它遍历/解析XML并方便地将其转换为json.现在的问题是,XML模式已经改变,这迫使我重新编写CF函数以适应新的模式.
是否有更好/通用的方式将XML转换为json?(尽管使用ColdFusion!)
我一直在努力寻找解决方案。我的代码与我在Google搜索中看到的代码不同,并且我尝试过的任何方法都无法正常工作。基本上如标题所示,我想检查Xml Node是否存在。这是因为YouTube Feed中返回的XML不正确。代码如下。
<cfset YouTubeXml = xmlParse(#YouTubeFavourites.FileContent#) />
<cfset group = XmlSearch(YouTubeXml, "//media:group") />
<cfloop from="1" to="25" index="i">
<cfoutput>
#group[i]['media:thumbnail'][i]['url']#
</cfoutput>
</cfloop>
Run Code Online (Sandbox Code Playgroud)
基本上,该错误表明该错误#group[i]['media:thumbnail'][i]['url']#不存在。希望有人能帮忙。
我的问题很简单,但我似乎无法弄明白.我试图在一个看似随机的10个字符串中找到字符'C'.但是,如果它是字符串中的第6个字符,我只关心字符'C'.如果在字符串的第6个位置找到字符"C",则字符串应用短划线( - )括起来.例如:
14CSI14550不应用短划线括起来,因为C是字符串中的第3个字符.14EFEC4933应该用短划线括起来,因为C是字符串中的第6个字符.即使字符串中还有另一个C,14CSIC5005也应该用短划线括起来.
这是我到目前为止所拥有的,我认为我正在使用contains,但我认为我需要它开始在字符串中的第5个字符处查找C,以便跳过前5个字符.我可能错了.
码:
<cfif #queryName.TenDigitNumber# contains 'C'>
<td width="100" class=bodytext valign="top" >-#Plan.Code#-</td>
<cfelse>
<td width="100" class=bodytext valign="top" >#Plan.Code#</td>
</cfif>
Run Code Online (Sandbox Code Playgroud)
这显然包含所有10个字符串,其中包含带有破折号的C,包括14CSI14550,这是不正确的.任何帮助,将不胜感激!谢谢!
我试图将以下序列化为JSON并以两种方式检查输出,如下所示:
Line #13 : <cfset convertjson = SerializeJSON([
{
"Id":"123",
"Value":"1",
"Desc":"Checking Description ",
"Group":"1"
}
])/>
Normal Output : <cfoutput>#convertjson#</cfoutput>
<br/>
Dump Output: <cfdump var="#convertjson#">
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Invalid CFML construct found on line 13 at column 98.
ColdFusion was looking at the following text:
:
The CFML compiler was processing:
An expression beginning with SerializeJSON, on line 11, column 26.This message is usually caused by a problem in the expressions structure.
A cfset tag beginning on line 11, column 2. …Run Code Online (Sandbox Code Playgroud) 我有一个按钮,我用来在显示是/否'在政策'div之间切换
<form>
<input type="radio" id="Policy0" name="Policy" value="0" onclick="filterHotel();"><label for="Policy0">All</label>
</form>
<script type="application/javascript">
var Policy = $('input:radio[name=Policy]:checked').val()
if (Policy == 0) {
$('form [data-policy="0"]').toggle();
}
</script>
<div id="24448" data-policy="0">Data here</div>
<div id="24448" data-policy="1">Data here</div>
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,我可以成功显示/隐藏正确的div,但我的问题是我不想将我的输入包装在表单元素中.有没有办法根据属性中的值进行引用?
我尝试过,$('input[attr=data-policy][value="0"]').toggle();但似乎没有用.我确定我错过了一些简单的东西,有人能指出我正确的方向吗?
编辑:$('input[data-policy="0"]').toggle();不起作用,我没有得到错误,但它没有隐藏具有属性的div data=policy="0"我也试过data-policy=0没有运气
coldfusion ×4
jquery ×2
json ×2
xml ×2
android ×1
bluedragon ×1
click ×1
coldfusion-8 ×1
coldfusion-9 ×1
html ×1
javascript ×1
objective-c ×1
regex ×1