суть проблемы, есть layout, в котором запускается SAX парсер, и с инета вытягивает данные курсы валют. когда добавляю в ListView прога не запускается, а когда вывожу в консоль даные есть, помогите пожалуйста найти где ошибка. (XML образец для ListView создал это my_list_items_currensy)
public class ShowAllActivity extends AppCompatActivity {
private ArrayList finalList;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_layout);
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
try {
URL url = new URL("http://resources.finance.ua/ua/public/currency-cash.xml");
InputStream stream = url.openStream();
SAXParser saxParser = saxParserFactory.newSAXParser(); // creating a SAX parser
Handler handler = new Handler();
saxParser.parse(stream,handler); // here we parse our resource
finalList = handler.getListOfAllCurrencies();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
adapterList();
}
public void adapterList(){
ArrayAdapter arrayAdapter = new ListOfAllCurrency();
ListView listView=(ListView)findViewById(R.id.c_list);
listView.setAdapter(arrayAdapter);
}
public class ListOfAllCurrency extends ArrayAdapter {
public ListOfAllCurrency() {
super(ShowAllActivity.this,R.layout.my_list_items_currensy,finalList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if( view==null){
view = getLayoutInflater().inflate(R.layout.my_list_items_currensy,parent,false);
}
TextView bankName = (TextView)view.findViewById(R.id.bankName);
TextView currency = (TextView)view.findViewById(R.id.currency);
TextView bay = (TextView)view.findViewById(R.id.bay);
TextView sell = (TextView)view.findViewById(R.id.sell);
bankName.setText(finalList.get(position).getBankName());
StringBuilder itemsString = new StringBuilder();
int lengthListOfCurrency = finalList.get(position).getList().size();
for(int i=0;i
Ошибка в ShowActivity.onCreate. Инициализировать лист нужно до setContentView, т.к. то, чем ты его инициализируешь, не успевает распарситься.
Сделай ASyncTask все же, его проще реализовать чем Loader, куда в doInBackground помести весь код распарсивания, кроме последней строчки, а в onPostExecute пускай возвращает лист handler.getListOfAllCurrencies(). Такие вещи как парсинг рекомендуется делать в отдельной нити.
Если фильтрация и данные на сервере обновляются нечасто, можно как вариант распарсивать и сохранять в БД (SQLite идет в комплекте, Realm ставить дополнительно) и оттуда уже тянуть.
Если эти кнопки и парсер в одной активити, то можно по нажатии на кнопку фильтровать соответствующе список валют и уведомлять об этом адаптер (adapter.notifyDataChanged()).
Парсер лучше запускать в отдельном треде, используй для этого ASyncTask(сейчас не рекомендуется, но если проект учебный или тестовый, то можно) или Loader.
p.s. ListView тоже сейчас чаще заменяется RecyclerView — то же самое что ListView, но с обязательным ViewHolder`ом.
Process: com.example.yura.application, PID: 24646
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.yura.application/com.example.yura.application.ShowAllActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5349)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)
at android.widget.ListView.setAdapter(ListView.java:487)
at com.example.yura.application.ShowAllActivity.adapterList(ShowAllActivity.java:53)
at com.example.yura.application.ShowAllActivity.onCreate(ShowAllActivity.java:35)
at android.app.Activity.performCreate(Activity.java:6020)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2284)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handl