Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 83
#1

Ошибка в setAdapter - Программирование Android

08.05.2016, 07:04. Просмотров 447. Ответов 12
Метки нет (Все метки)

Ковыряюсь 2 дня, не могу сам разобраться. Предполагаю, что накосячил с контекстом...
Ошибка в setAdapter

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
public class FragmentParsing extends Fragment {
 
    View listParsing, parsingView;
    String total, last;
    TextView tvTotal, tvLast;
 
    public FragmentParsing() {
    }
 
    // URL для загрузки JSON
    private static String url = "http://quotes.zennex.ru/api/v3/bash/quotes?sort=time";
 
    // JSON Node names
    private static final String TAG_TOTAL = "total";
    private static final String TAG_LAST = "last";
    private static final String TAG_QUOTES = "quotes";
    private static final String TAG_ID = "id";
    private static final String TAG_DESCRIPTION = "description";
    private static final String TAG_TIME = "time";
    private static final String TAG_RATING = "rating";
 
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)  {
 
        parsingView = inflater.inflate(R.layout.fragment_parsing, container, false);
        listParsing = parsingView.findViewById(R.id.list);
        tvTotal = (TextView) parsingView.findViewById(R.id.tvTotal);
        tvLast = (TextView) parsingView.findViewById(R.id.textView3);
 
        // вызов async task для получения json
        new GetQuotes().execute();
 
 
        tvTotal.setText(total);
        tvLast.setText(last);
 
        super.onSaveInstanceState(savedInstanceState);
        return parsingView;
    }
 
    /**
     * Async task класс для получения json и HTTP запроса
     * В методе onPreExecute добавляем индикатор загрузкипрежде чем  начнем HTTP запрос
     * В doInBackground вызываем метод makeWebServiceCall для получения JSON и ParseJSON для парсинга данных из JSON
     * В onPostExecute отключаем диалог индикатора загрузки и создаем list Adapter и устанавливаем в ListView.
     */
    public class GetQuotes extends AsyncTask<Void, Void, Void> {
 
        // Hashmap для ListView
        ArrayList<HashMap<String, String>> quotesList;
        ProgressDialog pDialog;
 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // показываем диалог индикатора загрузки
            pDialog = new ProgressDialog(listParsing.getContext());
            pDialog.setMessage(getResources().getString(R.string.downloading));
            pDialog.setCancelable(false);
            pDialog.show();
        }
 
        @Override
        protected Void doInBackground(Void... arg0) {
            // создаем объект service handler class
            WebRequest webreq = new WebRequest();
 
            // создаем запрос к url и получаем ответ
            String jsonStr = webreq.makeWebServiceCall(url, WebRequest.GET);
 
            Log.d("Response: ", "> " + jsonStr);
 
            quotesList = ParseJSON(jsonStr);
 
            return null;
        }
 
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // закрываем диалог индикатора загрузки
            if (pDialog.isShowing())
                pDialog.dismiss();
            /**
             * Обновляем парсированную информацию из JSON в ListView
             */
//            ArrayAdapter<HashMap<String, String>> adapter = new ArrayAdapter<>(
//                    list.getContext(),R.layout.list_item, quotesList);
            ListAdapter adapter = new SimpleAdapter(listParsing.getContext(), quotesList,
                    R.layout.list_parsing, new String[]{TAG_ID, TAG_DESCRIPTION,
                    TAG_TIME, TAG_RATING}, new int[]{R.id.tvId,
                    R.id.tvDesc, R.id.tvTime, R.id.tvRating});
 
            ((ListView)listParsing).setAdapter(adapter);
        }
    }
 
    private ArrayList<HashMap<String, String>> ParseJSON(String json) {
        if (json != null) {
            try {
                // Hashmap для ListView
                ArrayList<HashMap<String, String>> qoutesList = new ArrayList<HashMap<String, String>>();
 
                JSONObject jsonObj = new JSONObject(json);
 
                total = jsonObj.optString(TAG_TOTAL);
                last = jsonObj.optString(TAG_LAST);
 
                // получаем JSON Array узел
                JSONArray quotes = jsonObj.getJSONArray(TAG_QUOTES);
 
                // проходимся по массиву
                for (int i = 0; i < quotes.length(); i++) {
                    JSONObject c = quotes.getJSONObject(i);
 
                    String id = c.getString(TAG_ID);
                    String description = c.getString(TAG_DESCRIPTION);
                    String time = c.getString(TAG_TIME);
                    String rating = c.getString(TAG_RATING);
 
                    // hashmap для одного пункта
                    HashMap<String, String> oneItem = new HashMap<String, String>();
 
                    // добавляем каждый дочерний пункт в HashMap ключ-значение
                    oneItem.put(TAG_ID, id);
                    oneItem.put(TAG_DESCRIPTION, description);
                    oneItem.put(TAG_TIME, time);
                    oneItem.put(TAG_RATING, rating);
 
                    // добавляем в лист
                    qoutesList.add(oneItem);
                }
                return qoutesList;
            } catch (JSONException e) {
                e.printStackTrace();
                return null;
            }
        } else {
            Log.e("ServiceHandler", "Не могу получить данные!");
            return null;
        }
    }
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
 
    }
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2016, 07:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в setAdapter (Программирование Android):

Вылетает setadapter в AsyncTask - Программирование Android
Добрый день, получаю xml от сервера с неким списком произведения и пытаюсь занести данные в listview. По факту данные заносятся в p.name...

IIS- asp ошибка: HTTP 500.100 - Внутренняя ошибка сервера - ошибка ASP Internet Information Services - C# ASP.NET
Привет! Конфигурация win2000pro sp2, стандартный IIS, IE 5. При попытке обратиться к сценарию(asp) получаю ошибку: &lt;пропуск&gt; ......

1C 8.x Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка записи! - 1С
Доброго всем времени суток! подскажи пожалуйста как исправить ошибку: Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове...

Ошибка при добавлении в файл. Ошибка 101: Ошибка записи на диск (Error 101: Disk write error). - Turbo Pascal
Здравствуйте, возникла проблема такого плана. Нужно произвести добавление записи в файл, но после успешного создания и чтения вылазиет...

Ошибка HTTP 500 - внутреняя ошибка сервера при отправке почты. - C# ASP.NET
Я пытаюсь отправить почту и присоединяю к ней письма Вот часть страницы Dim myMail Set myMail = CreateObject('CDONTS.NewMail') ...

ASP: Response.Redirect - не работает, ошибка `500 - Внутренняя ошибка сервера' - C# ASP.NET
Всем привет! Есть в ASP-сраничке такой код: Response.Redirect 'page1.asp?ReturnTo=page2.asp' Эта конструкция работала на IIS 4,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
YuraAAA
1574 / 1316 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
08.05.2016, 12:48 #2
goodi_tomsk,
Цитата Сообщение от goodi_tomsk Посмотреть сообщение
quotesList
null, видимо
0
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 83
08.05.2016, 13:06  [ТС] #3
YuraAAA, а почему он у меня null получился? Никак не пойму...
0
fraley
106 / 106 / 40
Регистрация: 24.05.2015
Сообщений: 320
08.05.2016, 16:16 #4
goodi_tomsk, сам для себя решил вспомнить как работать с JSON.
Всякие плюшки, как например добавление callback, проверка на различные Exception которые я не учел и т.д. и т.п. на ваше усмотрение. Так же я сделал парсинг в onPostExecute, но как мне видится правильный подход делать его в doInBackground.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
public class MainActivity extends AppCompatActivity {
 
    private ListView lv;
    private TextView tvTotal;
    private TextView tvLast;
    private ArrayList<String> arrayList;
    private ArrayAdapter<String> adapter;
    private ProgressDialog progressDialog = null;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        lv=(ListView)findViewById(R.id.listView);
        tvTotal=(TextView)findViewById(R.id.tvTotal);
        tvLast=(TextView)findViewById(R.id.tvLast);
        arrayList=new ArrayList<>();
        adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList);
        lv.setAdapter(adapter);
        progressDialog = ProgressDialog.show(this, null, "Подключение к серверу...", true, true);
 
        MyTask myTask=new MyTask();
        myTask.execute("http://quotes.zennex.ru/api/v3/bash/quotes?sort=time");
    }
 
    private class  MyTask extends AsyncTask<String, Void, String> {
        @Override
        protected void onPostExecute(String result){
 
            try {
                if(result!=null) {
                    JSONObject jsonObject = new JSONObject(result);
                    JSONArray jsonArray = jsonObject.getJSONArray("quotes");
                    tvTotal.setText(jsonObject.getString("total"));
                    tvLast.setText(jsonObject.getString("last"));
                    for (int i = 0; i < jsonArray.length(); i++) {
                        arrayList.add("ID: " + jsonArray.getJSONObject(i).getString("id")
                                + "\nDescription: " + jsonArray.getJSONObject(i).getString("description")
                                + "\nTime: " + jsonArray.getJSONObject(i).getString("time")
                                + "\nRating: " + jsonArray.getJSONObject(i).getString("rating"));
                    }
                    adapter.notifyDataSetChanged();
                }
                else
                    Toast.makeText(getApplicationContext(), "Сбой при подключение к серверу", Toast.LENGTH_SHORT).show();
            }catch (JSONException ex){
                Toast.makeText(getApplicationContext(), "JSONException", Toast.LENGTH_SHORT).show();
                ex.printStackTrace();
            }
            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
        }
 
        @Override
        protected String doInBackground(String... params) {
 
            StringBuilder result = new StringBuilder();
            HttpURLConnection httpURLConnection=null;
            InputStream inputStream=null;
            BufferedReader reader=null;
 
            try {
                URL url=new URL(params[0]);
                httpURLConnection = (HttpURLConnection) url.openConnection();
                httpURLConnection.setRequestMethod("GET");
                httpURLConnection.connect();
 
                inputStream = httpURLConnection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(inputStream));
                String line;
                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }
            }catch (IOException ex) {
                ex.printStackTrace();
                return null;
            } finally {
                try {
                    httpURLConnection.disconnect();
                    inputStream.close();
                    reader.close();
                }catch (IOException ex){
                    ex.printStackTrace();
                }
 
            }
            return result.toString();
        }
    }
}
0
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 83
08.05.2016, 17:39  [ТС] #5
fraley, а как этот код будет выглядеть в фрагменте? (я еще пока плаваю с пониманием контекста )
0
fraley
106 / 106 / 40
Регистрация: 24.05.2015
Сообщений: 320
08.05.2016, 19:55 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
goodi_tomsk, как-то так...
P.S. За реализацию callback-а благодарите Паблито.

MainActivity
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MainActivity extends AppCompatActivity {
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        FragmentTransaction fragmentTransaction=getSupportFragmentManager().beginTransaction();
        BlankFragment blankFragment=BlankFragment.newInstance();
        fragmentTransaction.add(R.id.frameLayout,blankFragment).commit();
    }
}
Fragment
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class BlankFragment extends Fragment implements MyTask.OnTaskComplete{
 
    private ArrayList<String> arrayList=new ArrayList<>();
    private ArrayAdapter<String> adapter;
    private ProgressDialog progressDialog = null;
    private static final String url="http://quotes.zennex.ru/api/v3/bash/quotes?sort=time";
 
    public BlankFragment() {
        // Required empty public constructor
    }
    
    public static BlankFragment newInstance() {
        BlankFragment fragment = new BlankFragment();
        return fragment;
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view= inflater.inflate(R.layout.fragment_blank, container, false);
 
        ListView lv=(ListView)view.findViewById(R.id.listView);
        adapter=new ArrayAdapter<String>(view.getContext(), android.R.layout.simple_list_item_1, arrayList);
        lv.setAdapter(adapter);
 
 
        progressDialog = ProgressDialog.show(getContext(), null, "Подключение к серверу...", true, true);
        MyTask myTask=new MyTask(BlankFragment.this);
        myTask.execute(url);
 
        return view;
    }
    
    @Override
    public void onTaskComplete(ArrayList<String> array) {
        if(array!=null) {
            adapter.clear();
            arrayList.addAll(array);
            adapter.notifyDataSetChanged();
        }
        else
            Toast.makeText(getContext(), "Сбой при подключение к серверу", Toast.LENGTH_SHORT).show();
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
    }
    
}
AsyncTask
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
public class MyTask extends AsyncTask<String, Void, ArrayList> {
 
    private OnTaskComplete OnTaskComplete =null;
    
    public MyTask(OnTaskComplete callback){
        this.OnTaskComplete=callback;
    }
   
    interface OnTaskComplete {
        void onTaskComplete(ArrayList<String> arrayList);
    }
    
 
    @Override
    protected void onPostExecute(ArrayList result) {
        OnTaskComplete.onTaskComplete(result);
    }
 
    @Override
    protected ArrayList doInBackground(String... params) {
 
        StringBuilder result = new StringBuilder();
        HttpURLConnection httpURLConnection = null;
        InputStream inputStream = null;
        BufferedReader reader = null;
 
        try {
            URL url = new URL(params[0]);
            httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.connect();
 
            inputStream = httpURLConnection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(inputStream));
            String line;
            while ((line = reader.readLine()) != null) {
                result.append(line);
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            return null;
        } finally {
            try {
                httpURLConnection.disconnect();
                inputStream.close();
                reader.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return parseJSON(result.toString());
    }
    
    private ArrayList<String> parseJSON(String strJSON){
 
        ArrayList<String>  arrayList=new ArrayList<>();
        try {
            if (strJSON != null) {
 
                JSONObject jsonObject = new JSONObject(strJSON);
                JSONArray jsonArray = jsonObject.getJSONArray("quotes");
                arrayList.add("Total: "+jsonObject.getString("total"));
                arrayList.add("Last: "+jsonObject.getString("last"));
 
                for (int i = 0; i < jsonArray.length(); i++) {
                    arrayList.add("ID: " + jsonArray.getJSONObject(i).getString("id")
                            + "\nDescription: " + jsonArray.getJSONObject(i).getString("description")
                            + "\nTime: " + jsonArray.getJSONObject(i).getString("time")
                            + "\nRating: " + jsonArray.getJSONObject(i).getString("rating"));
                }
 
            } else
                return null;
        } catch (JSONException ex) {
            ex.printStackTrace();
            return null;
        }
        return arrayList;
    }
}
1
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 83
09.05.2016, 07:34  [ТС] #7
fraley, а при смене ориентации httpзапрос прервется и пойдёт заново? Что нужно сохранить/передать в Saveinstancestate?
0
fraley
106 / 106 / 40
Регистрация: 24.05.2015
Сообщений: 320
09.05.2016, 15:38 #8
goodi_tomsk, есть такой вариант - можно в манифесте в активити добавить:
XML
1
android:configChanges="orientation|screenSize"
Тогда активити не будет перерисовываться.
Но гугл вроде пишет что это плохая практика.
0
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 83
10.05.2016, 12:00  [ТС] #9
Добавлено через 1 минуту
fraley, опять налл в lv.setAdapter(adapter);

Добавлено через 14 минут
Process: ru.bunakov.testapplication, PID: 4704
java.lang.NullPointerException
at ru.bunakov.testapplication.fragments.FragmentParsing.<init>(FragmentParsing.java:20)
at ru.bunakov.testapplication.adapters.TabAdapter.getItem(TabAdapter.java:23)
at android.support.v13.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:109)
at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:943)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1125)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:608)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:570)
at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:551)
at ru.bunakov.testapplication.MainActivity$1.onTabSelected(MainActivity.java:81)
0
Pablito
2494 / 1939 / 605
Регистрация: 12.05.2014
Сообщений: 6,798
Завершенные тесты: 1
10.05.2016, 12:01 #10
Цитата Сообщение от fraley Посмотреть сообщение
Но гугл вроде пишет что это плохая практика.
нормальная практика
1
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 83
10.05.2016, 12:07  [ТС] #11
Паблито, вот и чего я тут наворотил https://www.dropbox.com/sh/3qw7gqat3...6LISVXgYa?dl=0
0
fraley
106 / 106 / 40
Регистрация: 24.05.2015
Сообщений: 320
10.05.2016, 12:17 #12
goodi_tomsk, при каком сценарии у вас NullPointerException?
Насколько я понимаю вы поменяли код и... ванговать я не умею.
Попробуйте воспользоваться дебаггером.
Очень полезная вещь.

Паблито, почему тогда многие пишут что это плохая практика?
0
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 83
11.05.2016, 09:04  [ТС] #13
пришел к выводу что надо перенести показ прогресс диалога в onResume. И вызов асинкТаска.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2016, 09:04
Привет! Вот еще темы с ответами:

Interbase Ошибка SQL запроса , в базе работает, а через IBQuery в Delphi ошибка - Delphi БД
В Combobox загружены имена организаций. Нужно выполнить запрос на вывод всех полей таблицы организаций при выборе имени в Combobox. При...

Django Ошибка доступа (403) Ошибка проверки CSRF. Запрос отклонён - Python
На хостинге разместил сайт и не могу войти в админку, т.к. возникает 403 ошибка &quot;Ошибка доступа (403). Ошибка проверки CSRF. Запрос...

Ошибка разбора XML/ Ошибка при вызове метода контекста (Прочитать) - 1С
1C 8.2 Документооборот КОРП 1.2 Текст ошибки {ОбщийМодуль.АвтозаполнениеШаблоновФайловКлиентСервер.Модуль(616)}: Ошибка при вызове...

Server 2003 Загружается до окна приветствия и вылетает ошибка: isass.exe - Системная ошибка - Windows Server
Ребята, помогите кто может... весь день бьюсь безрезультатно... с утра пришёл на работу а сервак не пингуется... загружается до...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.05.2016, 09:04
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru