0

データベースからデータを取得し、AddDetails というクラスを使用して Arraylist に追加しました。AddDetails クラスでは、すべての値を割り当てています。次に、その ArrayList をアクティビティ クラスに送信し、そのデータを ListView に表示する必要があります。ArrayList から Array にデータをコピーしているときに、クラスが見つからないなどのエラーが発生したり、リスト ビューに表示しているときにガベージ値が表示されたりします。

コードは次のとおりです。

 private class SearchTask extends AsyncTask<Void, Void, Void>{
@Override
   protected Void doInBackground(Void... arg0) {
    // TODO Auto-generated method stub

     DatabaseHandler db = new DatabaseHandler();          

     String Place = etSearch.getText().toString();
     AddDetails details = new AddDetails(Place);
     alSearchResult = db.searchResultByPlace(details);
     arrStr = new String[alSearchResult.size()];

     try
     {
    arrStr = (String[]) alSearchResult.toArray();               
       ArrayAdapter<String> adapter = new ArrayAdapter<String>(SearchActivity.this,           android.R.layout.simple_list_item_multiple_choice, arrStr);

    lsSearchResult.setAdapter(adapter);
      }

      catch(Exception e)
      {
        Log.e("Error:" + e.toString());
      }


    return null;
}





 protected ArrayList<AddDetails> searchResultByPlace(AddDetails details)
{
ArrayList<AddDetails> alSearchData = null;
try
{
     String place = details.getPlace();

      Cursor c = mDataBase.rawQuery("SELECT * FROM " + ESTATE_DETAILS + " WHERE " +           strSearchType + " =  " + "'" + place + "'", null);
    c.moveToFirst();
    if(c.getCount() > 0)
    {
     alSearchData = new ArrayList<AddDetails>();
    if (c.moveToFirst()) 
    {
    do {
        details = new AddDetails();  
                    details.setID(Integer.parseInt(c.getString(0)));
            details.setPlace(c.getString(1));                        
                    details.setArea(c.getString(2));
            details.setType(c.getString(3));
            details.setPhoneNumber(c.getString(4));                                                                                                                                 

         // Adding contact to list
        alSearchData.add(details);
    } while (c.moveToNext());
   }

}

c.close();
}
catch(SQLException e)
{
Log.e("Error:", e.toString());
}

return alSearchData;

}

4

3 に答える 3

1

バックグラウンド スレッドで listView lsSearchResult にアクセスしないでください。結果を onPostExecute() に渡します。

次のコードを使用してみてください:

private class SearchTask extends AsyncTask<Void, Void, ArrayList<String>>{
@Override
   protected ArrayList<String> doInBackground(Void... arg0) {

     DatabaseHandler db = new DatabaseHandler();          

     String Place = etSearch.getText().toString();
     AddDetails details = new AddDetails(Place);
     alSearchResult = db.searchResultByPlace(details);

     return alSearchResult;
}

protected void onPostExecute(ArrayList<String> result) {
     ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(SearchActivity.this,android.R.layout.simple_list_item_1, result);
     lsSearchResult.setAdapter(arrayAdapter); 
}
于 2013-06-13T07:32:22.593 に答える
1

変化する

   arrStr = (String[]) alSearchResult.toArray();   

   arrStr = alSearchResult.toArray(new String[0]);
于 2013-06-13T07:23:21.703 に答える
0
ArrayList<String> stock_list = new ArrayList<String>();
    stock_list.add("stock1");
    stock_list.add("stock2");
    String[] stockArr = new String[stock_list.size()];
    stockArr = stock_list.toArray(stockArr);
    for(String s : stockArr)
        System.out.println(s);

これは、arraylist から array への変換に役立ちます。また、arraylist を arrayadapter で直接使用することもできます。配列に変換する必要はありません。

于 2013-06-13T07:23:11.577 に答える