#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. Спасибо! Вы очень полезны 🙂