我正在尝试使用CursorAdapter在我的ListView上实现一种交替的行效果,这就是某些行,让我们说数字数据我想使用blue.xml作为其布局,而对于文本行,我想使用red.xml进行布局。我从Sqlite获取数据所以我认为使用CursorAdapter可能会更好,尽管我想知道CursorAdapter是否具有显着优化的实现,因为它使用来自查询的光标与使用BaseAdapter相比。所以我正在寻找一些帮助来获得不同类型行的交替行效果:例如。
Text - red_row
Text - red_row
Numbers - blue_row
Text - red_row
Numbers - blue_row
Numers - blue_row
Text - red_row
@Override
public View newView( Context context, Cursor cursor, ViewGroup parent ) {
View retView;
Holder holder = new Holder();
LayoutInflater inflater = LayoutInflater.from( context );
if(cursor.getString( cursor.getColumnIndex( "from" ) ).equals( myId )){
retView = inflater.inflate( R.layout.row_red, parent, false);
holder.message = (TextView) retView.findViewById(R.id.msg1);
holder.time = (TextView) retView.findViewById(R.id.msg2);
holder.viewType = 1;
}else{
retView = inflater.inflate( R.layout.row_blue, parent, false);
holder.message = (TextView) retView.findViewById(R.id.txt1);
holder.time = (TextView) retView.findViewById(R.id.txt1);
holder.viewType = 2;
}
retView.setTag( holder );
return retView;
}
@Override
public void bindView( View view, Context context, Cursor cursor ) {
Holder holder = (Holder)view.getTag();
String message = cursor.getString( cursor.getColumnIndex( "text" ) );
String time = cursor.getString( cursor.getColumnIndex( "time" ) );
holder.message.setText( message );
holder.time.setText( time );
}
static class Holder{
TextView message;
TextView time;
int viewType;
}
我尝试了上面的代码并且它确实适用于所有可见行,但是一旦数据必须滚动,所有新填充的行都显示错误的布局,我检查了sqlite中的数据和我想要的行ID是某个布局是正确的,不确定是什么原因会导致这一点,但我将其缩小到newView方法中的某些内容,或者查询对于滚动速率来说太慢,导致错误的布局被夸大。任何帮助表示赞赏。
答案 0 :(得分:0)
绕过游标适配器的默认实现并覆盖
public View getView(int position, View convertView, ViewGroup parent) {...}
getViewTypeCount() { return 2}
@Override
public int getItemViewType(int position) {
return BLUE_vs_RED_logic(position); // return 0 or 1
}
喜欢正常的适配器。它应该工作正常。 (免责声明:我从来没有这样做过,但请看https://stackoverflow.com/a/8617766/154272)
假设两个视图之间的差异不是太大(从内存使用的角度来看)。
创建包含两种布局的元行布局。然后在bindView中隐藏/显示你需要的东西。
如果您不使用图像,我建议您使用解决方案编号2.