@dearname

AsynTask: почему «sa» не видит адаптер?

Уже второй день пытаюсь разобраться с AsynTask, не понимаю, почему "sa" не видит адаптер.

public class CurrencyListParsing extends ListActivity {
	private final static String KEY_CHAR_CODE = "CharCode";
	private final static String KEY_VALUE = "Value";
	private final static String KEY_NOMINAL = "Nominal";
	private final static String KEY_NAME = "Name";
	ArrayList<Map<String, String>> data;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		String[] from = { KEY_CHAR_CODE, KEY_VALUE, KEY_NOMINAL, KEY_NAME };
		int[] to = { R.id.charCodeView, R.id.valueView, R.id.nominalView,R.id.nameView };
		SimpleAdapter sa = new SimpleAdapter(this, data, R.layout.item_view,from, to);
		new NewThread().execute();
	}
	
	public class NewThread extends AsyncTask<String, Void, String> {

		@Override
		protected String doInBackground(String... arg) {
			data =new ArrayList<Map<String, String>>();
			
			Map<String, String> m;
			try {
				// Создаем объект URL
				URL url = new URL(getString(R.string.rates_url));
				// Соединяемся
				HttpURLConnection httpConnection =(HttpURLConnection) url.openConnection();
				// Получаем от сервера код ответа
				int responseCode = httpConnection.getResponseCode();
				// Если код ответа хороший, парсим поток(ответ сервера),
				// устанавливаем дату в заголовке приложения и
				// заполняем list нужными Map'ами
				if (responseCode == HttpURLConnection.HTTP_OK) {
				InputStream in = httpConnection.getInputStream();
				DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
				DocumentBuilder db = dbf.newDocumentBuilder();
				Document dom = db.parse(in);
				org.w3c.dom.Element docElement = dom.getDocumentElement();
				String date = docElement.getAttribute("Date");
				setTitle(getTitle() + " на " + date);
				NodeList nodeList = docElement.getElementsByTagName("Valute");
				int count = nodeList.getLength();
				if (nodeList != null && count > 0) {
				for (int i = 0; i < count; i++) {
				Element entry = (Element) nodeList.item(i);
				m = new HashMap<String, String>();
				String charCode = ((Document) entry).getElementsByTagName(KEY_CHAR_CODE).item(0).getFirstChild().getNodeValue();
				String value = ((Document) entry).getElementsByTagName(KEY_VALUE).item(0).getFirstChild().getNodeValue();
				String nominal = "за " + ((Document) entry).getElementsByTagName(KEY_NOMINAL).item(0).getFirstChild().getNodeValue();
				String name = ((Document) entry).getElementsByTagName(KEY_NAME).item(0).getFirstChild().getNodeValue();
					m.put(KEY_CHAR_CODE, charCode);
					m.put(KEY_VALUE, value);
					m.put(KEY_NOMINAL, nominal);
					m.put(KEY_NAME, name);
					data.add(m);
			}
			}
			} else {
				}
				} catch (MalformedURLException e) {
				e.printStackTrace();
				} catch (IOException e) {
				e.printStackTrace();
				} catch (ParserConfigurationException e) {
				e.printStackTrace();
				} catch (SAXException e) {
				e.printStackTrace();
			}
		
	return null;
		}
		@Override
		protected void onPostExecute(String result) {
			setListAdapter(sa);
		}
	}
}


Обратите внимание, вот тут только ошибка, <"sa" cannot be resolved to a varible>

protected void onPostExecute(String result) {
			setListAdapter(sa);
		}
  • Вопрос задан
  • 2908 просмотров
Решения вопроса 1
@Mintormo
А чему тут удивляться? У вас адаптер объявлен в методе onCreate
...
SimpleAdapter sa = new SimpleAdapter(this, data, R.layout.item_view,from, to);
...

То есть переменная sa - локальная для onCreate: в других методах ее не видно. Вам нужно объявить sa как поле данного класса: перенесите объявление туда же где находится data. То есть вот так:
...
    ArrayList<Map<String, String>> data;
    SimpleAdapter sa;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String[] from = { KEY_CHAR_CODE, KEY_VALUE, KEY_NOMINAL, KEY_NAME };
        int[] to = { R.id.charCodeView, R.id.valueView, R.id.nominalView,R.id.nameView };
        sa = new SimpleAdapter(this, data, R.layout.item_view,from, to);
        new NewThread().execute();
    }
...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы