-1

我想从数据库中获取数据并在列表视图中显示,我创建了一个 Arraylist 并通过这种方式将列表视图连接到数据库,但我只能显示每个列的详细信息行,但我正在寻找的是一种在数据库的每一行中显示我的表的所有列的详细信息的方法。

我想显示我的行的描述,这些行以较小的字体插入到我的列表视图中每行的主要内容下方的其他列中。我尝试使用一个使用 SimpleCursorAdapter 的代码片段,但我无法在这里实现它!我还发现我可以使用 hashmap 但我已经找到的示例都是关于使用字符串数组填充列表视图。

这是我的 layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#86868a"
    >
 <ListView 
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    style="@style/CodeFont"
     >
    </ListView>
 <RelativeLayout android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     >  
 <Button 
     android:id="@+id/DeleteSelectedGoodsButton"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@string/DeleteSelectedGoods"
     android:layout_alignParentTop="true"
     android:layout_alignParentLeft="true"/>
 <Button 
     android:id="@+id/ConfirmDelete"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@string/ConfirmDeleteButton"
     android:layout_alignParentTop="true"
     android:layout_centerHorizontal="true"
     />
 <Button 
     android:id="@+id/CancelButton"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@string/CancelButton"
     android:layout_alignParentTop="true"
     android:layout_alignParentRight="true"
     />
 </RelativeLayout>
</LinearLayout>

这是我的 SQLHelper

public class ExternalDbOpenHelper extends SQLiteOpenHelper {

    //-----------------------------------------------------
    public static String DB_PATH;
    //-----------------------------------------------------
    public static String DB_NAME;
    public SQLiteDatabase database;
    public final Context context;
    /////Adapted From spinner
     /** A constant, stores the the table name */

    private static final String TABLE_NAME = "Tbl_Goods";
    private static final String GOOD_ID = "Good_ID";
    private static final String CART_ID = "Cart_ID";
    private static final String GOOD_NAME = "Good_Name";
    private static final String GOOD_UNITPRICE = "Good_UnitPrice";
    private static final String QUANTITY = "Quantity";
    ////---------------------------

    public SQLiteDatabase getDb() {
        return database;

    }

    public ExternalDbOpenHelper(Context context, String databaseName) {
        super(context, databaseName, null, 1);
        this.context = context;
        //-------------------------------------------------
        String packageName = context.getPackageName();
        DB_PATH = String.format("//data//data//%s//databases//", packageName);
        DB_NAME = databaseName;
        openDataBase();
    }

    //--------------------------------------------------------------------------------
    public void createDataBase() {
        boolean dbExist = checkDataBase();
        if (!dbExist) {
            this.getReadableDatabase();
            try {
                copyDataBase();
            } catch (IOException e) {
                Log.e(this.getClass().toString(), "Copying error");
                throw new Error("Error copying database!");
            }
        } else {
            Log.i(this.getClass().toString(), "Database already exists");
        }
    }
    //--------------------------------------------------------------
    private boolean checkDataBase() {
        SQLiteDatabase checkDb = null;
        try {
            String path = DB_PATH + DB_NAME;
            checkDb = SQLiteDatabase.openDatabase(path, null,
                    SQLiteDatabase.OPEN_READONLY);
        } catch (SQLException e) {
            Log.e(this.getClass().toString(), "Error while checking db");
        }
        //---------------------------------------------------
        if (checkDb != null) {
            checkDb.close();
        }
        return checkDb != null;
    }
    //-----------------------------------------------------
    private void copyDataBase() throws IOException {
        // ----------------------------------------------
        //------------------- assets----------------------
        InputStream externalDbStream = context.getAssets().open(DB_NAME);

        // ----------------------------------------------------------
        String outFileName = DB_PATH + DB_NAME;

        // -------------------------------------------------
        OutputStream localDbStream = new FileOutputStream(outFileName);

        //------------------------------------
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = externalDbStream.read(buffer)) > 0) {
            localDbStream.write(buffer, 0, bytesRead);
        }
        // -----------------------------
        localDbStream.close();
        externalDbStream.close();

    }

    public SQLiteDatabase openDataBase() throws SQLException {
        String path = DB_PATH + DB_NAME;
        if (database == null) {
            createDataBase();
            database = SQLiteDatabase.openDatabase(path, null,
                SQLiteDatabase.OPEN_READWRITE);
        }
        return database;
    }
    @Override
    public synchronized void close() {
        if (database != null) {
            database.close();
        }
        super.close();
    }

    ////-----------------------Adapted From SQLSpinner
    /** Inserts a new contact to the table contacts */
    public long insert(ContentValues contentValues){
        long rowID = database.insert(TABLE_NAME, null, contentValues);
        return rowID;

    }

    /** Updates a contact */
    public int update(ContentValues contentValues,String contactID){
        int cnt = database.update(TABLE_NAME, contentValues, "_id=" + contactID, null);
        return cnt;
    }

    /** Deletes a contact from the table */
    public int del(String contactID){
        int cnt = database.delete(TABLE_NAME, "_id="+contactID, null);      
        return cnt;
    }

    /** Returns all the contacts in the table */
    public Cursor getAllContacts(){
        return database.query(TABLE_NAME, new String[] { GOOD_ID,  CART_ID , GOOD_NAME,GOOD_UNITPRICE,QUANTITY } , null, null, null, null, GOOD_NAME + " asc ");
    }

    /** Returns a contact by passing its id */
    public Cursor getContactByID(String contactID){
        return database.query(TABLE_NAME, new String[] {  GOOD_ID,  CART_ID , GOOD_NAME,GOOD_UNITPRICE,QUANTITY} , "_ID="+contactID, null, null, null, GOOD_NAME + " asc ");
    }

    ////-----------------------------------
    @Override
    public void onCreate(SQLiteDatabase db) {}
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

这是我的活动:

public class PrepopSqliteDbActivity extends ListActivity {
    private static final String DB_NAME = "NFC.sqlite";
    //------------------------------------------------------------
    private static final String TABLE_NAME = "Tbl_Goods";
    private static final String GOOD_ID = "Good_ID";
    private static final String CART_ID = "Cart_ID";
    private static final String GOOD_NAME = "Good_Name";
    private static final String GOOD_UNITPRICE = "Good_UnitPrice";
    private static final String QUANTITY = "Quantity";

    private SQLiteDatabase database;
    private ListView listView;
    private ArrayList<String> goods;

    //////-----------------Adapted From SQLSpinner
    ArrayAdapter mAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.table_row);

        //-------------------------------------------------------
        ExternalDbOpenHelper dbOpenHelper = new ExternalDbOpenHelper(this, DB_NAME);
        database = dbOpenHelper.openDataBase();
        //--------------------------------------

    fillgoods();
        setUpList();  
  //////Cancel Button

        Button btnCancel=(Button)findViewById(R.id.CancelButton);
        btnCancel.setOnClickListener(new OnClickListener() {

            public void onClick(View arg0) {

                finish();
            }
        });


    }

    private void setUpList() {
        //---------------------------------layout------------------------------------
        setListAdapter(new ArrayAdapter<String>(this,
                        android.R.layout.simple_list_item_single_choice, goods));

        listView = getListView();
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

        mAdapter=new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_single_choice, goods);

        //---------------------------------------------------------------------------
        listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                                int position,long id) {
                Toast.makeText(getApplicationContext(),
                            ((TextView) view).getText().toString(),
                             Toast.LENGTH_SHORT).show();                
            }

        });


    }

    //--------------------------------------------------------------------
    private void fillgoods() {
        goods = new ArrayList<String>();
        Cursor goodCursor = database.query(TABLE_NAME,
                                             new String[] 
                                             {GOOD_UNITPRICE,GOOD_NAME,GOOD_ID, CART_ID,GOOD_UNITPRICE ,QUANTITY},
                                             null, null, null, null
                                             , GOOD_NAME);
        goodCursor.moveToFirst();
        if(!goodCursor.isAfterLast()) {
            do {
                String name = goodCursor.getString(1);
                goods.add(name);
            } while (goodCursor.moveToNext());
        }
        goodCursor.close();
    }




    //////////////Home And Back Button
    @Override
    public void onAttachedToWindow() {
       this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
      super.onAttachedToWindow();


    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
       if(keyCode == KeyEvent.KEYCODE_HOME)

           BackToMainIntent();

     else if(keyCode==KeyEvent.KEYCODE_BACK)
       {
         BackToMainIntent();
      }
       return false;
    }



    public void BackToMainIntent()
    {
        Intent intent = new Intent(this, Main.class);
           intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
           startActivity(intent);
      }
    }
4

1 回答 1

0

像这样分离适配器声明的目的是什么?

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, goods));

listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

mAdapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, goods);

仅包含一个 CheckedTextView,意味着该android.R.layout.simple_list_item_single_choice数组将仅投影一列。

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeightSmall"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:checkMark="?android:attr/listChoiceIndicatorSingle"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
/>

如果要显示所有列值,则必须创建自定义适配器。请参阅此处Vogella 教程

于 2013-01-09T09:20:36.330 回答