【问题标题】:Inflating multiple views from CursorAdapter从 CursorAdapter 膨胀多个视图
【发布时间】:2014-02-25 17:53:10
【问题描述】:

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

【问题讨论】:

    标签: android android-sqlite android-cursoradapter


    【解决方案1】:

    解决方案 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 号解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多