ListView из синтаксического анализа JSON иногда действует в основном как null, что происходит?

#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. Что ж, вы были абсолютно правы. Спасибо! К сожалению для меня, это выявило только еще одну дыру в моем коде, но вы устранили эту конкретную ошибку.