2

我从数据库中查询了文本(标题)并将其显示在 TextView 中,但是当它显示时,它不按顺序显示,但它只显示一个标题,并且该标题位于标题列的最后一个索引中。

我怎样才能全部显示并从头到尾排序?

图像适配器

public class ImageAdapter extends BaseAdapter {

    private ArrayList<HashMap<String, String>> MyArr = new ArrayList<HashMap<String,String>>();
    Cursor cursor = dataSource.database.rawQuery("SELECT * FROM "+CafeDbOpenHelper.TABLE_CAFE, null);

    public ImageAdapter(Context c){
        context = c;
    }
    @Override
    public int getCount() {
        return cursor.getCount();           
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View converView, ViewGroup parent) {
        ViewHolder viewHolder = new ViewHolder();
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if(converView == null){
            converView = inflater.inflate(R.layout.grid_item, null);
        }
        viewHolder.imageview = (ImageView) converView.findViewById(R.id.imv_card_cafe);
        viewHolder.txtTitle = (TextView) converView.findViewById(R.id.txt_title);


        while (cursor.moveToNext()) {
            Log.i("db", " return "+cursor.getString(cursor.getColumnIndex(TAG_CAFE_TITLE)));
                viewHolder.txtTitle.setText(cursor.getString(cursor.getColumnIndex(TAG_CAFE_TITLE)));
        }


        String imagePath = Environment.getExternalStorageDirectory().toString()+"/downloadedfile.png";   
        viewHolder.imageview.setImageResource(mThumb[position]);

        return converView;
    }
}

Logcat db 标签是来自数据库的文本

03-04 14:44:00.411: D/AbsListView(22842): Get MotionRecognitionManager
03-04 14:44:00.426: I/ACTION(22842): Database is open
03-04 14:44:00.442: I/number(22842): return11 rows
03-04 14:44:00.450: I/ACTION(22842): Database is open
03-04 14:44:00.504: I/db(22842):  return Kiriya Café
03-04 14:44:00.504: I/db(22842):  return Brown Coffee and Bakery
03-04 14:44:00.504: I/db(22842):  return The Blue Pumpkin - Riverside
03-04 14:44:00.504: I/db(22842):  return Black Canyon Coffee
03-04 14:44:00.559: D/libEGL(22842): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
03-04 14:44:00.575: D/libEGL(22842): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
03-04 14:44:00.575: D/libEGL(22842): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
03-04 14:44:00.684: D/OpenGLRenderer(22842): Enabling debug mode 0
03-04 14:45:35.348: I/ACTION(22842): Database is close

图片

在此处输入图像描述

4

1 回答 1

0

关于标题的顺序,您只需修改您的选择查询,以便检索已排序的行:

"SELECT * FROM "+CafeDbOpenHelper.TABLE_CAFE + " ORDER BY YOUR_COLUMN_TITLE", null

现在至于为什么只显示一个文本视图,它与您编写逻辑的方式有关:

viewHolder.txtTitle = (TextView) converView.findViewById(R.id.txt_title);


while (cursor.moveToNext()) {
      Log.i("db", " return "+cursor.getString(cursor.getColumnIndex(TAG_CAFE_TITLE)));
      viewHolder.txtTitle.setText(cursor.getString(cursor.getColumnIndex(TAG_CAFE_TITLE)));
}

您基本上在该循环中修改了相同的 textview 四次,因此它自然会设置为您从数据库中检索到的最后一个(恰好是 Black Canyon Coffee)

您需要 1) 动态创建 textview 并将其添加到现有视图或 2) 创建放置在布局中的四个 textview 并在 while 循环中适当地设置它们。

编辑:通常,您会希望使用选项#1,因为当您使用不断变化的数据库时(并且也便于将来修改),它无疑是最明智的方法。但是,如果您在项目规范中绝对确定您的表格中将有固定数量的行(例如,因为您的应用程序中只能有四个咖啡馆,并且您只会交换表格以加载不同的名称) ,那么快速而肮脏的方法是制作四个文本视图并通过迭代它们来适当地设置每个文本视图。

这个答案主要是出于猜测,因为您没有告诉我们您打算如何使用/操作数据库,所以这完全取决于您的判断。

于 2013-03-04T08:30:59.117 回答