2016-03-29 16 views
2

CharacterSheetDBHelperを使用して作成したリストビューからデータを読み込む際に問題があります。私はいくつかの答えを探してみました。一つはSimpleCursorAdapterを使っていますが、まだ問題があります。誰かが私にこの方向性を向けることができますか?私はリスト項目をクリックし、編集のためにデータベースに保存されたデータでフォームに記入したいと思います。リストビューとOnItemClickをSQLiteで使用してデータをロードする

以下

マイコード:

LoadCharacterクラス

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

マイCharacterDBHelperクラス:

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

答えて

0

私はあなたが意図エキストラを使って問題を抱えているように見えると信じています。ここだと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); 

注意! ShopperDBHelper.AISLES_COLUMN _ ?????? INDEXは、列のカーソル内のオフセットと同じです。ここで

が開始actvity以内意図から取得する例です: -

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

注カーソルが適切な位置に設定する必要があります。

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

注 - :しかし、あなたは常にここで例のCursorAdapterだcursor.moveToPosition(position)

を使用することができます。 bindView(Listviewの行/項目/エントリビューに値を設定)、newView(使用するレイアウトをアダプタに指示する)が必要です。

はgetViewメソッドは申し訳ありません

+0

(代替行の背景に、ここで使用される)オプションであるばかりには、ArrayListを使用してそうではなくはgetCursor()されていることに気づきました。名前からデータを取得します。変数**の位置**は、Arraylistのそれぞれの要素/インデックスになります。 – MikeT

+0

おそらく、あなたは配列に変換する必要はありませんカーソルを使用することを検討してください。ただし、カスタムカーソルアダプターまたはシンプルカーソルアダプターを使用する必要があります。個人的に私は前者を心地よくするよりもはるかに優れています。私はsimplecursoradapterを使ったことがありません。ただし、カーソルの潜在的な問題の1つは、リストビューを使用するためにカーソルを開いておく必要があることです。 – MikeT

+0

シンプルカーソルが私を混乱させていたと思います。この場合のカスタムカーソルアダプタの例はありますか? – bespookie

関連する問題