0

私のクラスはSimpleCursorAdapterを拡張します。そのクラスでは、CallLogをListView(3つのTextView(番号、名前、日付)と2つのImageView(着信と発信の呼び出しを表す)で取得しようとしています。

OnCreateメソッドの私のコード:

    Cursor c = getContentResolver().query(android.provider.CallLog.Calls.CONTENT_URI, null, "TYPE IN (\"1\",\"2\")", null, "DATE DESC");
    startManagingCursor(c);

    String[] from = new String[] {"number", "name" , "_ID" };
    int[] to = new int[] {R.id.number, R.id.name, R.id.duration};
    listNotImported=(ListView)findViewById(R.id.ListOfNotImportedCalls);
    listNotImported.setOnItemClickListener(this);
    list1Adapter5 = new IconicAdapter5(this, R.layout.rownotimportedcalls, c, from, to);
    listNotImported.setAdapter(list1Adapter5);

私のクラス:

class IconicAdapter5 extends SimpleCursorAdapter
{


    public IconicAdapter5(Context context, int layout, Cursor c, String[] from, int[] to) 
    {
        super(context, layout, c, from, to);
    }
    public View newView(Context context, Cursor c, ViewGroup parent )
    {
        rowNotImported = super.newView(CallLog.this, c, parent);
        String duration= c.getString(c.getColumnIndex("DURATION"));
        ((TextView)rowNotImported.findViewById(R.id.duration)).setText(duration);
        return (rowNotImported);
}

列"number"、 "name"、 "_ ID"は正常に機能し、すべて問題ありません。しかし、durationと、newViewメソッドでカーソルから取得しようとする別の列(「duration」など)がシフトしています。ThinkAndroidブログ(http://thinkandroid.wordpress.com/2010/01/11/custom-cursoradapters/)のjwei512がそれについて書いていますが、計算された列とnewViewの別の列をビューに入れる方法がまだわかりません方法。

インターネットで解決策が見つからないので混乱しています。助けてください。

jwei512:「次に、奇妙な動作に気付くでしょう。つまり、リストを上下にスクロールすると名前がシフトし始めるのがわかります。インスタンス化してTextViewに何かを配置しないと、どうなりますか(基本的にプレースホルダーとして機能するため)次に、bindViewメソッドでは、一部のTextViewにバインドされないため、シフトします。したがって、基本的に、リスト内で何かがシフトしているのを確認した場合、それは、バインドしていることを確認するための大きなフラグです。 newViewメソッドとbindViewメソッドの両方のすべてのビューに。」

私の行を表すXML:

    <TableLayout android:layout_alignParentLeft="true" 
    android:layout_alignBaseline="@+id/myTable" android:id="@+id/myTable"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:stretchColumns="0"
    android:shrinkColumns="yes">


    <TableRow>

    <TextView
    android:id="@+id/name"
    android:textSize="18dp"
    android:textColor="@color/white"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">
    </TextView>

    <ImageView  
    android:layout_width="20dp" 
    android:layout_height="20dp" 
    android:id="@+id/imageViewType">
    </ImageView>

    </TableRow>




    <TableRow>
    <LinearLayout>
    <TextView
    android:id="@+id/headerNumber"
    android:textColor="@color/white" 
    android:textSize="12sp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">
    </TextView>


    <TextView 
    android:id="@+id/number"
    android:textColor="@color/white" 
    android:textSize="12dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dip"
    >
    </TextView>
    </LinearLayout>
    </TableRow>

        <TableRow>
    <LinearLayout>
    <TextView
    android:id="@+id/headerDate"
    android:textColor="@color/white" 
    android:textSize="12dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">

    </TextView>
    <TextView 
    android:id="@+id/date"
    android:textColor="@color/white" 
    android:textSize="12dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dip" >
    </TextView>

    </LinearLayout>
    </TableRow>


    <TableRow>
    <LinearLayout>
    <TextView
    android:id="@+id/headerDuration"
    android:textColor="@color/white" 
    android:textSize="12dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">

    </TextView>
    <TextView 
    android:id="@+id/duration"
    android:textColor="@color/white" 
    android:textSize="12dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp" >
    </TextView>

    </LinearLayout>
    </TableRow>



    </TableLayout>

4

3 に答える 3

0

行を更新するとこのメソッドが呼び出されるため、bindView()メソッドを使用して実装しましたか。そうでない場合は、それをオーバーライドして、データベースからデータを再度フェッチします。

于 2011-06-21T18:00:59.100 に答える
0

私が本当にあなたの質問を理解していないかどうかはわかりませんが、すべての計算を行うのに便利な場所はオーバーライドされたメソッドsetViewText()です

private class MyCursorAdapter extends SimpleCursorAdapter {



    private Date d = new Date();

    @Override
    public void setViewText(TextView v, String text) {
        if (v.getId() == R.id.TrackTime) {
            d.setTime(Long.parseLong(text));
            text = d.toLocaleString();
        }
        super.setViewText(v, text);
    }
}
于 2011-06-22T20:02:20.750 に答える
0

私見はそれを正しく行うために:

  1. bindView()は必要ありません。newViewを使用する

  2. すべての値は、String[]fromで宣言する必要があります。

  3. TextViewsで操作を行う場合は、setViewText(TextView v、String text)メソッドを使用する必要があります(piotrpoに感謝)

4. ImageViewsで操作を実行する場合は、そのコードを使用します(たとえば、着信コールと発信コールに異なる画像が必要な場合)

class IconicAdapter5 extends SimpleCursorAdapter
{
    private int source = 0;

    @Override
    public void setViewImage (ImageView v, String value) 
    {
         if (v.getId() == R.id.imageViewType) 
            {
                 if(value.equals("1") == true)
                 {
                    source= (R.drawable.sym_call_incoming);
                 }

                 if(value.equals("2") == true)
                 {
                    source= (R.drawable.sym_call_outgoing);
                 }
             }
         v.setImageResource(source);
    }

}

于 2011-06-24T12:55:23.560 に答える