【问题标题】:Better understanding of the SimpleAdapter's ViewBinder更好地理解 SimpleAdapter 的 ViewBinder
【发布时间】:2012-05-18 15:54:52
【问题描述】:

我有 4 个TextViews、2 个ImageViews、2 个Buttons 和 2 个小部件,它们是 ListView 中行定义的一部分。数据来自 XML 和 SimpleAdapter。要访问这些TextViews,我在自定义类中实现ViewBinder 并覆盖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,但这是错误的!据我所知,您可以通过setViewBinderViewBinder 附加到DataAdapter。好吧,因为 DataAdapter 被告知使用什么视图来填充其中的数据,所以只有两个视图显示是有道理的。我只透露了两个。

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

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

【问题讨论】:

    标签: android simpleadapter android-viewbinder


    【解决方案1】:

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

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

    【讨论】:

    • Roger 将类和变量命名为相同。你是对的,我只是为了发帖而快速打字。至于返回真我理解你说的总是从 setViewValue 返回真。我正在查看现在提供的链接,以找到从 setViewValue 返回的更好方法,因此它不仅是硬编码的,而且是准确的。
    • 哥们太棒了。我不知道您可以查看这样的源代码。双重感谢。
    猜你喜欢
    • 2016-04-09
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多