0

У меня есть listview с getCount() из 7. Я хочу, чтобы все 7 элементов отображались независимо от того, доступны ли какие-либо данные из моей базы данных для их заполнения. Если данных нет, элемент должен быть пустым с заданным текстом.Перечисление ListView/адаптера IndexOutOfBound

Когда я не забронировал 7 записей базы данных заранее, чтобы перейти в 7 представлений, я получаю исключение indexoutofbound при запуске приложения из-за того, что 7 элементов не могут быть заполнены соответствующим образом. Это происходит в ListMealsAdapter.java, когда вызывается метод Meal currentItem = getItem(position); и триггеры public Meal getItem(int position).

Я ищу заявление о состоянии, которое я могу использовать для своего списка/адаптера, который может обрабатывать пустую базу данных, чтобы индекс не вышел за пределы. Кроме того, подходит ли BaseAdapter для того, что я хочу сделать?

MainActivity.java

public class MainActivity extends BaseActivity { 
public static final String TAG = "MainActivity"; 

private ListView mListviewMeals; 
private MealDAO mMealDao; 
private List<Meal> mListMeals; 
private ListMealsAdapter mAdapter; 
private SQLiteDatabase mDatabase; 
DatabaseHelper mDbHelper; 

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

    activateToolbar(1); 

    // initialize views 
    initViews(); 

    // fill the dailyListView 
    mMealDao = new MealDAO(this); 
    mListMeals = mMealDao.getAllMeals(); 
    mAdapter = new ListMealsAdapter(this, mListMeals, MainActivity.this); 
    mListviewMeals.setAdapter(mAdapter); 
} 

private void initViews() { 
    this.mListviewMeals = (ListView) findViewById(R.id.view_daily_list); 
} 

ListMealsAdapter.java

public class ListMealsAdapter extends BaseAdapter { 
    public static final String TAG = "ListMealsAdapter"; 

    Activity mActivity; 
    private List<Meal> mItems; 
    private LayoutInflater mInflater; 

    public ListMealsAdapter(Context context, List<Meal> listMeals, Activity activity) { 
     super(); 
     mActivity = activity; 
     this.setItems(listMeals); 
     this.mInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public int getCount() { 
     return 7; 
    } 

    @Override 
    public Meal getItem(int position) { 
     return (getItems() != null && !getItems().isEmpty()) ? getItems().get(position) : null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return (getItems() != null && !getItems().isEmpty()) ? getItems().get(position).getId() : position; 
    } 

    @Override 
    public View getView(int position, final View convertView, final ViewGroup parent) { 
     View v = convertView; 
     final ViewHolder holder; 
     if (v == null) { 
      v = mInflater.inflate(R.layout.list_item_daily, parent, false); 
      holder = new ViewHolder(); 
      holder.txtDescription = (TextView) v.findViewById(R.id.txtBreakfast); 
      v.setTag(holder); 
     } else { 
      holder = (ViewHolder) v.getTag(); 
     } 

     // fill row data 
     Meal currentItem = getItem(position); 
     if (currentItem != null) { 
      holder.txtDescription.setText(currentItem.getDescription()); 
     } 

     return v; 
    } 

    public List<Meal> getItems() { 
     return mItems; 
    } 

    public void setItems(List<Meal> mItems) { 
     this.mItems = mItems; 
    } 

    class ViewHolder { 
     TextView txtDescription; 
    } 
} 

Meal.java

public class Meal implements Serializable { 
    public static final String TAG = "Meal"; 
    private static final long serialVersionUID = -7406082437623008161L; 

    private long mId; 
    private int mType; 
    private String mDescription; 

    public Meal() { 
    } 

    public Meal(int type, String description) { 
     this.mType = type; 
     this.mDescription = description; 
    } 

    public long getId() { 
     return mId; 
    } 

    public void setId(long mId) { 
     this.mId = mId; 
    } 

    public int getType() { 
     return mType; 
    } 

    public void setType(int mType) { 
     this.mType = mType; 
    } 

    public String getDescription() { 
     return mDescription; 
    } 

    public void setDescription(String mDescription) { 
     this.mDescription = mDescription; 
    } 
} 

MealDAO.java

public class MealDAO { 
    public static final String TAG = "MealDAO"; 

    private SQLiteDatabase mDatabase; 
    private DatabaseHelper mDbHelper; 
    private Context mContext; 
    private String[] mAllColumns = { DatabaseHelper.COLUMN_MEAL_ID, 
      DatabaseHelper.COLUMN_MEAL_TYPE, DatabaseHelper.COLUMN_MEAL_DESCRIPTION}; 

    public MealDAO(Context context) { 
     this.mContext = context; 
     mDbHelper = new DatabaseHelper(context); 
     // open the database 
     try { 
      open(); 
     } catch (SQLException e) { 
      Log.e(TAG, "SQLException on opening database " + e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 

    public void open() throws SQLException { 
     mDatabase = mDbHelper.getWritableDatabase(); 
    } 

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

    public List<Meal> getAllMeals() { 
     List<Meal> listMeals = new ArrayList<Meal>(); 

     Cursor query = mDatabase.rawQuery("SELECT * from meal", null); 
     if(query.moveToFirst()) { 
      do { 

       // Cycle through all records 
       Meal meal = cursorToMeal(query); 
       listMeals.add(meal); 
      } while(query.moveToNext()); 
     } 

     return listMeals; 
    } 

    public Meal getMealById(long id) { 
     Cursor cursor = mDatabase.query(DatabaseHelper.TABLE_MEALS, mAllColumns, 
       DatabaseHelper.COLUMN_MEAL_ID + " = ?", 
       new String[] { String.valueOf(id) }, null, null, null); 
     if (cursor != null) { 
      cursor.moveToFirst(); 
     } 

     Meal meal = cursorToMeal(cursor); 
     return meal; 
    } 

    protected Meal cursorToMeal(Cursor cursor) { 
     Meal meal = new Meal(); 
     meal.setId(cursor.getLong(0)); 
     meal.setType(cursor.getInt(1)); 
     meal.setDescription(cursor.getString(2)); 
     return meal; 
    } 
} 

ответ

0

После нескольких проб и ошибок я наконец нашел приемлемое решение моей проблемы. То, что я сделал, это добавить строку по умолчанию в мою базу данных для элементов представления, которые я хотел иметь заданную запись в базе данных, когда данные не были введены заранее.

Затем я обязательно запустил индекс 2, убедившись, что индекс 1 будет зарезервирован для моего значения по умолчанию. Если индекс выходит за границы, то исключение будет поймано, и в базу будет добавлена ​​запись базы данных по умолчанию.

public Meal getItem(int position) { 
    Meal result; 
    try { 
     result = (getItems() != null && !getItems().isEmpty()) ? getItems().get(position) : null; 
    } catch (Exception e) { 
     Meal default = getItem(0); 
     return default; 
    } 
    return result; 
} 

Meal currentItem = getItem(position + 1); 
     if (currentItem != null) { 
      holder.txtDescription.setText(currentItem.getDescription()); 
     } 

С этим изменением все работает с тех пор. Надеюсь, это тоже поможет кому-то другому.

Смежные вопросы