2016-01-30 5 views
0

Я борется с заселением ListView в андроиде какое-то время. Может кто-нибудь, пожалуйста, дайте мне руку здесь?Android ListView Null Pointer exception

Итак, я сохранил данные в базе данных в 2 разных таблицах. Один для настроек и один для данных, которые будут отображаться в спискеView. Но, наблюдая за множеством учебников, у меня все время возникают проблемы с заполнением списка. Я даю вам код, и надеюсь, вы, ребята, можете помочь мне решить проблему.

MainActivity:

public class MainActivity extends AppCompatActivity { 
//private ArrayList<String> arrayList; 
public ListView viewEvents; 
DataHandler dataBase; 
private ListView listView; 
// SQLiteDatabase data; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    listView = (ListView) findViewById(R.id.ElementsView); 
    dataBase = new DataHandler(this); 
    showList(); 
} 

public void showList() { 

     try{ 
     ArrayList<ListDisplayItems> displayList = new ArrayList<ListDisplayItems>(); 
     //dataBase.open(); 
     displayList.clear(); 
     //String query = "SELECT * FROM " + DataHandler.DATABASE_TABLE_DISPLAY; 
     Cursor c1 = DataHandler.displayQuery(); 
    // Cursor c1 = data.rawQuery(query, null); 
     if (c1 != null && c1.getCount() != 0) { 
     if (c1.moveToFirst()) { 
     do { 
     ListDisplayItems listDisplayItems = new ListDisplayItems(); 

     listDisplayItems.SetTime(c1.getString(c1 
      .getColumnIndex(DataHandler.KEY_TIME_TEXT))); 
     listDisplayItems.SetName(c1.getString(c1 
      .getColumnIndex(DataHandler.KEY_NAME))); 
     listDisplayItems.SetDays(c1.getString(c1 
      .getColumnIndex(DataHandler.KEY_DAYS_OF_WEEK_TEXT))); 
     displayList.add(listDisplayItems); 

     } while (c1.moveToNext()); 
     } 
     } 
     c1.close(); 
     //dataBase.close(); 

     DisplayListAdapter displayListAdapter = new DisplayListAdapter(
     MainActivity.this, displayList); 
     listView.setAdapter(displayListAdapter); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 

DisplayListAdapter Класс:

DataHandler database; 
Context context; 
ArrayList<ListDisplayItems> displayList; 

public DisplayListAdapter(Context context, ArrayList<ListDisplayItems> list) { 
    this.context = context; 
    displayList = list; 
} 

@Override 
public int getCount() { 
    return displayList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return displayList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup arg2) { 
    ListDisplayItems displayItemsList = displayList.get(position); 

    if (convertView == null){ 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.item_layout, null); 
    } 
    TextView textTime = (TextView) convertView.findViewById(R.id.itextTime); 
    textTime.setText(displayItemsList.GetTime()); 
    TextView textName = (TextView) convertView.findViewById(R.id.itextName); 
    textName.setText(displayItemsList.GetName()); 
    TextView textDays = (TextView) convertView.findViewById(R.id.itextDays); 
    textDays.setText(displayItemsList.GetDays()); 


    return convertView; 
} 
} 

ListDisplayItems Класс:

public class ListDisplayItems { 

String iName; 
String iIconRing; 
String iIconAlarm; 
String iTimeText; 
String iDaysOfWeek; 

public String GetName() 
{ 
    return iName; 
} 

public void SetName(String Name) 
{ 
    this.iName = Name; 
} 

public String GetIconRing() 
{ 
    return iIconRing; 
} 

public void SetIconRing(String Icon) 
{ 
    this.iIconRing = Icon; 
} 

public String GetIconAlarm() 
{ 
    return iIconAlarm; 
} 

public void SetIconAlarm(String Icon) 
{ 
    this.iIconAlarm = Icon; 
} 

public String GetTime() 
{ 
    return iTimeText; 
} 

public void SetTime(String Time) 
{ 
    this.iTimeText = Time; 
} 

public String GetDays() 
{ 
    return iDaysOfWeek; 
} 

public void SetDays(String Days) 
{ 
    this.iDaysOfWeek = Days; 
} 
} 

И мой DataHandler Класс:

public class DataHandler{ 
public static final String KEY_EXAMPLE = "example_of_my_keys"; 

static DbHelper dbhelper; 
Context ctx; 
static SQLiteDatabase dataBase; 

public DataHandler(Context ctx){ 
    this.ctx = ctx; 
    dbhelper = new DbHelper(ctx); 
} 

public static Cursor displayQuery() { 
    Cursor c1 = null; 
     try { 

     if (dataBase.isOpen()) { 
     dataBase.close(); 

     } 
     String[] projection = { 
       KEY_NAME, 
       KEY_TIME_TEXT, 
       KEY_DAYS_OF_WEEK_TEXT, 
     }; 
     String sortOrder = 
       KEY_ROWID + " ASC"; 

     dataBase = dbhelper.getWritableDatabase(); 
     //c1 = dataBase.rawQuery(query, null); 
     c1 = dataBase.query(
       DATABASE_TABLE_DISPLAY, // The table to query 
       projection,        // The columns to return 
       null,        // The columns for the WHERE clause 
       null,       // The values for the WHERE clause 
       null,          // don't group the rows 
       null,          // don't filter by row groups 
       sortOrder         // The sort order 
       ); 


     } catch (Exception e) { 

     System.out.println("DATABASE ERROR " + e); 

     } 
     return c1; 
} 

private class DbHelper extends SQLiteOpenHelper{ 
      .....code creating tables and stuff/// 

    } 
} 

public DataHandler open() 
{ 
    dataBase = dbhelper.getWritableDatabase(); 
    return this; 
} 

public void close() 
{ 
    dbhelper.close(); 
} 
} 

Я создал пользовательский макет представления для listView с установленными значками. Ошибок нет. Я получаю только обработанное исключение NullPointer и ничего не отображается в моем списке.

Вот мой журнал:

01-30 14: 27: 08,641: E/Трейс (656): Ошибка при открытии файла трассировки: Нет такого файл или каталог (2) 01-30 14: 27: 09.419: W/dalvikvm (656): VFY: невозможно найти класс, на который делается ссылка в подписи (Landroid/view/SearchEvent;) 01-30 14: 27: 09.419: I/dalvikvm (656): Не удалось найти метод android.view.Window $ Callback.onSearchRequested, ссылка на метод android.support.v7.view.WindowCallbackWrapper.onSearchRequested 01-30 14: 27: 09.429: W/dalvikvm (656): VFY: не удается разрешить метод интерфейса 14535: Landroid/view/Window $ Callback; .onSearchRequested (Landroid/view/SearchEvent;) Z 01-30 14: 27: 09.429: D/dalvikvm (656): VFY: замена кода операции 0x72 на 0x0002 01-30 14: 27: 09,439: I/dalvikvm (656): не удалось найти метод android.view.Window $ Callback.onWindowStartingActionMode, ссылочных от метода android.support.v7.view.WindowCallbackWrapper.onWindowStartingActionMode 01-30 14 : 27: 09.459: W/dalvikvm (656): VFY: не удалось разрешить интерфейс метод 14539: Landroid/view/Window $ Callback; .onWindowStartingActionMode (Landroid/view/ActionMode $ Callback; I) Landroid/view/ActionMode ; 01-30 14: 27: 09.459: D/dalvikvm (656): VFY: замена кода операции 0x72 на 0x0002 01-30 14: 27: 09.989: I/dalvikvm (656): Не удалось найти метод android.view. ViewGroup.onRtlPropertiesChanged, ссылается на метод android.support.v7.widget.Toolbar.onRtlPropertiesChanged 01-30 14: 27: 09.989: W/dalvikvm (656): VFY: невозможно разрешить виртуальный метод 14435: Landroid/view/ViewGroup; .onRtlPropertiesChanged (I) V 01-30 14: 27: 09.989: D/dalvikvm (656): VFY: замена кода операции 0x6f на 0x0007 01-30 14: 27: 10.069: I/dalvikvm (656): возможно не найти метод android.content.res.TypedArray.getChangingConfigurations, ссылка от метода android.support.v7.widget.TintTypedArra y.getChangingConfigurations 01-30 14:27:10.069: W/dalvikvm (656): VFY: не удалось разрешить виртуальный метод 418: Landroid/content/res/TypedArray; .getChangingConfigurations () I 01-30 14: 27: 10.079: D/dalvikvm (656): VFY : замена кода операции 0x6e на 0x0002 01-30 14: 27: 10.109: I/dalvikvm (656): Не удалось найти метод android.content.res.TypedArray.getType, ссылающийся на метод android.support.v7.widget. TintTypedArray.getType 01-30 14: 27: 10.109: W/dalvikvm (656): VFY: невозможно разрешить виртуальный метод 440: Landroid/content/res/TypedArray; .getType (I) I 01-30 14:27 : 10.129: D/dalvikvm (656): VFY: замена кода операции 0x6e на 0x0002 01-30 14: 27: 10.429: I/System.out (656): ОШИБКА БАЗЫ ДАННЫХ java.lang.NullPointerException 01-30 14: 27: 10,429: W/System.err (656): java.lang.NullPointerException 01-30 14: 27: 10.439: W/System.err (656): at com.teosoft.mutetimer.MainActivity.showList (MainActivity.java:55) 01-30 14: 27: 10.439: W/System.err (656): at com.teosoft.mutetimer.MainActivity.onCreate (MainActivity.java:27) 01-30 14: 27: 10.449: W/System. err (656): at android.app.Activity.performCreate (Activity.java:5008) 01-30 14: 27: 10.449: W/System.err (656): at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1079) 01-30 14: 27: 10.479: W/System.err (656): at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2023) 01-30 14: 27: 10.479 : W/System.err (656): при android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2084) 01-30 14: 27: 10.499: W/System.err (656): at android.app.ActivityThread.access $ 600 (ActivityThread.java:130) 01-30 14: 27: 10.540: W/System.err (656): at android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1195) 01-30 14: 27: 10.549: W/System.err (656): at android.os.Handler.dispatchMessage (Handler.java:99) 01-30 14: 27: 10.559: W/System.err (656): at android.os.Looper. (Looper.java:137) 01-30 14: 27: 10.559: W/System.err (656): at android.app.ActivityThread.main (ActivityThread.java:4745) 01-30 14:27 : 10,589: W/System.err (656): при java.lang.reflect.Method.invokeNative (родной метод) 01-30 14: 27: 10.589: W/System.err (656): at java.lang.reflect.Method.invoke (Method.java:511)) 01-30 14: 27: 10.589: W/System.err (656): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:786) 01-30 14:27: 10.609: W/System.err (656): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:553) 01-30 14: 27: 10.609: W/System.err (656): на dalvik.system.NativeStart.main (родной метод) 01-30 14: 27: 10.889: D/dalvikvm (656): GC_CONCURRENT освобожден 197K, 3% бесплатно 11034K/11335K, приостановлено на 115 мс + 53 мс, всего 392 мсек 01 -30 14: 27: 11.949: I/Хореограф (656): пропущен 109 кадров s! Приложение может быть , делая слишком много работы над своей основной нитью. 01-30 14: 27: 12.029: D/gralloc_goldfish (656): обнаружен эмулятор без эмуляции графического процессора.

Извините за длинный пост. Я новичок.:)

+0

Возможный дубликат [Что такое Исключение нулевого указателя и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how -do-i-fix-it) – 0X0nosugar

ответ

0
static SQLiteDatabase dataBase; // this field is not initialized => dataBase = null 

public DataHandler(Context ctx){ 
    this.ctx = ctx; 
    dbhelper = new DbHelper(ctx); 
} 

public static Cursor displayQuery() { 
    Cursor c1 = null; 
    try { 

     if (dataBase.isOpen()) { // You try to use dataBase here and it is null 
      dataBase.close(); 
     } 
    ... 

Заменить, что если блок с

if (dataBase != null && dataBase.isOpen()) { 
    dataBase.close(); 
} 

Это должно работать.

+0

Спасибо, Дэвид! Ты профессионал, это сработало! Спасибо за ваше время и помощь! Желаю тебе всего наилучшего! :) –

+0

Добро пожаловать! –

0

Я думаю, что проблема в этой строке:

c1.close(); 

c1, кажется, пустой, и вы пытаетесь закрыть его, даже если он является пустым

if (c1 != null && c1.getCount() != 0) { 
    // code 
} 
c1.close(); 

Move, что линия внутри, если блок и приложение не должны разбиваться. Но список будет пустым.

+0

Спасибо, мужик. Думаю, это сработало. Исключение ушло. Но у меня все еще нет списка заполненных списков. Любая идея почему? И как я могу это исправить? Я пробовал уже несколько недель ... –

+0

Добро пожаловать! Проблема, похоже, в методе displayQuery. Приложение действительно сбой там, но из-за этого try catch block приложение не разбивается. Не могли бы вы прикрепить код для DbHelper? Кроме того, вместо System.out.println («DATABASE ERROR» + e); do e.printStackTrace(); и прикрепите журнал. –

+0

Я разместил его как ответ ниже. –