2016-03-29 7 views
2

Ich bin von meinem Listview Mühe Laden von Daten mit, die ich mit meiner CharacterSheetDBHelper bevölkert haben. Ich habe versucht, nach mehreren Antworten zu suchen, einschließlich SimpleCursorAdapter, aber ich habe immer noch Probleme. Kann mich jemand dazu in die richtige Richtung lenken? Ich möchte auf ein Listenelement klicken und dann das Formular mit den Daten ausfüllen, die in der Datenbank zur Bearbeitung gespeichert sind.Listview und OnItemClick mit SQLite Verwenden von Daten zu laden

Mein Code unten:

Die LoadCharacter Klasse

public class LoadCharacter extends AppCompatActivity { 
TextView testView; 
ListView charListView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.load_character); 
    CharacterDBHelper db = new CharacterDBHelper(getApplicationContext()); 
    charListView = (ListView) findViewById(R.id.charListView); 

    //get list of names from the Database helper. 
    List<String> names = new ArrayList<>(db.getNames()); 

    //attempting to create a listAdapter 
    ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, names); 
    charListView.setAdapter(adapter); 
    charListView.setTextFilterEnabled(true); 
    charListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 

     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Intent passIntent = new Intent(getApplicationContext(), CreateCharacter.class); 

      //Logically onItemClick would open up a game in progress rather than the character sheet screen. 
      //I was going to load character data into the Create Character class as an example. 
      //This is not working right now. 
      //Cursor c= (Cursor)charListView.getItemAtPosition(position); 
      //passIntent.putExtra("Characters", c.getColumn); 
      startActivity(passIntent); 

     } 
    }); 

} 
public boolean onCreateOptionsMenu(Menu menu){ 
    menu.add(0,0,0, "New Character"); 
    return(super.onCreateOptionsMenu(menu)); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if(item.getItemId()==0){ 
     Intent intent = new Intent(this, CreateCharacter.class); 
     startActivity(intent); 
    } 

    return super.onOptionsItemSelected(item); 
    } 
} 

Meine CharacterDBHelper Klasse:

public class CharacterDBHelper extends SQLiteOpenHelper { 
private static final String DB_NAME = "char.db"; 
private static final int DATABASE_VERSION = 1; 
private SQLiteDatabase charDB = null; 

public CharacterDBHelper(Context context) { 
    super(context, DB_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    //Create database 
    String CREATE_CHAR_TABLE = "CREATE TABLE IF NOT EXISTS Characters(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, " + 
      "brawling TEXT NOT NULL, highflying TEXT NOT NULL, technical TEXT NOT NULL, startinghealth TEXT NOT NULL," + 
      "remainingpoints TEXT NOT NULL)"; 
    db.execSQL(CREATE_CHAR_TABLE); 

} 

public List<String> getNames(){ 
    List<String> names = new ArrayList<>(); 
    SQLiteDatabase db = this.getReadableDatabase(); 
    //Read from database and get ALL entries by name. 
    Cursor cursor = db.rawQuery("SELECT * FROM Characters", null); 

    if (cursor.moveToFirst()){ 
     do { 
      //add extracted names to array. 
      names.add(cursor.getString(cursor.getColumnIndex("name"))); 
     }while(cursor.moveToNext()); 
    } 
    //close cursor and database. 
    cursor.close(); 
    db.close(); 

    return names; 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS Characters"); 
    onCreate(db); 
} 

public void insertData(String name, String brawl, String flying, String tech, String health, String points){ 
    SQLiteDatabase charDB = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put("name", name); 
    values.put("brawling", brawl); 
    values.put("highflying", flying); 
    values.put("technical", tech); 
    values.put("startinghealth", health); 
    values.put("remainingpoints", points); 

    //row insert 
    charDB.insert("Characters", null, values); 
    charDB.close(); 
} 
} 

Antwort

0

Ich glaube, dass Sie sehen, wie Sie Probleme mit der Absicht Extras haben. Hier ist und Beispiel für das Hinzufügen von einigen von einem Cursor, von innerhalb OnItemClickListener: -

intent.putExtra("Caller", THIS_ACTIVITY + "Update"); 
    intent.putExtra("AisleID", aisleadapter.getCursor().getString(ShopperDBHelper.AISLES_COLUMN_ID_INDEX)); 
    intent.putExtra("AISLEID", aisleadapter.getCursor().getLong(ShopperDBHelper.AISLES_COLUMN_ID_INDEX)); 
    intent.putExtra("AisleName", aisleadapter.getCursor().getString(ShopperDBHelper.AISLES_COLUMN_NAME_INDEX)); 
    intent.putExtra("AisleOrder", aisleadapter.getCursor().getString(ShopperDBHelper.AISLES_COLUMN_ORDER_INDEX)); 
    intent.putExtra("AisleShopRef", aisleadapter.getCursor().getString(ShopperDBHelper.AISLES_COLUMN_SHOP_INDEX)); 
    intent.putExtra("SHOPID", aisleadapter.getCursor().getLong(ShopperDBHelper.AISLES_COLUMN_SHOP_INDEX)); 
    startActivity(intent); 

Hinweis! ShopperDBHelper.AISLES_COLUMN _ ?????? _ INDEX entspricht dem Offset innerhalb des Cursors der Spalte.

Hier ist ein Beispiel von innerhalb der begann actvity von der Absicht, das Abrufen: -

shopid = getIntent().getLongExtra("SHOPID", -1) 

Hinweis Cursor sollte auf die entsprechende Position eingestellt werden. Allerdings konnte Sie immer cursor.moveToPosition(position)

Hier ist ein Beispiel Cursor: -

package mjt.shopper; 

import android.content.Context; 
import android.database.Cursor; 
import android.support.v4.content.ContextCompat; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.CursorAdapter; 
import android.widget.TextView; 

/** 
* Created by Mike092015 on 6/02/2016. 
     */ 
class AislesCursorAdapter extends CursorAdapter { 
    public AislesCursorAdapter(Context context, Cursor cursor, int flags) { 
     super(context, cursor, 0); 
    } 
    @Override 
    public View getView(int position, View convertview, ViewGroup parent) { 
     View view = super.getView(position, convertview, parent); 
     Context context = view.getContext(); 
     if (position % 2 == 0) { 
      view.setBackgroundColor(ContextCompat.getColor(context, R.color.colorlistviewroweven)); 
     } else { 
      view.setBackgroundColor(ContextCompat.getColor(context, R.color.colorlistviewrowodd)); 
     } 
     return view; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     TextView textviewaisleid = (TextView) view.findViewById(R.id.aisle_id_entry); 
     TextView textviewaislename = (TextView) view.findViewById(R.id.aisle_name_entry); 
     TextView textviewaisleorder = (TextView) view.findViewById(R.id.aisle_order_entry); 
     TextView textviewaisleshopref = (TextView) view.findViewById(R.id.aisle_shopref_entry); 

     textviewaisleid.setText(cursor.getString(ShopperDBHelper.AISLES_COLUMN_ID_INDEX)); 
     textviewaislename.setText(cursor.getString(ShopperDBHelper.AISLES_COLUMN_NAME_INDEX)); 
     textviewaisleorder.setText(cursor.getString(ShopperDBHelper.AISLES_COLUMN_ORDER_INDEX)); 
     textviewaisleshopref.setText(cursor.getString(ShopperDBHelper.AISLES_COLUMN_SHOP_INDEX)); 
    } 
    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     return LayoutInflater.from(context).inflate(R.layout.activity_aisle_list_entry, parent, false); 
    } 
} 

Hinweis. Bindview (stellen Sie die Listenansicht der Linie/item/entry Ansichten mit Werten) und NewView (sagen Sie den Adapter, welche das Layout verwenden) sind erforderlich.

getView optional ist (hier, um alternative Reihe Hintergrund verwendet)

+0

leider nur bemerkt nur, dass Sie eine Arraylist verwenden, so anstatt GetCursor(). Du würdest die Daten von Namen bekommen. Variable ** Position ** ist das entsprechende Element/Index der Arraylist. – MikeT

+0

Vielleicht in Betracht ziehen mit Cursor, müssen Sie nicht in Array konvertieren. Sie müssen jedoch einen benutzerdefinierten Cursoradapter oder den einfachen Cursoradapter verwenden. Persönlich bin ich mehr als zufrieden mit dem ersten. Ich habe den simplecursoradapter nie benutzt. Ein potenzielles Problem mit Cursorn ist jedoch, dass sie offen sein müssen, damit ListView sie verwenden kann. – MikeT

+0

Ich glaube, der einfache Cursor hat mich verwirrt. Haben Sie ein Beispiel für einen benutzerdefinierten Cursor-Adapter für diesen Fall? – bespookie

Verwandte Themen