我的类扩展了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>
答案 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)
恕我直言,做得对:
不需要bindView()。使用newView
必须在String []中声明每个值。
如果你想对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);
}
}