Как мне установить массив расширяемого размера, чтобы предотвратить исключение нулевого указателя?

#java #android #arrays #listview

#java #Android #массивы #listview

Вопрос:

Цель состоит в том, чтобы извлечь данные из таблицы MYSQL и ввести их в представление списка. Для этого я помещаю значения в массив. Однако, похоже, что длина массива должна быть равна количеству значений, взятых из таблицы (которые могут варьироваться); или приложение ответит исключением нулевого указателя.

Мой вопрос: как мне сделать массивы динамическими по длине, чтобы ошибка не развивалась? Или есть альтернативный способ?

Определение используемых массивов:

        public String titleId[] = new String[2]; //Defining the arrays used
       public Integer imageId[] = new Integer[2];
 

Установка массивов, равных значениям: (В настоящее время это будет выполнять 2 итерации)

 for(int i=0; i<jArray.length();i  ){
       JSONObject json = jArray.getJSONObject(i);

       titleId[i] = "test";
       imageId[i] = R.drawable.ic_launcher;

   }
 

Использование массивов для настройки ListView:

           CustomList adapter = new
            CustomList(getActivity(), data.titleId, data.imageId);      
      listView.setAdapter(adapter);
 

CustomList.java (Используется для настройки пользовательского адаптера)

 public class CustomList extends ArrayAdapter<String>{

private final Activity context;
private final String[] titleId;
private final Integer[] imageId;

public CustomList(Activity context,
String[] titleId, Integer[] imageId) {
super(context, R.layout.single_row, titleId);
this.context = context;
this.titleId = titleId;
this.imageId = imageId;

}
@Override
public View getView(int position, View view, ViewGroup parent) {
    LayoutInflater inflater = context.getLayoutInflater();
    View rowView= inflater.inflate(R.layout.single_row, null, true);
    TextView txtTitle = (TextView) rowView.findViewById(R.id.tvTitle);

    ImageView imageView = (ImageView) rowView.findViewById(R.id.ivIcon);
    txtTitle.setText(titleId[position]);

    imageView.setImageResource(imageId[position]);
    return rowView;
}
}
 

Комментарии:

1. Вы можете использовать ArrayList вместо Array

2. for(int i=0; i<jArray.length();i ){ должно быть for(int i=0; i<titleId.length();i ){ , поскольку я не вижу никакого определения массива JArray с длиной = 2.

Ответ №1:

Я бы рекомендовал вам использовать динамические структуры данных, предоставляемые JDK. Чтобы быть более конкретным, те, кто реализует List интерфейс, похоже, соответствуют вашей цели.

Вы должны собрать свои данные в List объект, а затем сгенерировать из него массив.

Например:

 List<String>  titleId = new ArrayList();
 

Предположим, вы получаете свои данные из результирующего набора JDBC:

 while(res.next())
{
    titleId.add(res.getString("dbTableColumn"));
}
 

Наконец, вы генерируете массив из списка и передаете его CustomList конструктору:

 CustomList adapter = new CustomList(getActivity(), data.titleId.toArray(), ...);
 

Комментарии:

1. Поскольку ArrayLists нельзя использовать напрямую, как бы я тогда отредактировал свой CustomList.java файл, который используется для создания пользовательского адаптера. Я обновил вопрос.

2. @jamesgates1 Я не понимаю вашего комментария. Вы имеете в виду, что вы вообще не можете использовать ArrayList в своей программе? Ни LinkedList то, ни другое?

3. Нет, я имел в виду, что CustomList.java не будет принимать ArrayList. Он будет принимать только массив. Он отлично работает в других частях программы.

4. @jamesgates1 вот почему я написал, что вы должны использовать toArray() метод. Он вернет массив с тем же содержимым списка. Пожалуйста, проверьте мой ответ в последней строке.

5. Спасибо! Вы очень полезны 🙂