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

Ошибка в setAdapter - Android

Восстановить пароль Регистрация
 
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
08.05.2016, 07:04     Ошибка в setAdapter #1
Ковыряюсь 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);
 
    }
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
08.05.2016, 12:48     Ошибка в setAdapter #2
goodi_tomsk,
Цитата Сообщение от goodi_tomsk Посмотреть сообщение
quotesList
null, видимо
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
08.05.2016, 13:06  [ТС]     Ошибка в setAdapter #3
YuraAAA, а почему он у меня null получился? Никак не пойму...
fraley
90 / 90 / 31
Регистрация: 24.05.2015
Сообщений: 252
08.05.2016, 16:16     Ошибка в setAdapter #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();
        }
    }
}
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
08.05.2016, 17:39  [ТС]     Ошибка в setAdapter #5
fraley, а как этот код будет выглядеть в фрагменте? (я еще пока плаваю с пониманием контекста )
fraley
90 / 90 / 31
Регистрация: 24.05.2015
Сообщений: 252
08.05.2016, 19:55     Ошибка в setAdapter #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;
    }
}
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
09.05.2016, 07:34  [ТС]     Ошибка в setAdapter #7
fraley, а при смене ориентации httpзапрос прервется и пойдёт заново? Что нужно сохранить/передать в Saveinstancestate?
fraley
90 / 90 / 31
Регистрация: 24.05.2015
Сообщений: 252
09.05.2016, 15:38     Ошибка в setAdapter #8
goodi_tomsk, есть такой вариант - можно в манифесте в активити добавить:
XML
1
android:configChanges="orientation|screenSize"
Тогда активити не будет перерисовываться.
Но гугл вроде пишет что это плохая практика.
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
10.05.2016, 12:00  [ТС]     Ошибка в setAdapter #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)
Паблито
не спать!
1882 / 1616 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
10.05.2016, 12:01     Ошибка в setAdapter #10
Цитата Сообщение от fraley Посмотреть сообщение
Но гугл вроде пишет что это плохая практика.
нормальная практика
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
10.05.2016, 12:07  [ТС]     Ошибка в setAdapter #11
Паблито, вот и чего я тут наворотил https://www.dropbox.com/sh/3qw7gqat3...6LISVXgYa?dl=0
fraley
90 / 90 / 31
Регистрация: 24.05.2015
Сообщений: 252
10.05.2016, 12:17     Ошибка в setAdapter #12
goodi_tomsk, при каком сценарии у вас NullPointerException?
Насколько я понимаю вы поменяли код и... ванговать я не умею.
Попробуйте воспользоваться дебаггером.
Очень полезная вещь.

Паблито, почему тогда многие пишут что это плохая практика?
goodi_tomsk
4 / 1 / 0
Регистрация: 12.05.2015
Сообщений: 67
11.05.2016, 09:04  [ТС]     Ошибка в setAdapter #13
пришел к выводу что надо перенести показ прогресс диалога в onResume. И вызов асинкТаска.
Yandex
Объявления
11.05.2016, 09:04     Ошибка в setAdapter
Ответ Создать тему
Опции темы

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