5

の行定義の一部である4 TextViews、 2 ImageViews、 2 Buttons、および 2 のウィジェットがありますListView。データは XML とSimpleAdapter. これらにアクセスするには、カスタム クラスで rTextViewsを実装し、 . これは機能し、動的に変更したい 2 つは で処理されます。私が混乱しているのは、他の 2 つの TextViews が渡されない理由です。これは、実行スレッドが 2 回だけ入るブレークポイントを設定することに基づいています。4回以上見る予定だった?ViewBindesetViewValueTextViewssetViewValuesetViewValue

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" />

要約すると、実行がオーバーライドに2回しか入力されず、たまたま更新したい2つだけになるのはなぜですか?

追加の読書と演繹的推論を通じて、さらにいくつかの情報が明らかになりました。私の考えでは、ListView行内のビュー XML は通過しますViewBinderが、それは間違っていました! 私が理解できることViewBinderから、 を経由して DataAdapter に接続しsetViewBinderます。DataAdapter には、データを取り込むために使用するビューが示されているため、2 つだけが表示されていたことは理にかなっています。私はそれに2つだけを明らかにしていました。

次のスニペットでは、入力プロセスに関与するビューを指定し、それらを 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

宣言したすべてに a を設定すると(あなたの場合はViewBinder配列SimpleAdapter )、何があってものメソッドに渡されます。メソッドが(何らかの理由で)データ バインディングが失敗したことを意味するものを返さない場合は、 data からテキストを設定して、( a の)デフォルト アクションを取得します。今、あなたは が2 つだけのために何かを行い(ID でチェック)、何があっても を返すことを宣言しました。行レイアウトで他の人に を入力すると、再び を入力し、ID と一致しない (したがって、それらの更新はありません) と戻りますViewstoViewBindersetViewValue()setViewValuetrueViewTextViewHashmapsetViewValueTextViewstrue setViewValueViewssetViewValueViewstrue(バインディングが成功したことをアダプターに通知し、これView以上の作業は必要ありません)。メソッドのソース コードを見ると、 がどのように使用されているかがわかります。SimpleAdapter.bindViewViewBinder

また、カスタム アダプターを使用しているようですが、通常のSimpleAdapterロジックに干渉していませんか? (クラスと変数名に同じ名前を使用しないでください)

于 2012-05-19T07:38:33.670 に答える