0

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

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
    }
}}

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

现在,真正的问题是,当我尝试从数据库中填充数据时,它会出现在顶部的第一个数据和向下的最新数据。我想恢复它。任何帮助将不胜感激克服这个问题。

4

2 回答 2

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");
于 2012-09-12T16:33:14.633 回答
0

好吧,我可以建议您从数据库中获取数据,并在您为填充列表视图而设置的适配器中以相反的顺序添加项目。将此视为示例,您可以其中从返回数组列表的数据库中获取值。现在考虑这个数组列表并将每个项目从最后一个添加到数组适配器中:

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

并且在第一次设置之后就可以调用

adapter.notifyDataSetChanged() 

自动刷新列表。试试这个

于 2012-09-12T16:27:53.863 回答