Я пытаюсь создать список с помощью специальной ячейки элемента списка полностью программным способом (без использования какого-либо xml). Я столкнулся с ошибкой. После нескольких часов поиска в Интернете я пишу это как свой первый вопрос о переполнении стека.
Оцените свои входы в этом и любые предложения о том, как лучше обрабатывать Android-программы, не используя R. *. xml
При запуске этого кода я получаю следующую ошибку:
(Приостановлено (исключение Ресурсы $NotFoundException))
ListView.layoutChildren(): 1596
ListView (AbsListView).onLayout(строка boolean, int, int, int, int): 1112
ListView (View).layout(int, int, int, int) строка: 6569
FrameLayout.onLayout(boolean, int, int, int, int): 333 ...
Код:
открытый класс MyList расширяет ListActivity {
static final ArrayList<HashMap<String,String>> list =
new ArrayList<HashMap<String,String>>();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//CUSTOM LIST
LinearLayout mainLayout=new LinearLayout(this);
ListView myListView=new ListView(this);
mainLayout.addView(myListView);
LinearLayout ListItemLayout=new LinearLayout(this);
TextView title = new TextView(this);
TextView author = new TextView(this);
TextView price = new TextView(this);
ListItemLayout.addView(title);
ListItemLayout.addView(author);
ListItemLayout.addView(price);
SimpleAdapter adapter = new SimpleAdapter(
this,
list,
ListItemLayout.getId(),
new String[] {"title","author","price"},
new int[] {ListItemLayout.getChildAt(0).getId(),ListItemLayout.getChildAt(1).getId(),ListItemLayout.getChildAt(2).getId()}
);
populateList();
setListAdapter(adapter);
}
private void populateList() {
HashMap<String,String> map = new HashMap<String,String>();
map.put("title",
"Professional Android ");
map.put("author", "Meier");
map.put("price", "$54.99");
list.add(map);
map = new HashMap();
map.put("title","Android 2");
map.put("author",
"Sayed");
map.put("price", "$48.98");
list.add(map);
}
}
Вы не можете этого сделать. SimpleAdapter
требуется идентификатор ресурса из макета, определенного в xml. Для этого также требуются идентификаторы ресурсов TextView
, которые он будет заполнять. Это связано с тем, что он использует LayoutInflater#inflate
для создания содержащего View
, а затем ViewGroup#findViewById
, чтобы получить ссылку на TextView
, которая отобразит данные.
Если вы хотите сделать весь свой макет в коде, включая код Adapter
, вам нужно будет создать свой собственный Adapter
класс. Вы можете сделать это, растягивая BaseAdapter
и переопределяя getView
как минимум.
Конструктор вашего SimpleAdapter требует идентификатора из вашего ListItemLayout, но у него его нет (я думаю, Android отпадает, чтобы проверить файл R), поэтому присвойте ему идентификатор в вашем коде.