2

を含む各行にSimpleCursorAdapterから入力されたListViewがあります。私はViewBinderR.id.text65)のすべての行についてTextViewsのうちの1つを変更したいだけですが、すべての行のすべて3つのTextViewsを更新し続けます。私のコードは次のとおりです。ViewBinderは、すべてのListView行の1つの項目を変更します。

cursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 
     public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
      sign = (TextView) view; 
      SharedPreferences currency = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
      String currency1 = currency.getString("Currency", "$"); 
        sign.setText(currency1); 

        return true; 
     } 
    }); 

P.S.私は(TextView) findViewById(R.id.text65);を試して、Force closeを得ました。

答えて

1

解決方法1:

あなたはviewbinderに列インデックスをチェックする必要があります:

 public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
      if (columnIndex == cursor.getColumnIndexOrThrow(**??**)) // 0 , 1 , 2 ?? 
      { 
       sign = (TextView) view; 
       SharedPreferences currency = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
       String currency1 = currency.getString("Currency", "$"); 
        sign.setText(currency1); 

        return true; 
      } 
      return false; 
     } 

注意、列インデックスは、通貨のDBcolumnインデックス/内の列のインデックスですあなたのデータソースは何でも。

解決方法2:

おそらく、例えば、あなたのlistview中にバインドするフィールドのint[]を定義している:

  // and an array of the fields we want to bind those fields to 
    int[] to = new int[] { R.id.field1, R.id.field2, R.id.Currency }; 

    SimpleCursorAdapter entries = new SimpleCursorAdapter(this, R.layout.row, cursor, from, to); 

...条件付き、あなたは単に0の代わりに渡すことができますバインドする/表示する必要のないフィールドのレイアウトID。

  int[] to = new int[] { 0, 0, R.id.Currency }; 

このように、通貨フィールドのみがバインドされます。また


が、その理由は、あなたは、技術的には、何もあなたの contentViewにおける単一 text65多く がないので近い 力が得られます。メインレイアウトレベルからアクセスすることはできません。これは、単一行の範囲内でのみユニークです。


更新:

解決策3:

ViewBinder

public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
     int viewId = view.getId(); 
     Log.v("ViewBinder", "columnIndex=" + columnIndex + " viewId = " + viewId); 
     if(viewId == R.id.text65) 
     { 
      sign = (TextView) view; 
      SharedPreferences currency = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
      String currency1 = currency.getString("Currency", "$"); 
      sign.setText(currency1); 

      return true; 
     } 
     return false; 
    } 

のビューのidは、あなたがこれを試みることができるチェック!

ヒント:Log.vを使用すると、コード内の特定の値をデバッグすることなくチェックできます。

希望します。

+0

これは非常に素晴らしい情報ですが、状況についてもう少し詳しく説明してくれてありがとうございます。私のリストビューでは、各行に日付、経費、および設定で変更可能なその費用を含む通貨記号が含まれています。 (例:[6月19日$ 102.32])。私の通貨記号が私のデータベースに置かれていれば、これらの解決策はうまくいくでしょうが、すべての行に複写したいsharedpreferencesにある単なる単純な値です。もう一度お時間をいただきありがとうございます。 – 725623452362

+0

何が起きているのですか?リストビューの行は、テキストビューの3つすべてを変更するため、[$ $ $]として表示されます。あなたがこれのための解決策を持っているなら、私は感謝するでしょう! – 725623452362

+0

うーん..あなたは最初のソリューションを使用することができるはずです。 'cursor.getColumnIndexOrThrow(...)'のisnteadは、ハードコードされた値(0,1,2)を試し、通貨列を取得できるかどうかを調べる簡単なテストを行います。 –

関連する問題