Android:我必须在列表视图中显示数据库中的内容,其中最新数据位于顶部

时间:2012-09-12 16:19:46

标签: android sqlite android-listview

我必须实现一个列表视图,其中我的当前数据位于列表视图之上。现在我的最新数据位于底部,我的第一个数据位于列表视图的顶部。到目前为止,我正在加入我的工作:

SearchActivity.java

public class SearchActivity extends Activity implements OnClickListener,
    OnItemClickListener {

private EditText mHistoryNameEditText;
private Button mInsertButton;
private ListView mHistoryListView;

private ListAdapter mHistoryListAdapter;

private ArrayList<SearchHistoryDetails> searchArrayList;

private ArrayList<SearchHistoryDetails> HistoryObjArrayList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mHistoryNameEditText = (EditText) findViewById(R.id.editText1);
    mInsertButton = (Button) findViewById(R.id.button1);
    mInsertButton.setOnClickListener(this);

    mHistoryListView = (ListView) findViewById(R.id.names_lsitviews);
    mHistoryListView.setOnItemClickListener(this);

    searchArrayList = new ArrayList<SearchHistoryDetails>();

    mHistoryListAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, populateList());

    mHistoryListView.setAdapter(mHistoryListAdapter);

    HistoryObjArrayList = new ArrayList<SearchHistoryDetails>();
}

@Override
public void onClick(View v) {
    if (v.getId() == R.id.button1) {
        String providedUgraduateName = mHistoryNameEditText.getText()
                .toString();

        SearchHistoryDetails undergraduateDetailsPojoObj = new SearchHistoryDetails();
        undergraduateDetailsPojoObj.setuGraduateName(providedUgraduateName);

        HistoryObjArrayList.add(undergraduateDetailsPojoObj);

        insertUndergraduate(undergraduateDetailsPojoObj);

        finish();
    }
}

public void insertUndergraduate(
        SearchHistoryDetails paraUndergraduateDetailsPojoObj) {

    AndroidOpenDbHelper androidOpenDbHelperObj = new AndroidOpenDbHelper(
            this);

    SQLiteDatabase sqliteDatabase = androidOpenDbHelperObj
            .getWritableDatabase();

    ContentValues contentValues = new ContentValues();

    contentValues.put(AndroidOpenDbHelper.COLUMN_NAME_UNDERGRADUATE_NAME,
            paraUndergraduateDetailsPojoObj.getuGraduateName());
    long affectedColumnId = sqliteDatabase.insert(
            AndroidOpenDbHelper.TABLE_NAME_GPA, null, contentValues);

    sqliteDatabase.close();
    Toast.makeText(this,
            "Values inserted column ID is :" + affectedColumnId,
            Toast.LENGTH_SHORT).show();

}

public List<String> populateList() {

    List<String> uGraduateNamesList = new ArrayList<String>();

    AndroidOpenDbHelper openHelperClass = new AndroidOpenDbHelper(this);

    SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase();

    Cursor cursor = sqliteDatabase.query(
            AndroidOpenDbHelper.TABLE_NAME_GPA, null, null, null, null,
            null, null);

    startManagingCursor(cursor);

    while (cursor.moveToNext()) {

        String ugName = cursor
                .getString(cursor
                        .getColumnIndex(AndroidOpenDbHelper.COLUMN_NAME_UNDERGRADUATE_NAME));

        SearchHistoryDetails ugPojoClass = new SearchHistoryDetails();
        ugPojoClass.setuGraduateName(ugName);

        searchArrayList.add(ugPojoClass);

        uGraduateNamesList.add(ugName);
    }

    sqliteDatabase.close();

    return uGraduateNamesList;
}

@Override
protected void onResume() {
    super.onResume();
    searchArrayList = new ArrayList<SearchHistoryDetails>();
    mHistoryListAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, populateList());
    mHistoryListView.setAdapter(mHistoryListAdapter);
}

@Override
protected void onStart() {
    super.onStart();
    searchArrayList = new ArrayList<SearchHistoryDetails>();
    mHistoryListAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, populateList());
    mHistoryListView.setAdapter(mHistoryListAdapter);
}

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

    Toast.makeText(getApplicationContext(), "Clicked on :" + arg2,
            Toast.LENGTH_SHORT).show();

    SearchHistoryDetails clickedObject = searchArrayList.get(arg2);

    Bundle dataBundle = new Bundle();
    dataBundle.putString("clickedUgraduateName",
            clickedObject.getuGraduateName());
}}

这个类帮助我从数据库中获取数据并将其填充到活动上。我的创建数据库类:

AndroidOpenDbHelper.java

public class AndroidOpenDbHelper extends SQLiteOpenHelper {

public static final String DB_NAME = "allsearch_history_db";
public static final int DB_VERSION = 1;

public static final String TABLE_NAME_GPA = "search_table";
public static final String COLUMN_NAME_UNDERGRADUATE_NAME = "undergraduate_name_column";

public AndroidOpenDbHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {

    String sqlQueryToCreateUndergraduateDetailsTable = "create table if not exists "
            + TABLE_NAME_GPA
            + " ( "
            + BaseColumns._ID
            + " integer primary key autoincrement, "
            + COLUMN_NAME_UNDERGRADUATE_NAME
            + " text not null); ";

    db.execSQL(sqlQueryToCreateUndergraduateDetailsTable);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion == 1 && newVersion == 2) {
        // Upgrade the database
    }
}}

这是我创建数据库和表的类。

现在,真正的问题是,当我尝试从数据库中填充数据时,它首先出现在顶部,最新出现在数据库中。我想还原它。在克服这个问题时,我们将不胜感激。

2 个答案:

答案 0 :(得分:2)

有几种不同的方法可以做到这一点。我建议您使用查询的ORDER BY子句:

Cursor cursor = sqliteDatabase.query(
        AndroidOpenDbHelper.TABLE_NAME_GPA, null, null, null, null, null, 
        AndroidOpenDbHelper.COLUMN_NAME_UNDERGRADUATE_NAME + " DESC");

此外,如果您只想从一列读取,那么您的查询应该只请求该列。否则,您将浪费资源查询未使用的信息列:

Cursor cursor = sqliteDatabase.query(
        AndroidOpenDbHelper.TABLE_NAME_GPA,
        new String[] {AndroidOpenDbHelper.COLUMN_NAME_UNDERGRADUATE_NAME},
        null, null, null, null, 
        AndroidOpenDbHelper.COLUMN_NAME_UNDERGRADUATE_NAME + " DESC");

最后,您可能需要考虑使用SimpleCursorAdapter,它允许您使用最少的代码将查询绑定到ListView。


<强>加成 我仔细研究了你的代码并尝试了这个:

Cursor cursor = sqliteDatabase.query(
        AndroidOpenDbHelper.TABLE_NAME_GPA, null, null, null, null, null, 
        BaseColumns._ID + " DESC");

答案 1 :(得分:0)

我可以建议您从数据库中获取数据,并以相反的顺序在要为填充列表视图设置的适配器中添加项目。 考虑this作为示例,您可以从数据库中获取返回arraylist的值。 现在考虑这个arraylist并将每个项目添加到arrayadapter中,如下所示:

for(i=arraylist.size()-1;i>0;i--)
{ 
   adapter.add(arraylist.get(i));
}

并在第一次设置后,您可以致电

adapter.notifyDataSetChanged() 

自动刷新列表。 尝试一下这个