我正在使用一个包含两列的表填充RecyclerView,它基本上是一个字典,当我调用该方法开始填充异常情况时,代码会忽略第一列中具有相同值的行" COL1"然后得到最后一个并移动到下一个等等
JAVA
public void fetchData()
{
db =new DataBaseHelper(getContext());
try {
db.createDataBase();
db.openDataBase();
}
catch (Exception e)
{
e.printStackTrace();
}
namelist=new LinkedHashMap<>();
int ii;
SQLiteDatabase sd = db.getReadableDatabase();
Cursor cursor = sd.query("dictionary_lib" ,null, null, null, null, null, null);
ii=cursor.getColumnIndex("English_lib");
eng_list=new ArrayList<String>();
nor_list= new ArrayList<String>();
while (cursor.moveToNext()){
namelist.put(cursor.getString(ii), cursor.getString(cursor.getColumnIndex("German_lib")));
}
Iterator entries = namelist.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry thisEntry = (Map.Entry) entries.next();
eng_list.add(String.valueOf(thisEntry.getKey()));
german_list.add(String.valueOf(thisEntry.getValue()));
}
for (int i = 0; i < eng_list.size(); i++) {
data.add(new DictObjectModel(eng_list.get(i), german_list.get(i)));
}
adapter = new CustomAdapter(data);
rv.setAdapter(adapter);
}
数据库的例子
这里的recyclerview将忽略前两行alpha并打印第三行并移动到下一行
答案 0 :(得分:1)
这实际上很可能是因为您将值放在 LinkedHashMap
中,该{{3}}实现了地图接口的状态
将键映射到值的对象。地图不能包含重复的键;每个键最多可以映射一个值。
您正在此处检索重复的密钥:
while (cursor.moveToNext()){
namelist.put(cursor.getString(ii), cursor.getString(cursor.getColumnIndex("German_lib")));
}
因此,当密钥"alpha"
重复时,前两个示例值将替换为映射。
要验证这一点,您可以打印出来或跳过上面循环中的值。
解决此问题的一种方法是创建自己的java对象:
public class Example
{
public String col1; // but appropriate names
public String col2;
// Add constructors or getters and setting if you want private members
}
然后在循环中使用Arraylist
List<Example> rows = new ArrayList<>;
while (cursor.moveToNext()){
Example e = new Example();
e.col1 = cursor.getString(ii);
e.col2 = cursor.getString(cursor.getColumnIndex("German_lib"))
rows.add(e)
}
修改强>
您正在创建多个循环以获得相同的结果。所以你可以在光标循环中放入
data.add(new DictObjectModel(cursor.getString(ii), cursor.getString(cursor.getColumnIndex("German_lib")));