-1

I have these activities: CoffeeActivity and DrinkActivity

This is my main activity, which has a ListView

public class CalculationHistoryListActivity extends AppCompatActivity {

    Save saveData;
    ListView listView;
    ArrayList arrayListdrink,arrayListCoffee;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calculation_history_list);

        // Toasts the test ad message on the screen. Remove this after defining your own ad unit ID.
       // Toast.makeText(this, TOAST_TEXT, Toast.LENGTH_LONG).show();

       //sqlite database 
        saveData = new Save(CalculationHistoryListActivity.this);

        //listview 
        listView = (ListView) findViewById(R.id.list);

            //coffee list
            arrayListCoffee = saveData.getAllCoffeeCalculation();
            ArrayAdapter coffeeArrayAdapter = new ArrayAdapter(CalculationHistoryListActivity.this,
                    R.layout.list_view_item_coffee, R.id.total_money_coffee, arrayListCoffee);
            listView.setAdapter(coffeeArrayAdapter);

        //drink list
        arrayListdrink = saveData.getAllDrinkCalculation();
        ArrayAdapter drinkArrayAdapter = new ArrayAdapter(CalculationHistoryListActivity.this,
                R.layout.list_view_item_coffee, R.id.total_money_drink,arrayList);
                listView.setAdapter(drinkArrayAdapter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_calculation_history_list, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

}

This is my Database Helper

public class Save extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "my.db";
    private static final String TABLE = "mytable";
    private static final String COFFEE = "coffee";
    private static final String DRINK = "drink";

    public Save(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String query ;
        query = "CREATE TABLE " +TABLE+ "(" +COFFEE+ " TEXT, " +DRINK+ " TEXT " + ")";
        sqLiteDatabase.execSQL(query);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL(" DROP FILE IF EXISTS " + TABLE);
        onCreate(sqLiteDatabase);

    }

    //this is coffee section
    public boolean addDatabaseToCoffee(int i){
        SQLiteDatabase sqLiteDatabase = getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COFFEE,i);
        long chaker = sqLiteDatabase.insert(TABLE,null,contentValues);
        if (chaker == -1){
            return false;
        }else {
            return true;
        }

    }
    //this is drink section
    public boolean addDatabaseToDrink(int i){
        SQLiteDatabase sqLiteDatabase = getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(DRINK,i);

        long chaker = sqLiteDatabase.insert(TABLE,null,contentValues);
        if (chaker == -1){
            return false;
        }else {
            return true;
        }

    }


    //coffee
    public ArrayList<String> getAllCoffeeCalculation() {
        ArrayList<String> array_list = new ArrayList<String>();

        //hp = new HashMap();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor res =  db.rawQuery("SELECT * FROM " + TABLE,null);
        res.moveToFirst();

        while(res.isAfterLast() == false){
            array_list.add(res.getString(res.getColumnIndex(COFFEE)));
            res.moveToNext();
        }
        return array_list;
    }
    //drink
    public ArrayList<String> getAllDrinkCalculation() {
        ArrayList<String> array_list = new ArrayList<String>();

        //hp = new HashMap();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor res =  db.rawQuery("SELECT * FROM " + TABLE,null);
        res.moveToFirst();

        while(res.isAfterLast() == false){

            //array_list.add(res.getString(res.getColumnIndex(DRINK)));

            res.moveToNext();
        }
        return array_list;
    }

}

My problem is that I have two Activities, and when I use the Coffee or drink Activity for a single time it's OK, but if I want to use two Activities both at once, my app crashes

My LogCat

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
                                                                           at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:401)
                                                                           at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369)
                                                                           at android.widget.AbsListView.obtainView(AbsListView.java:3065)
                                                                           at android.widget.ListView.makeAndAddView(ListView.java:1945)
                                                                           at android.widget.ListView.fillDown(ListView.java:719)
                                                                           at android.widget.ListView.fillFromTop(ListView.java:785)
                                                                           at android.widget.ListView.layoutChildren(ListView.java:1735)
                                                                           at android.widget.AbsListView.onLayout(AbsListView.java:2852)
                                                                           at android.view.View.layout(View.java:17995)
                                                                           at android.view.ViewGroup.layout(ViewGroup.java:5817)
                                                                           at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1742)
                                                                           at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
                                                                           at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
                                                                           at android.view.View.layout(View.java:17995)
                                                                           at android.view.ViewGroup.layout(ViewGroup.java:5817)
                                                                           at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344)
                                                                           at android.widget.FrameLayout.onLayout(FrameLayout.java:281)
                                                                           at android.widget.ScrollView.onLayout(ScrollView.java:2537)
                                                                           at android.view.View.layout(View.java:17995)
                                                                           at android.view.ViewGroup.layout(ViewGroup.java:5817)
                                                                           at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
                                                                           at android.view.View.layout(View.java:17995)
                                                                           at android.view.ViewGroup.layout(ViewGroup.java:5817)
                                                                           at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344)
                                                                           at android.widget.FrameLayout.onLayout(FrameLayout.java:281)
                                                                           at android.view.View.layout(View.java:17995)
                                                                           at android.view.ViewGroup.layout(ViewGroup.java:5817)
                                                                           at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1742)
                                                                           at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
                                                                           at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
                                                                           at android.view.View.layout(View.java:17995)
                                                                           at android.view.ViewGroup.layout(ViewGroup.java:5817)
                                                                           at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344)
                                                                           at android.widget.FrameLayout.onLayout(FrameLayout.java:281)
                                                                           at android.view.View.layout(View.java:17995)
                                                                           at android.view.ViewGroup.layout(ViewGroup.java:5817)
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
  • 1
    You cannot use two adapters in the same ListView, but that is unrelated to your error – OneCricketeer Nov 10 '16 at 21:23
  • you have one listview and try to set it to two arrayAdapter... listView.setAdapter(coffeeArrayAdapter); & listView.setAdapter(drinkArrayAdapter); Why? – shanyour Nov 10 '16 at 21:30
  • @shanyour because i have a two activity one is CoffeeActivity And Secand is Drink Activity in coffee or drink activity user can calculate there price or etc. ok i explain more when user click number 1 Coffee activity then they have calculated price and go next 2 activity to price preview and before save to sure to user that data are he want to save. and then 3rd activity save data in database and show as a listview. and this 3rd activity are the all calculation show if user save coffee price then this activity show or user save drink price then hear are show that's why i need to save to value – Akram Ibna Bashar Nihan Nov 10 '16 at 21:40
  • and sorry for my English skill it's not good sorry for that @shanyour – Akram Ibna Bashar Nihan Nov 10 '16 at 21:41
  • so what is the way to use multiple adapter in listview ? and can you please tell me how to solve this error ? @cricket_007 – Akram Ibna Bashar Nihan Nov 10 '16 at 21:42

1 Answers1

2

Your error is coming from inside the Adapter.

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
  -->     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:401)
  -->     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369)
  -->     at android.widget.AbsListView.obtainView(AbsListView.java:3065)

Firstly, your drink list is empty... you commented this line

//array_list.add(res.getString(res.getColumnIndex(DRINK)));

And what is arrayList here?

arrayListdrink = saveData.getAllDrinkCalculation();
ArrayAdapter drinkArrayAdapter = new ArrayAdapter(CalculationHistoryListActivity.this,
        R.layout.list_view_item_coffee, R.id.total_money_drink,arrayList);
                                                               ^^^

And you should DROP TABLE, not FILE...

sqLiteDatabase.execSQL(" DROP FILE IF EXISTS " + TABLE);

If your database worked, then I see nothing else wrong with what you have. Clear your app data to recreate the database, fix these issues, then you should see a list of drink values.


Anyways, no you cannot show two Adapters in one ListView.

You can however add both columns of your database to one ArrayList and display both in one adapter.

// coffee and drink
public ArrayList<String> getAllCoffeeCalculation() {
    ArrayList<String> array_list = new ArrayList<String>();

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery("SELECT * FROM " + TABLE,null);
    res.moveToFirst();

    while(res.isAfterLast() == false){
        String c = res.getString(res.getColumnIndex(COFFEE));
        String d = res.getString(res.getColumnIndex(DRINK));

        array_list.add(c + "\t" + d);
        res.moveToNext();
    }
    return array_list;
}

Then, in the Activity.

saveData = new Save(CalculationHistoryListActivity.this);

listView = (ListView) findViewById(R.id.list);

arrayListCoffee = saveData.getAllCoffeeCalculation();
ArrayAdapter<String> coffeeArrayAdapter = new ArrayAdapter<String>(
      CalculationHistoryListActivity.this,
      android.R.layout.simple_list_item_1, 
      arrayListCoffee);
listView.setAdapter(coffeeArrayAdapter);
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
  • Thank you so much @crinket_007 – Akram Ibna Bashar Nihan Nov 10 '16 at 22:32
  • but it's not solve my problem but can you tell me if i if (coffeeArrayAdapter != null){ //print coffee listView.setAdapter(coffeeArrayAdapter); }else if (drinkArrayAdapter != null){ //print drink listView.setAdapter(drinkArrayAdapter); i try to solve my self like this but it's not working can you please tell me there are way to working singel activity a singel time not bothworking on the same time – Akram Ibna Bashar Nihan Nov 10 '16 at 22:34
  • Neither of your adapter object can be null. You explicitly made a `new ArrayAdapter`. I do not know what you want to see on the ListView, but my answer is just one *possible* solution to your issue. – OneCricketeer Nov 10 '16 at 22:38