我是Android工作室的初学者,我很难调试这个问题。
当我单击ListView中的任何项目时,应用程序崩溃,这里是OnItemClick的类。目标是将ListView从类别更改为类别内的项目。类别和项目存储在HashMap <String, String[]>
中,因此传递cat.toString()
的值应返回包含类别的字符串。最后使用myList
(存储在函数外部)应返回包含这些项的字符串数组。但是,当我单击任何项目时,应用程序立即崩溃。谢谢你的帮助!
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//Choosen category
TextView cat = (TextView) view;
ArrayList<String> tempItems = new ArrayList<String>();
//Toast.makeText(this, cat.getText().toString(),Toast.LENGTH_SHORT).show();
listAdapter.clear();
for(String val : myList.get(cat.getText().toString())){
tempItems.add(val);
}
listAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,tempItems);
listAdapter.notifyDataSetChanged();
}
变量
ListView myViewList;
Map<String, String[]> myList = new HashMap<String, String[]>();
ArrayAdapter<String> listAdapter;
填充ListView
//Creating a list of all categories
Set<String> myListKeys = myList.keySet();
ArrayList<String> categories = new ArrayList<String>();
for(String val : myListKeys){
categories.add(val);
}
//String[] categories = myListKeys.toArray(new String[myListKeys.size()]);
//Populating list
myViewList = (ListView) findViewById(R.id.groceryList);
listAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,categories);
myViewList.setAdapter(listAdapter);
myViewList.setOnItemClickListener(this);
答案 0 :(得分:2)
您正在使用异常,因为您正在使用listAdapter.clear();
尝试清除适配器内的List。但显然你已经传递了一个无法清除的数组(String[] categories
)。您应该通过迭代将数组转换为 ArrayList
(不仅仅是List
)并将其传递给适配器。
您应该通过传递ArrayList
您认为通过在旧适配器的onItemClick中创建新适配器,您做了什么?
在onItemClick中,不要创建新的适配器。相反,在清除适配器并创建临时ArrayList之后,将所有临时ArrayList添加到适配器。
listAdapter.addAll(tempItems);
另外,要从TextView获取文字,请使用cat.getText().toString();
代替cat.toString();