Better understanding of the SimpleAdapter's ViewBinder

android, android-viewbinder, simpleadapter

Solution

If you set a `ViewBinder` on `SimpleAdapter` all the `Views` you declared(in the `to` array in your case) will be passed to the `ViewBinder`'s `setViewValue()` method no matter what. If the `setViewValue` method doesn't return `true` meaning the data binding for that `View` has failed(for whatever reason) then you get the default action(for a `TextView`), setting the text from the data `Hashmap`. Right now you declared the `setViewValue` to do something for only two `TextViews`(checking by their ids) and also to return `true` no matter what. When you'll enter the `setViewValue` for the other `Views` in your row layout you'll again enter the `setViewValue`, don't match the ids(so no updates for those `Views`) and return `true`(which will tell the adapter that the binding was successful and this `View` doesn't require any more work). A look at the source code for the `SimpleAdapter.bindView` method will show you how the `ViewBinder` is used.

Also, I see that you use a custom adapter, are you sure you don't interfere with the normal `SimpleAdapter` logic?(also don't use the same name for the class and variable name)

Problem

I have 4 `TextViews`, 2 `ImageViews`, 2 `Buttons` and 2 widgets that are part of a row definition in a `ListView`. The data comes from XML and a `SimpleAdapter`. To access these `TextViews` I implement the `ViewBinde`r in a custom class and override the `setViewValue`. This works and the two `TextViews` I want to dynamically change are handled in the `setViewValue`. What is confusing to me is why my other two TextViews don't get passed through `setViewValue`. I say this based upon setting a breakpoint where the execution thread only enters twice. I was expecting to see it 4 or more times? Here is the `setViewValue` where I have a breakpoint set. ``` @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 declaration of the `TextViews`(1 shows and 4 doesn't): ``` <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" /> ``` So in summary why does the execution enter the override only twice AND it just so happens to be the exact two I want to update? Well through additional reading and deductive reasoning a few more pieces of information have come to light. In my mind ever View in the `ListView` row XML would pass through the `ViewBinder` but that was WRONG! From what I can figure you attach the `ViewBinder` to the DataAdapter via `setViewBinder`. Well since the DataAdapter is told what View(s) to use to populate the data in it it makes sense that only the two were showing. I was only revealing two to it. Here is a snippet where I specify the Views involved in the populating process and pass them on the constructor of the 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); ``` While this seems to make sense I don't know that my deductive reasoning is accurate. Will update as I find more information.

Original source