自定义CursorAdapter,ListView正在转移

时间:2011-06-21 16:50:57

标签: android listview adapter simplecursoradapter

我的类扩展了SimpleCursorAdapter。在该类中,我尝试将CallLog放入ListView(带有三个TextView(数字,名称和日期)和两个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);
}

列“数字”,“名称”,“_ ID”工作正常,一切正常。但是我在newView方法中尝试从光标(例如“持续时间”)获得的持续时间和其他列正在转移。 来自ThinkAndroid博客的jwei512(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 :(得分:0)

您是否通过 bindView()方法实现了,因为在更新调用此方法的行时。如果没有,则覆盖它并再次从数据库中获取数据。

答案 1 :(得分:0)

我不知道我是否真的对你提出疑问,但是所有计算的方便地点都是重写方法getView Text()

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

答案 2 :(得分:0)

恕我直言,做得对:

  1. 不需要bindView()。使用newView

  2. 必须在String []中声明每个值。

  3. 如果你想对TextViews进行任何操作,你应该使用setViewText(TextView v,String text)方法(感谢piotrpo)

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

    }