У меня есть метод, который при предоставлении идентификатора в качестве параметра возвращает коллекцию показаний счетчика для этого человека с этим идентификатором.Почему java.lang.IllegalArgumentException?
public List<VMeterReadings> GetIndividualReading(int id){
List<VMeterReadings> individual = new ArrayList<VMeterReadings>();
String selectQuery = " SELECT " + READINGDATEVIEW + "," + CurrentREADING + ","+ PrevREADINGDATE +","+ prevREADING +","+ UNITs+ ","+ RATE + ","+ AMOUNT + " FROM "
+ VIEW_DETAILEDREADING + " Where " + KEY_ID + " = "+id + " Order by " + READINGDATE + " DESC ";
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery(selectQuery, null);
if(c.moveToFirst()){
do{
VMeterReadings t =new VMeterReadings();
try {
t.setReadingDate(fm.parse(c.getString(c.getColumnIndex(READINGDATE))));
} catch (ParseException e) {
// TODO Auto-generated catch block
Log.e("parsing Reading date",e.toString());
}
t.setCurrentReading(c.getDouble(c.getColumnIndex(CurrentREADING)));
try {
t.setPreviousReadingDate(fm.parse(c.getString(c.getColumnIndex(PrevREADINGDATE))));
} catch (ParseException e) {
// TODO Auto-generated catch block
Log.e("parsing current reading",e.toString());
}
t.setPreviousMeterReading(c.getDouble(c.getColumnIndex(prevREADING)));
t.setUnits(c.getDouble(c.getColumnIndex(UNITs)));
t.setRate(c.getDouble(c.getColumnIndex(RATE)));
t.setAmount(c.getDouble(c.getColumnIndex(AMOUNT)));
individual.add(t);
} while(c.moveToNext());
}
c.close();
db.close();
return individual;
}
Моей целью является возможность вызова этого метода из класса, который предоставит идентификатор в его конструкторе. Я создал класс, и он расширяет BaseAdapter. Это потому, что я хочу загрузить возвращаемые данные в файл настраиваемого макета.
У меня есть файл xml.
Вот класс, который расширяет базовый адаптер.
package com.example.metermanager;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import meter.manager.helper.MyDatabaseAdapter;
import meters.model.VMeterReadings;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class IndividualReadings extends BaseAdapter {
@SuppressWarnings("unused")
private Context context;
private int id;
MyDatabaseAdapter db;
private static String DB_NAME="meterapp.sqlite";
private List<VMeterReadings> readings =new ArrayList<VMeterReadings>();
DecimalFormat df = new DecimalFormat("#,###,###,###");
SimpleDateFormat fm =new SimpleDateFormat("dd/MM/yyyy");
public IndividualReadings(Context context1, int myid) {
this.context=context1;
this.id=myid;
MyDatabaseAdapter db= new MyDatabaseAdapter(context1,DB_NAME);
readings=db.GetIndividualReading(myid);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return readings.size();
}
@Override
public Object getItem(int index) {
// TODO Auto-generated method stub
return getItem(index);
}
@Override
public long getItemId(int index) {
// TODO Auto-generated method stub
return index;
}
@Override
public View getView(int index, View view, ViewGroup parent) {
try{
if (view ==null){
LayoutInflater inflater=
LayoutInflater.from(parent.getContext());
view =inflater.inflate(R.layout.individual_reading,parent,false);
}
VMeterReadings reading =readings.get(index);
// testing whether data returned.
//correct data returned
Log.e("readingDtae",fm.format(reading.getReadingDate()));
Log.e("Reading",df.format(reading.getCurrentReading()));
Log.e("PreviousReadingDate",fm.format(reading.getPreviousReadingDate()));
Log.e("PreviousReading",df.format(reading.getPreviousMeterReading()));
TextView readingdateTextView =(TextView)
view.findViewById(R.id.textView8);
readingdateTextView.setText(fm.format(reading.getReadingDate()));
TextView currentreadingTextView =(TextView)
view.findViewById(R.id.textView9);
currentreadingTextView.setText(Double.toString((reading.getCurrentReading())));
TextView previoustreadingdateTextView =(TextView)
view.findViewById(R.id.textView10);
previoustreadingdateTextView.setText(df.format((reading.getPreviousReadingDate())));
TextView previousmeterReading =(TextView)
view.findViewById(R.id.textView11);
previousmeterReading.setText(Double.toString((reading.getPreviousMeterReading())));
TextView units =(TextView)
view.findViewById(R.id.textView12);
units.setText(Double.toString((((reading.getUnits())))));
TextView rate =(TextView)
view.findViewById(R.id.textView13);
rate.setText(Double.toString(reading.getRate()));
TextView amountTextView =(TextView)
view.findViewById(R.id.textView14);
amountTextView.setText(df.format((reading.getAmount())));
}catch(Exception e)
{
Log.e("Error loading data in listbox",e.toString());
}
return view;
}
}
В конструкторе
public IndividualReadings(Context context1, int myid) {
this.context=context1;
this.id=myid;
MyDatabaseAdapter db= new MyDatabaseAdapter(context1,DB_NAME);
readings=db.GetIndividualReading(myid);
}
Я хочу код вызова, чтобы поставить MyId параметр, который класс должен использовать при вызове метода, чтобы получить коллекцию счетчику ...
Пример того, как я называю класс, находится ниже в элементе управления spinner. Счетчик - это список арендаторов. Код получает идентификатор выбранного арендатора и подает его как iD для использования классом для получения коллекции и заполнения файла xml для отображения.
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
try{
int pos = spinner.getSelectedItemPosition();
// get the tenant selected in the list
TenantList tenant=(TenantList)readings.get(pos);
// get the ID
int id =tenant.get_id();
// instantiate the get individual readings class and pass the id as the parameter
IndividualReadings individualreadings;
individualreadings= new IndividualReadings(this,id);
ListView listview =(ListView)findViewById(R.id.reading_list);
listview.setBackgroundColor(color.holo_orange_dark);
listview.setAdapter(individualreadings);
} catch(Exception e)
{
Log.e("Spinner Error", e.toString());
}
Показания metere отображаются в элементе управления списком.
Я получаю ошибку, упомянутую в классе IndivualReadings в методе getView (который должен заполнять пользовательский вид данными). Любые идеи о том, как решить проблему?
Я до сих пор тестировал и обнаружил, что параметр id правильно передан и возвращены правильные данные.
Но я не понимаю, почему я получаю эту ошибку в методе getView.
Ronald
Вот Logcat записей
01-30 12:41:20.782: D/dalvikvm(387): GC_EXTERNAL_ALLOC freed 88K, 52% free 2622K/5379K, external 515K/517K, paused 102ms
01-30 12:41:20.802: E/Database(387): close() was never explicitly called on database 'data/data/com.example.metermanager/databases/meterapp.sqlite'
01-30 12:41:20.802: E/Database(387): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
01-30 12:41:20.802: E/Database(387): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1847)
01-30 12:41:20.802: E/Database(387): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
01-30 12:41:20.802: E/Database(387): at meter.manager.helper.MyDatabaseAdapter.openDataBase(MyDatabaseAdapter.java:191)
01-30 12:41:20.802: E/Database(387): at meter.manager.helper.MyDatabaseAdapter.<init>(MyDatabaseAdapter.java:102)
01-30 12:41:20.802: E/Database(387): at com.example.metermanager.IndividualReadings.<init>(IndividualReadings.java:32)
01-30 12:41:20.802: E/Database(387): at com.example.metermanager.MainActivity.onItemSelected(MainActivity.java:105)
01-30 12:41:20.802: E/Database(387): at android.widget.AdapterView.fireOnSelected(AdapterView.java:871)
01-30 12:41:20.802: E/Database(387): at android.widget.AdapterView.access$200(AdapterView.java:42)
01-30 12:41:20.802: E/Database(387): at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:837)
01-30 12:41:20.802: E/Database(387): at android.os.Handler.handleCallback(Handler.java:587)
01-30 12:41:20.802: E/Database(387): at android.os.Handler.dispatchMessage(Handler.java:92)
01-30 12:41:20.802: E/Database(387): at android.os.Looper.loop(Looper.java:123)
01-30 12:41:20.802: E/Database(387): at android.app.ActivityThread.main(ActivityThread.java:3683)
01-30 12:41:20.802: E/Database(387): at java.lang.reflect.Method.invokeNative(Native Method)
01-30 12:41:20.802: E/Database(387): at java.lang.reflect.Method.invoke(Method.java:507)
01-30 12:41:20.802: E/Database(387): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-30 12:41:20.802: E/Database(387): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-30 12:41:20.802: E/Database(387): at dalvik.system.NativeStart.main(Native Method)
01-30 12:41:22.862: E/readingDtae(387): 20/01/2014
01-30 12:41:22.862: E/Reading(387): 150
01-30 12:41:22.872: E/PreviousReadingDate(387): 10/01/2014
01-30 12:41:22.872: E/PreviousReading(387): 100
01-30 12:41:22.872: E/Error loading data in listbox(387): java.lang.IllegalArgumentException
01-30 12:41:22.903: E/readingDtae(387): 10/01/2014
01-30 12:41:22.903: E/Reading(387): 100
01-30 12:41:22.903: E/PreviousReadingDate(387): 01/01/2014
01-30 12:41:22.903: E/PreviousReading(387): 0
01-30 12:41:22.912: E/Error loading data in listbox(387): java.lang.IllegalArgumentException
01-30 12:41:22.923: E/readingDtae(387): 20/01/2014
01-30 12:41:22.933: E/Reading(387): 150
01-30 12:41:22.933: E/PreviousReadingDate(387): 10/01/2014
01-30 12:41:22.933: E/PreviousReading(387): 100
01-30 12:41:22.943: E/Error loading data in listbox(387): java.lang.IllegalArgumentException
01-30 12:41:23.063: V/Path(387): data/data/com.example.metermanager/databases/
01-30 12:41:23.063: V/name(387): meterapp.sqlite
01-30 12:41:23.063: E/CheckPath(387): data/data/com.example.metermanager/databases/meterapp.sqlite
01-30 12:41:23.242: D/Exits(387): Db Exist
01-30 12:41:23.412: E/readingDtae(387): 20/01/2014
01-30 12:41:23.412: E/Reading(387): 160
01-30 12:41:23.412: E/PreviousReadingDate(387): 10/01/2014
01-30 12:41:23.423: E/PreviousReading(387): 60
01-30 12:41:23.423: E/Error loading data in listbox(387): java.lang.IllegalArgumentException
01-30 12:41:23.452: E/readingDtae(387): 10/01/2014
01-30 12:41:23.462: E/Reading(387): 60
01-30 12:41:23.462: E/PreviousReadingDate(387): 01/01/2014
01-30 12:41:23.462: E/PreviousReading(387): 0
01-30 12:41:23.472: E/Error loading data in listbox(387): java.lang.IllegalArgumentException
01-30 12:41:23.483: E/readingDtae(387): 20/01/2014
01-30 12:41:23.483: E/Reading(387): 160
01-30 12:41:23.502: E/PreviousReadingDate(387): 10/01/2014
01-30 12:41:23.502: E/PreviousReading(387): 60
01-30 12:41:23.502: E/Error loading data in listbox(387): java.lang.IllegalArgumentException
01-30 12:41:23.523: E/readingDtae(387): 20/01/2014
01-30 12:41:23.523: E/Reading(387): 160
01-30 12:41:23.523: E/PreviousReadingDate(387): 10/01/2014
01-30 12:41:23.532: E/PreviousReading(387): 60
01-30 12:41:23.532: E/Error loading data in listbox(387): java.lang.IllegalArgumentException
Можете ли вы опубликовать stacktrace, пожалуйста? – lakshman
У вас есть только один код? Пожалуйста, подумайте, что SO хранит ненужную информацию. Также stacktrace? – Keerthivasan
Вот распечатка из Logcat. К сожалению, я получаю слишком много ошибок символов. я не могу опубликовать его! – user3079559