vendredi 18 septembre 2015

MultiColumn ListView and SQLite Database

I already created my SQL DB and its environment. Filling it with values and sending it to ListView is working, but the way it is shown is not quite nice, because the the different values a not put into different columns. So I tried to put them into eight columns.

First, I created a Column_Row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://ift.tt/nIICcg"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/NDAColumn"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_weight="1"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/StartpunktColumn"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/AgeColumn"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/GeschlechtColumn"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/DauerColumn"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/GeschwindigkeitColumn"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/StreckenprofilColumn"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/DistanzColumn"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_weight="1" />

</LinearLayout>

Than, I created a Constants.xml

package uni_hannover.sportapp;


public class Constants {

    public static final String FIRST_COLUMN="First";
    public static final String SECOND_COLUMN="Second";
    public static final String THIRD_COLUMN="Third";
    public static final String FOURTH_COLUMN="Fourth";
    public static final String FIFTH_COLUMN="Fifth";
    public static final String SIXTH_COLUMN="Sixth";
    public static final String SEVENTH_COLUMN="Seventh";
    public static final String EIGHTS_COLUMN="Eights";

}

After that I coded my ListViewAdapterCycling.class

package uni_hannover.sportapp;

import static uni_hannover.sportapp.Constants.FIRST_COLUMN;
import static uni_hannover.sportapp.Constants.SECOND_COLUMN;
import static uni_hannover.sportapp.Constants.THIRD_COLUMN;
import static uni_hannover.sportapp.Constants.FOURTH_COLUMN;
import static uni_hannover.sportapp.Constants.FIFTH_COLUMN;
import static uni_hannover.sportapp.Constants.SIXTH_COLUMN;
import static uni_hannover.sportapp.Constants.SEVENTH_COLUMN;
import static uni_hannover.sportapp.Constants.EIGHTS_COLUMN;




import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ListViewAdapterCycling extends BaseAdapter{

    public ArrayList<HashMap<String, String>> list;
    Activity activity;
    TextView txtFirst;
    TextView txtSecond;
    TextView txtThird;
    TextView txtFourth;
    TextView txtFifth;
    TextView txtSixth;
    TextView txtSeventh;
    TextView txtEights;


    public ListViewAdapterCycling(Activity activity,ArrayList<HashMap<String, String>> list){
        super();
        this.activity=activity;
        this.list=list;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub



        LayoutInflater inflater=activity.getLayoutInflater();

        if(convertView == null){

            convertView=inflater.inflate(R.layout.column_row, null);

            txtFirst=(TextView) convertView.findViewById(R.id.NDAColumn);
            txtSecond=(TextView) convertView.findViewById(R.id.StartpunktColumn);
            txtThird=(TextView) convertView.findViewById(R.id.AgeColumn);
            txtFourth=(TextView) convertView.findViewById(R.id.GeschlechtColumn);
            txtFifth=(TextView) convertView.findViewById(R.id.GeschlechtColumn);
            txtSixth=(TextView) convertView.findViewById(R.id.GeschlechtColumn);
            txtSeventh=(TextView) convertView.findViewById(R.id.GeschlechtColumn);
            txtEights=(TextView) convertView.findViewById(R.id.GeschlechtColumn);



        }

        HashMap<String, String> map=list.get(position);
        txtFirst.setText(map.get(FIRST_COLUMN));
        txtSecond.setText(map.get(SECOND_COLUMN));
        txtThird.setText(map.get(THIRD_COLUMN));
        txtFourth.setText(map.get(FOURTH_COLUMN));
        txtFifth.setText(map.get(FIFTH_COLUMN));
        txtSixth.setText(map.get(SIXTH_COLUMN));
        txtSeventh.setText(map.get(SEVENTH_COLUMN));
        txtEights.setText(map.get(EIGHTS_COLUMN));

        return convertView;
    }


}

I think that there are not mistakes so far...but now I want to implement the whole thing into my activity, which aims to show the list view and this is my try:

package uni_hannover.sportapp;

import static uni_hannover.sportapp.Constants.FIRST_COLUMN;
import static uni_hannover.sportapp.Constants.SECOND_COLUMN;
import static uni_hannover.sportapp.Constants.THIRD_COLUMN;
import static uni_hannover.sportapp.Constants.FOURTH_COLUMN;
import static uni_hannover.sportapp.Constants.FIFTH_COLUMN;
import static uni_hannover.sportapp.Constants.SIXTH_COLUMN;
import static uni_hannover.sportapp.Constants.SEVENTH_COLUMN;
import static uni_hannover.sportapp.Constants.EIGHTS_COLUMN;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.List;

import java.util.ArrayList;
import java.util.HashMap;
import android.widget.AdapterView;
import android.view.View;
import android.widget.Toast;

public class Cycling_Join extends AppCompatActivity {

    public static final String LOG_TAG = Cycling_Join.class.getSimpleName();

    private CyclingMemoDataSource dataSource;

    private ArrayList<HashMap<String, String>> list;

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


        dataSource = new CyclingMemoDataSource(this);

        Log.d(LOG_TAG, "Die Datenquelle wird geöffnet.");
        dataSource.open();




        Log.d(LOG_TAG, "Folgende Einträge sind in der Datenbank vorhanden:");
        showAllListEntries();


        Log.d(LOG_TAG, "Die Datenquelle wird geschlossen.");
        dataSource.close();
    }

    private void showAllListEntries () {

        List<CyclingMemo> cyclingMemoList =
                dataSource.getAllCyclingMemos();

        ArrayAdapter<CyclingMemo> cyclingMemoArrayAdapter = new ArrayAdapter<> (
                this,
                android.R.layout.simple_list_item_multiple_choice,
                cyclingMemoList);

        ListView shoppingMemosListView = (ListView) findViewById(R.id.cycling_memos);
        shoppingMemosListView.setAdapter(cyclingMemoArrayAdapter);

        list=new ArrayList<HashMap<String,String>>();

        HashMap<String,String> temp=new HashMap<String, String>();
        temp.put(FIRST_COLUMN, "NDA");
        temp.put(SECOND_COLUMN, "Startpunkt");
        temp.put(THIRD_COLUMN, "Alter");
        temp.put(FOURTH_COLUMN, "Geschlecht");
        temp.put(FIFTH_COLUMN,"Dauer");
        temp.put(SIXTH_COLUMN, "Geschwindigkeit");
        temp.put(SEVENTH_COLUMN, "Streckenprofil");
        temp.put(EIGHTS_COLUMN,"Distanz");

        list.add(temp);

        ListViewAdapterCycling adapter=new ListViewAdapterCycling(this, list);
        shoppingMemosListView.setAdapter(adapter);


    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_cycling__join, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

If I run the app, he only shows me four columns with four values I set in the HashMap, but my aim is, that he shows all values from my SQL in an average table with eight columns... Where is my mistake? I think the connector to the SQL is missing...

Would be really happy about some help!

For additional information see my SQL Helper

package uni_hannover.sportapp;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class CyclingMemoDBHelper extends SQLiteOpenHelper {

    private static final String LOG_TAG =
            CyclingMemoDBHelper.class.getSimpleName();
    public static final String DB_NAME = "cycling.db";
    public static final int DB_VERSION = 1;

    public static final String TABLE_CYCLING = "cycling";

    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_NDA = "NDA";
    public static final String COLUMN_Startpunkt = "Startpunkt";
    public static final String COLUMN_Age = "Age";
    public static final String COLUMN_Geschlecht = "Geschlecht";
    public static final String COLUMN_Dauer = "Dauer";
    public static final String COLUMN_Geschwindigkeit = "Geschwindigkeit";
    public static final String COLUMN_Streckenprofil = "Streckenprofil";
    public static final String COLUMN_Distanz = "Distanz";

    public static final String SQL_CREATE =
            "CREATE TABLE " + TABLE_CYCLING +
                    "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    COLUMN_NDA + " TEXT, " +
                    COLUMN_Startpunkt + " TEXT NOT NULL, " +
                    COLUMN_Age + " TEXT NOT NULL, " +
                    COLUMN_Geschlecht + " TEXT NOT NULL, " +
                    COLUMN_Dauer + " TEXT NOT NULL, " +
                    COLUMN_Geschwindigkeit + " TEXT NOT NULL, " +
                    COLUMN_Streckenprofil + " TEXT NOT NULL, " +
                    COLUMN_Distanz + " TEXT NOT NULL);";



    public CyclingMemoDBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        Log.d(LOG_TAG, "DbHelper hat die Datenbank: " + getDatabaseName() + " erzeugt.");
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        try {
            Log.d(LOG_TAG, "Die Tabelle wird mit SQL-Befehl: " + SQL_CREATE + " angelegt.");
            db.execSQL(SQL_CREATE);
        }
        catch (Exception ex) {
            Log.e(LOG_TAG, "Fehler beim Anlegen der Tabelle: " + ex.getMessage());
        }
    }

    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion){

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){

    }




}

And my DataSource.class

package uni_hannover.sportapp;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import android.content.ContentValues;
import android.database.Cursor;
import java.util.ArrayList;
import java.util.List;
import android.database.SQLException;


public class CyclingMemoDataSource {

    private static final String LOG_TAG =
            CyclingMemoDataSource.class.getSimpleName();

    private SQLiteDatabase database;
    private CyclingMemoDBHelper dbHelper;

    private String[] columns = {
            CyclingMemoDBHelper.COLUMN_ID,
            CyclingMemoDBHelper.COLUMN_NDA,
            CyclingMemoDBHelper.COLUMN_Startpunkt,
            CyclingMemoDBHelper.COLUMN_Age,
            CyclingMemoDBHelper.COLUMN_Geschlecht,
            CyclingMemoDBHelper.COLUMN_Dauer,
            CyclingMemoDBHelper.COLUMN_Geschwindigkeit,
            CyclingMemoDBHelper.COLUMN_Streckenprofil,
            CyclingMemoDBHelper.COLUMN_Distanz

    };



    public CyclingMemoDataSource (Context context){

        dbHelper = new CyclingMemoDBHelper(context);
    }

    public void open() throws SQLException {
        database = dbHelper.getWritableDatabase();
    }

    public void close() {
        dbHelper.close();
        Log.d(LOG_TAG, "Datenbank mit Hilfe des DbHelpers geschlossen.");
    }

    public CyclingMemo createCyclingMemo(String NDA, String Startpunkt, String Age, String Geschlecht, String Dauer,
                                         String Geschwindigkeit, String Streckenprofil, String Distanz) {
        ContentValues values = new ContentValues();

        values.put(CyclingMemoDBHelper.COLUMN_NDA, NDA);
        values.put(CyclingMemoDBHelper.COLUMN_Startpunkt, Startpunkt);
        values.put(CyclingMemoDBHelper.COLUMN_Age, Age);
        values.put(CyclingMemoDBHelper.COLUMN_Geschlecht, Geschlecht);
        values.put(CyclingMemoDBHelper.COLUMN_Dauer, Dauer);
        values.put(CyclingMemoDBHelper.COLUMN_Geschwindigkeit, Geschwindigkeit);
        values.put(CyclingMemoDBHelper.COLUMN_Streckenprofil, Streckenprofil);
        values.put(CyclingMemoDBHelper.COLUMN_Distanz, Distanz);


        long insertId = database.insert(CyclingMemoDBHelper.TABLE_CYCLING, null, values);

        Cursor cursor = database.query(CyclingMemoDBHelper.TABLE_CYCLING,
                columns, CyclingMemoDBHelper.COLUMN_ID + "=" + insertId,
                null, null, null, null);

        cursor.moveToFirst();
        CyclingMemo shoppingMemo = cursorToCyclingMemo(cursor);
        cursor.close();

        return shoppingMemo;

    }

    private CyclingMemo cursorToCyclingMemo(Cursor cursor) {


        int idIndex =
                cursor.getColumnIndex(CyclingMemoDBHelper.COLUMN_ID);
        int idNDA =
                cursor.getColumnIndex(CyclingMemoDBHelper.COLUMN_NDA);
        int idStartpunkt =
                cursor.getColumnIndex(CyclingMemoDBHelper.COLUMN_Startpunkt);
        int idAge =
                cursor.getColumnIndex(CyclingMemoDBHelper.COLUMN_Age);
        int idGeschlecht =
                cursor.getColumnIndex(CyclingMemoDBHelper.COLUMN_Geschlecht);
        int idDauer =
                cursor.getColumnIndex(CyclingMemoDBHelper.COLUMN_Dauer);
        int idGeschwindigkeit =
                cursor.getColumnIndex(CyclingMemoDBHelper.COLUMN_Geschwindigkeit);
        int idStreckenprofil =
                cursor.getColumnIndex(CyclingMemoDBHelper.COLUMN_Streckenprofil);
        int idDistanz =
                cursor.getColumnIndex(CyclingMemoDBHelper.COLUMN_Distanz);

        String NDA = cursor.getString(idNDA);
        String Startpunkt = cursor.getString(idStartpunkt);
        String Age = cursor.getString(idAge);
        String Geschlecht = cursor.getString(idGeschlecht);
        String Dauer = cursor.getString(idDauer);
        String Geschwindigkeit = cursor.getString(idGeschwindigkeit);
        String Streckenprofil = cursor.getString(idStreckenprofil);
        String Distanz = cursor.getString(idDistanz);
        long id = cursor.getLong(idIndex);



        CyclingMemo cyclingMemo2 = new CyclingMemo(NDA, Startpunkt, Age, Geschlecht, Dauer, Geschwindigkeit, Streckenprofil, Distanz, id);

        return cyclingMemo2;
    }

    public List<CyclingMemo> getAllCyclingMemos() {
        List<CyclingMemo> cyclingMemoList = new ArrayList<>();

        Cursor cursor = database.query(CyclingMemoDBHelper.TABLE_CYCLING,
                columns, null, null, null, null, null);



        cursor.moveToFirst();
        CyclingMemo cyclingMemo2;

        while(!cursor.isAfterLast()) {
            cyclingMemo2 = cursorToCyclingMemo(cursor);
            cyclingMemoList.add(cyclingMemo2);
            Log.d(LOG_TAG, "ID: " + cyclingMemo2.getId() + ", Inhalt: " + cyclingMemo2.toString());
            cursor.moveToNext();
        }

        cursor.close();

        return cyclingMemoList;
    }



}

Aucun commentaire:

Enregistrer un commentaire