我有4个TextViews,2个ImageViews,2个Buttons和2个小部件,它们是ListView中的行定义的一部分。数据来自XML和SimpleAdapter。为了访问这些TextViews,我在自定义类中实现了ViewBinde r并覆盖了setViewValue。这有效,并且我要动态更改的两个TextViewssetViewValue中处理。让我感到困惑的是为什么我的其他两个TextView没有通过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;
}
TextViews的xml声明(显示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,但这是错误的!据我所知,您是通过ViewBindersetViewBinder附加到DataAdapter的。好吧,因为DataAdapter被告知要使用什么 View 来填充数据,所以只显示这两个是有道理的。我只是向其中透露了两个。

这是一个 fragment ,我在其中指定填充过程中涉及的View并将它们传递给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);

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

最佳答案

如果在ViewBinder 上设置SimpleAdapter所有,则无论如何,您声明的Views(在您的情况下为to数组中)都将传递到ViewBindersetViewValue()方法。如果setViewValue方法未返回true,则意味着该View的数据绑定(bind)失败(无论出于何种原因),那么您将获得默认操作(针对TextView),并从数据Hashmap中设置文本。现在,您声明setViewValue仅对两个TextViews(通过其ID进行检查)执行某项操作,并且不管是什么,也返回true 。当您在行布局中输入其他setViewValueViews时,您将再次输入setViewValue,不匹配id(因此这些Views不会更新),然后返回true(这将告诉适配器绑定(bind)是成功,并且此View不再需要任何工作)。 SimpleAdapter.bindView方法的A look at the source code将向您展示ViewBinder的用法。

另外,我看到您使用的是自定义适配器,确定不会干扰普通的SimpleAdapter逻辑吗?(也不要对类和变量名使用相同的名称)

关于android - 更好地了解SimpleAdapter的ViewBinder,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10655867/

10-08 21:14