#android #json #nullpointerexception #reddit
#Android #json #исключение nullpointerexception #Reddit
Вопрос:
Итак, моя проблема в том, что мой адаптер, похоже, выдает исключения null для большинства данных, которые я проанализировал из источника JSON http://www.reddit.com/r/hot/.json?sort=newamp;count=25.
Что я пробовал: 1. Я зарегистрировал все объекты, создаваемые в результате синтаксического анализа, чтобы подтвердить, что я получил данные. 2. Я завернул код-нарушитель в инструкции try catch, чтобы выяснить, когда он работает, а когда нет.
Что я узнал: 1. Действительно, данные поступают из .документ json 2. Логика, похоже, работает только для трех строк в моем представлении списка, остальные возвращают null
Я предполагаю, что, возможно, некоторые запросы json возвращают null, но я понятия не имею, почему.
Оскорбительный код
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MainActivity.MyViewHolder holder;
if (convertView == null){
convertView = layoutInflater.inflate(R.layout.row, parent,false);
holder = new MainActivity.MyViewHolder();
holder.listName = (TextView)convertView.findViewById(R.id.title);
holder.authorName = (TextView)convertView.findViewById(R.id.author);
holder.thumbnail = (ImageView)convertView.findViewById(R.id.thumbnail);
holder.goButton = (Button)convertView.findViewById(R.id.go_button);
}else {
holder = (MainActivity.MyViewHolder) convertView.getTag();
}
convertView.setOnClickListener(this);
ListData data = topics.get(position);
try {
Line81 holder.data = data;
holder.listName.setText(data.getTitle());
holder.authorName.setText(data.getAuthor());
Log.v(DEBUG_TAG, "Cell Created");
}catch (Exception e){
e.printStackTrace();
Log.v(DEBUG_TAG,"Cell Not Created Due to: ",e);
}
if(data.getImageUrl()!=null){
try {
Line93 holder.thumbnail.setTag(data.getImageUrl());
Drawable drawable = imgGet.loadImage(this, holder.thumbnail);
if (drawable != null) {
holder.thumbnail.setImageDrawable(drawable);
} else {
holder.thumbnail.setImageResource(R.drawable.filler_icon);
}
}catch (Exception e){
e.printStackTrace();
Log.v(DEBUG_TAG,"no image: ",e);
}
return convertView;
Сообщения об ошибках
07-07 10:45:27.396 6606-6606/com.google.android.gms.redditviewr.app V/LOGTAG!!!﹕ Cell Not Created Due to:
java.lang.NullPointerException
at Adapters.RedditDataAdapter.getView(RedditDataAdapter.java:81)
07-07 10:45:27.404 6606-6606/com.google.android.gms.redditviewr.app V/LOGTAG!!!﹕ no image:
java.lang.NullPointerException
at Adapters.RedditDataAdapter.getView(RedditDataAdapter.java:93)
Моя логика синтаксического анализа JSON
try {
JSONObject response = new JSONObject(result);
JSONObject data = response.getJSONObject("data");
JSONArray hotTopics = data.getJSONArray("children");
Log.v(DEBUG_TAG, hotTopics.toString());
for(int i=0; i<hotTopics.length(); i ) {
JSONObject topic = hotTopics.getJSONObject(i).getJSONObject("data");
ListData item = new ListData();
item.setTitle(topic.getString("title"));
item.setAuthor(topic.getString("author"));
item.setImageUrl(topic.getString("thumbnail"));
item.setPostTime(topic.getString("created_utc"));
item.setrScore(topic.getString("score"));
topicdata.add(item);
Log.v(DEBUG_TAG,topicdata.toString());
}
} catch (JSONException e) {
e.printStackTrace();
}
this.activity.setTopics(topicdata);
}
Комментарии:
1. какие строки соответствуют 81 и 93?
2. 81—> holder.data = данные; 93—> holder.thumbnail.setTag(data.getImageUrl());
3. @EugenMartynov какая логика за этим стоит?
4. Вы хотите использовать его повторно. Но вы не сохраняете ссылку на holder
Ответ №1:
Измените это:
if (convertView == null){
convertView = layoutInflater.inflate(R.layout.row, parent,false);
holder = new MainActivity.MyViewHolder();
holder.listName = (TextView)convertView.findViewById(R.id.title);
holder.authorName = (TextView)convertView.findViewById(R.id.author);
holder.thumbnail = (ImageView)convertView.findViewById(R.id.thumbnail);
holder.goButton = (Button)convertView.findViewById(R.id.go_button);
}
К этому:
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.row, parent,false);
holder = new MainActivity.MyViewHolder();
holder.listName = (TextView)convertView.findViewById(R.id.title);
holder.authorName = (TextView)convertView.findViewById(R.id.author);
holder.thumbnail = (ImageView)convertView.findViewById(R.id.thumbnail);
holder.goButton = (Button)convertView.findViewById(R.id.go_button);
convertView.setTag(holder);
}
Комментарии:
1. Что ж, вы были абсолютно правы. Спасибо! К сожалению для меня, это выявило только еще одну дыру в моем коде, но вы устранили эту конкретную ошибку.