从CursorAdapter扩展多个视图

时间:2014-02-25 17:53:10

标签: android android-sqlite android-cursoradapter

我正在尝试使用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方法中的某些内容,或者查询对于滚动速率来说太慢,导致错误的布局被夸大。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

解决方案1:

绕过游标适配器的默认实现并覆盖

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

解决方案2:

假设两个视图之间的差异不是太大(从内存使用的角度来看)。

创建包含两种布局的元行布局。然后在bindView中隐藏/显示你需要的东西。

建议

如果您不使用图像,我建议您使用解决方案编号2.