-1

I want to fetch the data from the database and show the, in a listview,I've created an Arraylist and by means of this connected the listview to the database, but I'm only able to show the details of one column in each row, but what I'm looking for is a way to show the Details of all columns of my table in each row of the database.

I want to show the description of my rows which are inserted in other columns in smaller fonts below the main content of each row in my listview. I've tried to use a code snippet which had used a SimpleCursorAdapter but I couldn't implement this here!I've also found out that I can use hashmap but the samples I've already found were all about using arrays of strings to populate the listview.

Here is my 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>

Here is my 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) {}
}

And here is my activity:

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);
      }
    }
halfer
  • 19,824
  • 17
  • 99
  • 186

1 Answers1

0

What is the purpose of separating adapter declaration like this?

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);

The android.R.layout.simple_list_item_single_choice only contains one CheckedTextView, means the array will be projected only one column.

<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"
/>

If you want to show all the column value, you must create custom adapter. See here and Vogella tutorial.

Community
  • 1
  • 1
Zyoo
  • 773
  • 10
  • 30
  • I wanted to use MAdapter somewhere else in my code,but it didn't work,thanks for your care –  Jan 09 '13 at 10:10