2017-10-16 113 views
-1

我是新来的Java,Android和SQLite,坦率地说,我很惊讶,我已经得到了这一点。TextViews没有从SQLite数据库中填充数据RecyclerView

我想为我的盆景集合创建一个简单的编目应用程序,该应用程序在MainActivity上的RecyclerView中显示我的集合摘要。

我有数据库的工作,我可以添加项目(通过数据库浏览器检查SQLite)。我遇到的麻烦是在RecyclerView中显示这些数据。目前它只是显示laucher图标占位符图像,而不是用来自数据库的数据填充TextView。 RecyclerView中显示的视图数与数据库中的条目数相对应。

我不知道我在做什么错,所以任何帮助将不胜感激。

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; 
    } 
} 
012在activity_main.xml中

RecyclerView对象

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

TextViews和图像查看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"/> 

什么在MainActivity目前看起来像截图:

enter image description here

任何其他信息需要的,只是问,我会尽量张贴它。

+0

当你叫也更新了这个'notifyDataSetChanged()'您的适配器?我想你应该在将新项目从数据库加载到列表后调用它。有关更多信息,请参见https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyDataSetChanged()。 – deHaar

+0

请阅读如何编写[最小,完整和可验证示例](https://stackoverflow.com/help/mcve) –

+0

@Jozef Dochan - 抱歉,我没有看到,我认为更多的信息/上下文将是更好。稍后我会尝试编辑代码。 – AvieRose

回答

0

排序出来,现在看起来很简单,我现在看它。

在Cursor中,我复制并粘贴第一行后,没有将项目设置器更改为正确的项目名称。

而且我被识别ID列作为一个字符串,它应该是一个整数 - 在数据模型类

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