2

我想要单击 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 版本,它与正常情况并没有太大区别。布尔值是已经膨胀的视图的快速标记,以保持错误一个从回收时走错行。)

4

1 回答 1

1

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

于 2012-11-08T23:15:18.977 回答