5

我有 4 TextViews、 2 ImageViews、 2Buttons和 2 个小部件,它们是 a 中行定义的一部分ListView。数据来自 XML 和SimpleAdapter. 要访问这些TextViews,我ViewBinde在自定义类中实现 r 并覆盖setViewValue. 这有效,TextViews我想动态更改的两个在setViewValue. 令我困惑的是为什么我的另外两个 TextViews 没有通过setViewValue。我这样说是基于设置一个执行线程只进入两次的断点。我期待看到它 4 次或更多次?

这是setViewValue我设置断点的地方。

@Override     
public boolean setViewValue(View view, Object data, String text)
{
    if(view.getId() == R.id.txtvw1)
    {             
//blah do some stuff
    }
    else if (view.getId() == R.id.txtvw2)
    {
//Blah do some stuff
    }

    return true;
} 

的 xml 声明TextViews(1 显示,4 不显示):

<TextView
        android:id="@+id/txtvw1"
        android:layout_centerHorizontal="true"
        android:layout_width="185dp"
        android:layout_height="25dp"
        android:textSize="20sp"
        android:layout_marginTop="60dp"
        android:gravity="center"
        android:inputType="none"
        android:text="@string/str_StaticA"
        android:textColor="#C0F700" />

    <TextView
        android:id="@+id/txtvw4"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="35dp"
        android:layout_width="95dp"
        android:layout_height="50dp"
        android:textSize="18dp"
        android:layout_marginTop="110dp"
        android:gravity="center"
        android:inputType="none"
        android:text="IMHO:"
        android:textColor="#FFBA19" />

所以总而言之,为什么执行只输入了两次覆盖,而它恰好是我想要更新的那两次?

好吧,通过额外的阅读和演绎推理,更多的信息已经浮出水面。在我看来,ListView行中的视图 XML 会通过,ViewBinder但那是错误的!据我ViewBinder所知,您可以通过setViewBinder. 好吧,因为 DataAdapter 被告知使用什么视图来填充其中的数据,所以只有两个视图显示是有道理的。我只透露了两个。

这是一个片段,我在其中指定填充过程中涉及的视图并将它们传递给 DataAdapter 的构造函数:

String[] from = new String[] {"txtvw_PrevLift", "txtvw_PrevReps", "ActuLiftPikr", "ActulRepsPikr" };
int[] to = {R.id.txtvw_PrevLift, R.id.txtvw_PrevReps, R.id.ActuLiftPikr, R.id.ActulRepsPikr };

LiftDataAdapter LiftDataAdapter = new LiftDataAdapter(this, LiftDataMaps, R.layout.liftdatalayout, from, to);

虽然这似乎有道理,但我不知道我的演绎推理是否准确。当我找到更多信息时会更新。

4

1 回答 1

5

如果您ViewBinderSimpleAdapter 所有Views声明的(在您to的情况下为数组)设置 a ,无论如何都将传递给ViewBinder'setViewValue()方法。如果该setViewValue方法没有返回true意味着该数据绑定View失败(无论出于何种原因),那么您将获得默认操作(对于 a TextView),从 data 设置文本Hashmap。现在,您声明setViewValue只为两个人做某事TextViews(通过他们的 id 检查)并且true 无论如何都要返回。当您在行布局中输入setViewValue另一个Views时,您将再次输入setViewValue,不匹配 id(因此没有更新那些Views)并返回true(这将告诉适配器绑定成功,这View不需要任何更多的工作)。查看该方法的源代码SimpleAdapter.bindView将向您展示如何ViewBinder使用它。

另外,我看到你使用自定义适配器,你确定你不干扰正常SimpleAdapter逻辑吗?(也不要为类和变量名使用相同的名称)

于 2012-05-19T07:38:33.670 回答