2017-10-16 5 views
-1

Je suis nouveau sur Java, Android et SQLite, alors franchement, je suis étonné d'avoir été aussi loin.TextViews ne se remplit pas avec les données de la base de données SQLite dans RecyclerView

J'essaye de créer une application de catalogage simple pour ma collection de bonsaï qui montre un résumé de ma collection dans un RecyclerView sur MainActivity.

J'ai la base de données qui fonctionne, en ce que je peux y ajouter des éléments (vérifié par DB Browser pour SQLite). Le problème que j'ai est d'afficher ces données dans le RecyclerView. Actuellement, il affiche simplement l'image de l'espace réservé de l'icône laucher et ne remplit pas les TextView avec les données de la base de données. Le nombre de vues affichées dans RecyclerView correspond au nombre d'entrées dans la base de données.

Je ne suis pas sûr de ce que je fais mal, donc toute aide serait grandement appréciée.

MainActivity.java

Datasource mDataSource; 
Button btnAddNew; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mDataSource = new Datasource(this); 
    mDataSource.open(); 

    List<DataModel> listFromDB = mDataSource.getAllItems(); 
    DataItemAdapter adapter = new DataItemAdapter(this, listFromDB); 

    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvItems); 
    recyclerView.setAdapter(adapter); 

    btnAddNew = (Button) findViewById(R.id.btnInsert); 
} 

DataModel.Java

public class DataModel { 

private String itemId; 
private String itemName; 
private String itemCommonName; 

public DataModel() { 
} 

public String getItemId() { 
    return itemId; 
} 

public void setItemId(String itemId) { 
    this.itemId = itemId; 
} 

public String getItemName() { 
    return itemName; 
} 

public void setItemName(String itemName) { 
    this.itemName = itemName; 
} 

public String getItemCommonName() { 
    return itemCommonName; 
} 

public void setItemCommonName(String itemCommonName) { 
    this.itemCommonName = itemCommonName; 
} 

Datasource.java

public class Datasource { 

private Context mContext; 
private SQLiteDatabase mDatabase; 
SQLiteOpenHelper mDbHelper; 

public Datasource(Context context){ 
    this.mContext = context; 
    mDbHelper = new DatabaseHelper(mContext); 
    mDatabase = mDbHelper.getWritableDatabase(); 
} 

public void open(){ 
    mDatabase = mDbHelper.getWritableDatabase(); 
} 

public void close(){ 
    mDatabase.close(); 
} 

public boolean insertData(String name, String commonName, String scientificName){ 
    SQLiteDatabase db = mDbHelper.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(COL_NAME, name); 
    contentValues.put(COL_COMMON_NAME, commonName); 
    contentValues.put(COL_SCI_NAME, scientificName); 
    long result = db.insert(DATABASE_TABLE, null, contentValues); 
    db.close(); 

    if(result == -1) { 
     return false; 
    }else{ 
     return true; 
    } 
} 

public List<DataModel> getAllItems(){ 
    List<DataModel> dataModels = new ArrayList<>(); 
    Cursor cursor = mDatabase.query(DATABASE_TABLE, ItemsTable.ALL_COLUMNS, 
      null, null, null, null, null); 

    while (cursor.moveToNext()){ 
     DataModel item = new DataModel(); 
     item.setItemId(cursor.getString(
       cursor.getColumnIndex(ItemsTable.COL_ID))); 
     item.setItemId(cursor.getString(
       cursor.getColumnIndex(ItemsTable.COL_NAME))); 
     item.setItemId(cursor.getString(
       cursor.getColumnIndex(ItemsTable.COL_COMMON_NAME))); 
     item.setItemId(cursor.getString(
       cursor.getColumnIndex(ItemsTable.COL_SCI_NAME))); 
     dataModels.add(item); 
    } 
    return dataModels; 
} 

DataItemAdapter.java

public class DataItemAdapter extends RecyclerView.Adapter<DataItemAdapter.ViewHolder> { 

private List<DataModel> mItems; 
private Context mContext; 

public DataItemAdapter(Context context, List<DataModel> items) { 
    this.mContext = context; 
    this.mItems = items; 
} 

@Override 
public DataItemAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = LayoutInflater.from(mContext); 
    View itemView = inflater.inflate(R.layout.list_item, parent, false); 
    ViewHolder viewHolder = new ViewHolder(itemView); 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(DataItemAdapter.ViewHolder holder, int position) { 
    final DataModel item = mItems.get(position); 

     holder.tvName.setText(item.getItemName()); 
     holder.tvCommonName.setText(item.getItemCommonName()); 
} 

@Override 
public int getItemCount() { 
    return mItems.size(); 
} 

public static class ViewHolder extends RecyclerView.ViewHolder { 
    public TextView tvName, tvCommonName; 
    public ImageView ivProfilePic; 
    public View mView; 
    public ViewHolder(View itemView){ 
     super(itemView); 

     tvName = (TextView) itemView.findViewById(R.id.tvName); 
     tvCommonName = (TextView) itemView.findViewById(R.id.tvCommonName); 
     ivProfilePic = (ImageView) itemView.findViewById(R.id.ivProfilePic); 
     mView = itemView; 
    } 
} 

objet RecyclerView dans activity_main.xml

<android.support.v7.widget.RecyclerView 
    android:id="@+id/rvItems" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layoutManager="LinearLayoutManager"/> 

TextViews et voir l'image list_item.xml

<ImageView 
    android:id="@+id/ivProfilePic" 
    android:layout_width="75dp" 
    android:layout_height="75dp" 
    app:srcCompat="@mipmap/ic_launcher_round" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentStart="true" 
    android:contentDescription="Profile Pic" 
    tools:ignore="HardcodedText"/> 

<TextView 
    android:id="@+id/tvName" 
    android:layout_width="match_parent" 
    android:layout_height="40dp" 
    android:layout_marginStart="19dp" 
    android:layout_toEndOf="@+id/ivProfilePic" 
    android:text="TextView" 
    android:textSize="18sp" 
    android:visibility="visible"/> 

<TextView 
    android:id="@+id/tvCommonName" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:text="TextView" 
    android:visibility="visible"/> 

Capture d'écran de ce que le MainActivity ressemble actuellement:

enter image description here

Toute autre information requis, il suffit de demander et je vais essayer de le poster.

+0

Quand est-ce que vous appelez 'notifyDataSetChanged()' sur votre carte? Je pense que vous devriez l'appeler après avoir chargé les nouveaux éléments de la base de données à la liste. Voir https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyDataSetChanged() pour plus d'informations. – deHaar

+0

S'il vous plaît lire comment écrire [exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve) –

+0

@Jozef Dochan - désolé je n'avais pas vu cela, je supposais que plus d'informations/contexte serait meilleur. Je vais essayer d'éditer le code plus tard. – AvieRose

Répondre

0

Triez-le, semble si simple maintenant que je le regarde.

Dans le Curseur, je n'avais pas changé les setters à ceux qui étaient corrects après avoir copié et collé la première ligne, juste les noms des colonnes.

Aussi j'identifiait la colonne ID comme une chaîne, où il aurait dû être un entier - également mis à jour ce dans la classe DataModel

while (cursor.moveToNext()){ 
     DataModel item = new DataModel(); 
     item.setItemId(cursor.getInt(
       cursor.getColumnIndex(ItemsTable.COL_ID))); 
     item.setItemName(cursor.getString(
       cursor.getColumnIndex(ItemsTable.COL_NAME))); 
     item.setItemCommonName(cursor.getString(
       cursor.getColumnIndex(ItemsTable.COL_COMMON_NAME))); 
     item.setItemSciName(cursor.getString(
       cursor.getColumnIndex(ItemsTable.COL_SCI_NAME))); 
     dataModels.add(item); 
    } 
    return dataModels; 
}