-1

データベースからデータをフェッチして、リストビューに配列リストを作成し、これによってリストビューをデータベースに接続して表示したいのですが、それぞれに1つの列の詳細しか表示できません。行ですが、私が探しているのは、データベースの各行にあるテーブルのすべての列の詳細を表示する方法です。

リストビューの各行のメインコンテンツの下に、他の列に挿入されている行の説明を小さいフォントで表示したいと思います。SimpleCursorAdapterを使用したコードスニペットを使用しようとしましたが、ここでは実装できませんでした!ハッシュマップを使用できることもわかりましたが、すでに見つけたサンプルは、文字列の配列を使用してリストビューにデータを入力します。

これが私の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);

にはandroid.R.layout.simple_list_item_single_choiceCheckedTextView が 1 つだけ含まれています。これは、配列が 1 つの列だけに射影されることを意味します。

<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 に答える