簡體   English   中英

為什么我的列表項沒有顯示在 listView 上

[英]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;
  • 你可以在你最喜歡的 SQLite 工具中運行(使用 Navicat)

結果輸出(光標中的內容)是:-

在此處輸入圖像描述

可以看出,如果時間實際上存儲為 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

    • 捕獲和捕獲 SQLite 錯誤可以很容易地掩蓋問題


例子



根據您的代碼,但使用:-

  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM