-1

У меня есть эти виды деятельности: CoffeeActivity и DrinkActivityИспользуйте два ArrayAdapter в том же ListView

Это моя основная деятельность, которая имеет 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); 
    } 

} 

Это моя база данных 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; 
    } 

} 

Моя проблема заключается в том, что у меня есть две операции, и когда я использую действие «Кофе» или «Пить» в течение одного раза, все в порядке, но если я хочу использовать две операции как в один раз, мое приложение падает

Мой 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) 
+1

Вы не можете использовать два адаптера в одном ListView, но это не имеет никакого отношения к вашей ошибке –

+0

у вас есть один ListView и попытаться установить его на два arrayAdapter ... listView.setAdapter (coffeeArrayAdapter); & listView.setAdapter (drinkArrayAdapter); Зачем? – shanyour

+0

@shanyour, потому что у меня есть два вида активности: CoffeeActivity And Secand - это пьяная деятельность в работе с кофе или напитками. Пользователь может рассчитать цену или т. Д. Ok, я объясню больше, когда пользователь нажимает номер 1. Активность в кофе, тогда они рассчитали цену и идут дальше. 2 активность до предварительного просмотра цен и прежде, чем сохранить пользователю, какие данные он хочет сохранить. а затем 3-го действия сохраняют данные в базе данных и отображаются в виде списка. и это 3-я деятельность - это все расчеты, показывающие, что если пользователь сохранит цену на кофе, то это шоу активности или цена на потребительские напитки, а затем послушайте, вот почему мне нужно сэкономить до стоимости –

ответ

2

Ваша ошибка исходит от внутри адаптера.

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) 

Во-первых, ваш список напиток пуст ... ты прокомментировал эту строку

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

А что такое arrayList здесь?

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

И вы должны DROP TABLE, не FILE ...

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

Если работал в вашей базе данных, то я не вижу ничего плохого еще с тем, что у вас есть. Очистите данные приложения, чтобы воссоздать базу данных, исправить эти проблемы, затем вы должны указать .

В любом случае, вы не можете показать два адаптера в одном ListView.

Однако вы можете добавить оба столбца базы данных в один массив ArrayList и отобразить их как в одном адаптере.

// 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; 
} 

Затем, в деятельности.

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); 
+0

Большое спасибо @ crinket_007 –

+0

, но это не решает мою проблему, но вы можете сказать мне, если i if (coffeeArrayAdapter! = null) { // распечатать кофе listView.setAdapter (coffeeArrayAdapter); } else if (drinkArrayAdapter! = Null) { // печать напиток listView.setAdapter (drinkArrayAdapter); Я пытаюсь решить эту проблему, но это не работает. Можете ли вы рассказать мне, что есть способ работать в режиме singel в одно время, не работая одновременно. –

+0

Ни один из объектов адаптера не может быть нулевым. Вы явно создали «новый ArrayAdapter». Я не знаю, что вы хотите увидеть в ListView, но мой ответ - это одно решение * для вашей проблемы. –