更好地理解SimpleAdapter的ViewBinder

时间:2012-05-18 15:54:52

标签: android simpleadapter android-viewbinder

我有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被告知使用哪些视图来填充其中的数据,所以只有两个显示才有意义。我只露出了两个。

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

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

1 个答案:

答案 0 :(得分:5)

如果您在ViewBinder 所有上设置SimpleAdapter,则您声明的Views(在您的案例中位于to数组中)将被传递无论如何,都使用ViewBinder的{​​{1}}方法。如果setViewValue()方法未返回setViewValue,则表示该true的数据绑定失败(无论出于何种原因),那么您将获得默认操作(对于View) ,从数据TextView设置文本。现在,您声明Hashmap只为两个setViewValue做了一些事情(通过他们的ID检查),并且无论什么都返回TextViews 。当您为行布局中的其他true输入setViewValue时,您将再次输入Views,与ids不匹配(因此不会更新{{1} }}并返回setViewValue(这将告诉适配器绑定成功,此Views不需要更多工作)。 true方法的A look at the source code会向您显示View的使用方式。

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