Пользовательский CursorAdapter, ListView смещается - PullRequest
0 голосов
/ 21 июня 2011

Мой класс расширяет SimpleCursorAdapter.В этом классе я пытаюсь получить CallLog в ListView (с тремя TextViews (номер, имя и дата) и двумя ImageViews (который представляет входящие и исходящие вызовы).

Мой код в методе 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);
}

Столбцы "число", "имя", "_ID" работают нормально, все в порядке. Но продолжительность и другие столбцы, которые я пытаюсь получить из курсора (например, «длительность») в методе newView смещается. Об этом писал jwei512 из блога ThinkAndroid (http://thinkandroid.wordpress.com/2010/01/11/custom-cursoradapters/), но я до сих пор не понимаю, как я могу вставить в свое представление вычисляемые столбцы и другие столбцы в методе newView.

Я в замешательстве, потому что не могу найти решение в Интернете. Пожалуйста, помогите мне.

jwei512: «Тогда вы заметите какое-то странное поведение, а именно то, что вы увидитеимена начинают смещаться при прокрутке вверх и вниз по списку. Что происходит, если вы не создаете экземпляр и не помещаете что-либо в ваш TextView (в основном, чтобы выполнять роль заполнителя), то в вашем методе bindView нетвещь связана с некоторыми из TextViews и, следовательно, смещение.В общем, если вы видите, что в ваших списках происходит смещение, то это большой флаг для того, чтобы убедиться, что вы связываете вещи со всеми вашими представлениями в методах 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>

Ответы [ 3 ]

0 голосов
/ 23 июня 2011

Не знаю, действительно ли я понимаю ваш вопрос, но удобное место для выполнения всех расчетов - переопределенный метод 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);
    }
}
0 голосов
/ 24 июня 2011

ИМХО, чтобы сделать это правильно:

  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);
    }

}

0 голосов
/ 21 июня 2011

Реализовали ли вы через bindView () метод, поскольку при обновлении строк вызывается этот метод.Если нет, то переопределите это и снова получите данные из базы данных.

...