【问题标题】:Cause onClick of a ListView row to offer editing options导致 ListView 行的 onClick 提供编辑选项
【发布时间】: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


【解决方案1】:

很好的问题,部分答案可能是您考虑使用 MVC 模型。严格来说,您应该修改基础数据以导致 UI 发生变化,这表明可能向您的数据添加布尔值“isEditing”或类似的,通过单击设置它,然后调用 notifyDataSetChanged。在 getView 中,您将测试该布尔值以使用适当的布局。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多