【发布时间】:2012-11-08 21:56:36
【问题描述】:
我想要点击 ListView 中的一行并提供按钮来对我在该行中显示的内容进行基本编辑。 现在,我并不是要将文本视图完全更改为可编辑文本视图,而是仅提供诸如“编辑”和“删除”之类的按钮。这可以通过弹出窗口来完成,但我试图避免这种情况,我希望这些操作按钮替换该行的显示内容。
起初我认为它可以只有两种布局来膨胀成行。一个“活跃”,一个正常。单击时,它只会为单击的行返回不同的布局,并有一个标记来指示哪一行是当前选定的行。首先遇到了我没想到的问题,当列表视图向上和向下滚动时,膨胀的视图被回收。好的,好的,所以我对 BaseAdapter 做了一个扩展,这样我就可以用 getView() 做我自己的事情了。好吧,我设法让它正确地允许回收视图(而不是在不应该的地方重复使用“活动”视图)但是我看不出有办法让它刷新/重新加载备用布局,除非将所述行从屏幕上滚动然后重新打开。似乎没有办法强制 getView() 实际发生,除非一行离开屏幕并回来。
所以这是一个两方面的问题。有一种方法可以让单行在显示时换出膨胀的视图?还有两个也许我这样做的方法是实现我想要的倒退的方法,有没有更好的方法? 感谢您的宝贵时间!
public View getView(int position, View convertView, ViewGroup parent) {
View v;
Boolean activeExists = false;
if(convertView!=null && convertView.getTag()==(String) "active"){
activeExists=true; }
if (((position==activeFlag && activeExists==true) || (position!=activeFlag && activeExists==false)) && convertView!=null) {
v = convertView;
} else if(position==activeFlag && activeExists==false){
v = inflater.inflate(rowlayoutActive, parent, false);
v.setTag((String) "active");
} else if (position!=activeFlag && activeExists==true) {
v = inflater.inflate(rowlayout, parent, false);
} else {
v = inflater.inflate(rowlayout, parent, false);
}
bindView(position, v);
return v;
}
(在这个 getView 之外,我有 (int) activeFlag 来记住哪个是当前“已选择”,我有自己的 bindView 版本,它与正常情况并没有太大区别。布尔值已经是一个快速标记膨胀的视图,以防止在回收时错误的视图进入错误的行。)
【问题讨论】:
-
很好的问题,部分答案可能是您考虑了 MVC 模型。严格来说,您应该修改基础数据以导致 UI 发生变化,这表明可能向您的数据添加布尔值“isEditing”或类似的,通过单击设置它,然后调用 notifyDataSetChanged。在 getView 中,您将测试该布尔值以使用适当的布局。
-
哦,天哪,我现在觉得自己太傻了。我只添加了
((myCustomBaseAdapterAsACast) myListVarName).notifyDataSetChanged(),它立即交换了onClick 的视图。我不必编辑有关我的自定义适配器的任何内容,显然它按我的想法工作。我知道我已经研究过 notifyDataSetChanged 和类似的东西,但它以前没有用,我现在知道为什么了。我对我的适配器做了一个演员,它工作,但没有我什么都没有。myListVarName.notifyDataSetChanged()布洛克斯,你什么也得不到。((myCustomBaseAdapterAsACast) myListVarName).notifyDataSetChanged()立即工作。 -
我会接受您的评论作为答案,但它没有作为回复发布。如果你复制它,我会接受它,不管怎样,谢谢。我想我只是被卡住了,有点脑筋急转弯。
标签: android android-layout android-listview layout-inflater