[英]Populating a ListView with an ArrayList Adapter isn't working - items are there but not being displayed
[英]Why my list items not being displayed on listView
我创建了一个列表视图,我想从 sqlite 数据库中检索项目。 因此,我创建了一个名为getrequestitems
的 List 方法,我将在其中映射详细信息并添加到 arraylist。
public List<Map<String, String>> getrequestitems() {
List<Map<String, String>> data = null;
data = new ArrayList<Map<String, String>>();
try {
SQLiteDatabase db = dbHandler.getReadableDatabase();
String sql = "SELECT * from request WHERE time > date('now','-1 day')";
Cursor rs = db.rawQuery(sql,null);
if(rs.moveToFirst()) {
do {
Map<String, String> dtname = new HashMap<String, String>();
dtname.put("bloodgrp", rs.getString(rs.getColumnIndex("bloodgrp")));
dtname.put("date", "Date:- " + rs.getString(rs.getColumnIndex("Datetime1")));
dtname.put("time", "Time:- " + rs.getString(rs.getColumnIndex("time")));
dtname.put("name", "Name:- " + rs.getString(rs.getColumnIndex("Name")));
dtname.put("Username", rs.getString(rs.getColumnIndex("Username")));
data.add(dtname);
}
while (rs.moveToNext());
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
return data;
}
但是当我打开该活动时,它没有显示任何记录。 我已经调试了代码,但不能有任何异常。 我写错了查询? as "SELECT * from request WHERE time > date('now','-1 day')";
这是我的完整代码。
public class request extends AppCompatActivity {
SimpleAdapter ad;
TextView list3;
private SlidrInterface slidr;
private DBHandler dbHandler;
private static ArrayList<String> arrayList = new ArrayList<>();
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_request);
slidr = Slidr.attach(this);
slidr.unlock();
dbHandler = new DBHandler(this);
list3 = findViewById(R.id.list3);
TextView txt = findViewById(R.id.list4);
ListView lst1 = (ListView) findViewById(R.id.list2);
List<Map<String, String>> MyDataList = null;
MyDataList = getrequestitems();
String[] from = {"bloodgrp", "date", "time", "name", "Username"};
int[] to = {R.id.listt, R.id.date, R.id.time1, R.id.name3, R.id.user};
ad = new SimpleAdapter(request.this, MyDataList, R.layout.listrequest, from, to);
lst1.setAdapter(ad);
lst1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
List<Map<String, String>> MyDataList1 = null;
MyDataList1 = getrequestitems();
String[] from = {"Username"};
int[] to = {R.id.user};
Toast.makeText(getApplicationContext(), MyDataList1.toString(), Toast.LENGTH_SHORT).show();
ad = new SimpleAdapter(request.this, MyDataList1, R.layout.listrequest, from, to);
if(ad.getCount()==0){
Toast.makeText(getApplicationContext(), "No requests are currently visible", Toast.LENGTH_SHORT).show();
}
HashMap<String, String> obj = (HashMap<String, String>) ad.getItem(i);
String name = (String) obj.get("Username");
try {
SQLiteDatabase db = dbHandler.getReadableDatabase();
String sql = "select * from request where Username = '" + name + "'";
Cursor rs = db.rawQuery(sql,null);
if (rs.moveToFirst()) {
do {
runOnUiThread(new Runnable() {
@SuppressLint("Range")
@Override
public void run() {
try {
final AlertDialog.Builder alert = new AlertDialog.Builder(request.this);
View mView = getLayoutInflater().inflate(R.layout.custom_dialog3, null);
final TextView txt_inputText = (TextView) mView.findViewById(R.id.name1);
txt_inputText.setText(rs.getString(rs.getColumnIndex("Name")));
final TextView txt_inputText2 = (TextView) mView.findViewById(R.id.contactno1);
txt_inputText2.setText(rs.getString(rs.getColumnIndex("contactNo")));
final TextView txt_inputText3 = (TextView) mView.findViewById(R.id.message1);
txt_inputText3.setText(rs.getString(rs.getColumnIndex("message")));
Button btn_cancel = (Button) mView.findViewById(R.id.btn_cancel);
Button btn_okay = (Button) mView.findViewById(R.id.btn_okay);
alert.setView(mView);
final AlertDialog alertDialog = alert.create();
alertDialog.setCanceledOnTouchOutside(false);
btn_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
alertDialog.dismiss();
}
});
btn_okay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String number = txt_inputText2.getText().toString();
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + number));// Initiates the Intent
startActivity(intent);
alertDialog.dismiss();
}
});
alertDialog.show();
alertDialog.getWindow().setLayout(730, 850); //Controlling width and height.
} catch (Exception e) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
}
});
}while (rs.moveToNext());
}
} catch (Exception e) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_LONG).show();
}
});
}
}
});
}
@SuppressLint("Range")
public List<Map<String, String>> getrequestitems() {
List<Map<String, String>> data = null;
data = new ArrayList<Map<String, String>>();
try {
SQLiteDatabase db = dbHandler.getReadableDatabase();
String sql = "SELECT * from request WHERE time > date('now','-1 day')";
Cursor rs = db.rawQuery(sql,null);
if(rs.moveToFirst()) {
do {
Map<String, String> dtname = new HashMap<String, String>();
dtname.put("bloodgrp", rs.getString(rs.getColumnIndex("bloodgrp")));
dtname.put("date", "Date:- " + rs.getString(rs.getColumnIndex("Datetime1")));
dtname.put("time", "Time:- " + rs.getString(rs.getColumnIndex("time")));
dtname.put("name", "Name:- " + rs.getString(rs.getColumnIndex("Name")));
dtname.put("Username", rs.getString(rs.getColumnIndex("Username")));
data.add(dtname);
}
while (rs.moveToNext());
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
return data;
}
}
但是当我打开该活动时,它没有显示任何记录。 我已经调试了代码,但不能有任何异常。 我写错了查询?
可能因为您似乎很可能比较轶事的橙子和苹果(请参阅解释/示例),也就是说,您猜测您正在比较时间和日期(请参阅下面的可能修复,但这在很大程度上取决于您的实际情况存储在时间列中,请参阅下面的可能的调试操作,这将允许您查看 a) 如果您正在提取任何数据,并且如果应用 get all(无 WHERE 子句)来查看实际的基础数据)
格式为 yyyy-MM-dd –
看到您有一个日期列和一个时间列,这似乎不太可能,或者如果不是浪费的话。
例如,如果时间仅包含时间 hh:mm 甚至 hh:mm:ss,则提取日期将导致意外结果。
考虑以下突出您可能遇到的问题:-
DROP TABLE IF EXISTS request;
CREATE TABLE IF NOT EXISTS request (booldgrp TEXT, Datetime1 TEXT, time TEXT, Name TEXT, Username TEXT);
INSERT INTO request VALUES
('O','2023-01-01 10:10','2023-01-01 10:10','FRED','USER001')
,('O','2023-01-01 10:10','10:10','FRED','USER002')
,('O','2023-01-01 10:10','2023-01-01 23:11','FRED','USER003')
,('O','2023-01-01 10:10','23:59','FRED','USER004')
,('O','2023-01-01 10:10','21:59','FRED','USER005')
,('O','2023-01-01 10:10','22:00','FRED','USER006')
,('O','2023-01-01 10:10','20:00','FRED','USER007')
,('O','2023-01-01 10:10','20:01','FRED','USER008')
,('O','2023-01-01 10:10','19:59:59','FRED','USER009')
;
SELECT *, date('now','-1 day') AS comparedate, time > date('now','-1 day') AS comparison FROM request;
SELECT *, date('now','-1 day') AS comparedate, datetime1 > date('now','-1 day') AS comparison FROM request;
DROP table IF EXISTS request;
结果输出(光标中的内容)是:-
可以看出,如果时间实际上存储为 hh:mm 或 hh:mm:ss (或类似的,你只有时间而不是日期) ,那么前 2 个字符很重要,所以如果当前日期的年份- 1 天是在 21 世纪,只会选择晚上 8 点( 20 :00)或更长的时间。
可能的修复(如果日期列只有日期或日期和时间并且时间列有时间)也许你想要"SELECT * from request WHERE datetime1 > date('now','-1 day')"
可能的调试操作
如果上述方法不能解决您的情况,请考虑将您的代码更改为:-
SQLiteDatabase db = dbHandler.getReadableDatabase();
String sql = "SELECT * from request /* WHERE time > date('now','-1 day') */"; // <<<<<<<<<< WHERE clause commented out to get ALL data, try also with WHERE clause */
Cursor rs = db.rawQuery(sql,null);
DatabaseUtils.dumpCursor(rs); /* ADDED FOR DEBUG, run and check the LOG */
if(rs.moveToFirst()) {
日志将包括类似(提取数据的位置):-
2022-07-19 13:21:50.995 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@31816bf
2022-07-19 13:21:50.996 I/System.out: 0 {
2022-07-19 13:21:50.996 I/System.out: bloodgrp=O
2022-07-19 13:21:50.996 I/System.out: Datetime1=2023-01-01
2022-07-19 13:21:50.996 I/System.out: time=10:30
2022-07-19 13:21:50.996 I/System.out: Name=FRED
2022-07-19 13:21:50.996 I/System.out: Username=USER001
2022-07-19 13:21:50.996 I/System.out: }
2022-07-19 13:21:50.996 I/System.out: <<<<<
或(未提取数据的情况下):-
2022-07-19 13:24:12.216 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@30380ea
2022-07-19 13:24:12.217 I/System.out: <<<<<
笔记
getColumnIndex
索引方法是区分大小写的(或至少是区分大小写的),因此如果任何列名不匹配,即使只是由于大小写,那么捕获的异常行 0 列 -1也将不产生任何结果(仅一会儿用吐司注意到这一点)。 我会建议:-
使用常量作为列名,并且总是使用这些常量来引用列名,即每个列名只硬编码一次。 不正确的变量名称将无法编译。 编码不正确的列名将很容易编译并且可能不会被注意到。
考虑使用e.printStackTrace()
以及甚至代替 Toast
例子
根据您的代码,但使用:-
DBhandler和布局由可以从您的代码中收集到的内容和
在创建数据库时插入一行:-
public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" + REQUEST_COLUMN_BLOODGROUP + " TEXT" + "," + REQUEST_COLUMN_DATE + " TEXT" + "," + REQUEST_COLUMN_TIME + " TEXT" + "," + REQUEST_COLUMN_NAME + " TEXT " + "," + REQUEST_COLUMN_USERNAME + " TEXT" + "," + REQUEST_COLUMN_CONTACTNo + " TEXT" + "," + REQUEST_COLUMN_MESSAGE + " TEXT" + ")"); ContentValues cv = new ContentValues(); cv.put(REQUEST_COLUMN_BLOODGROUP,"O"); cv.put(REQUEST_COLUMN_DATE,"2023-01-01"); cv.put(REQUEST_COLUMN_TIME,"10:30"); cv.put(REQUEST_COLUMN_NAME,"FRED"); cv.put(REQUEST_COLUMN_USERNAME,"USER001"); cv.put(REQUEST_COLUMN_CONTACTNo,"0000000000"); cv.put(REQUEST_COLUMN_MESSAGE,"MESSAGE X"); db.insert(TABLE_NAME,null,cv); }
使用 Request(更改为大写)Activity 直接从 MainActivity 启动
并将可能的修复应用于 WHERE 子句(即用于比较的日期时间列而不是时间列)
带有青色背景的 ListView(为了区分它)
然后在运行时:-
然后当单击该项目时:-
如果单击确定:-
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.