NullPoinerException в RecyclerView.Adapter

372
31 января 2017, 20:52

Необходимо в обработчике нажатия запустить новую активити, изменив view компонеты, которые хранит ее xml представление.

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {
    private static final String TAG = "NewsAdapter";
    private static ArrayList<Datum> mDataset;
    private static Context context;

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView testTextCV;
        private TextView testTextCV2;
        private ImageView imageViewCV;
        private TextView newsFullTitle;
        private TextView newsFullCreatedAt;
        private TextView newsFullContent;
        private ImageView newsFullImage;
        private static Datum newForFullDisplaying;

        public ViewHolder(View v) {
            super(v);
            testTextCV = (TextView) v.findViewById(R.id.testTextCV);
            testTextCV2 = (TextView) v.findViewById(R.id.testTextCV2);
            imageViewCV = (ImageView) v.findViewById(R.id.imageViewCV);
            newsFullTitle = (TextView) v.findViewById(R.id.newsFullTitle);
            newsFullCreatedAt = (TextView) v.findViewById(R.id.newsFullCreatedAt);
            newsFullContent = (TextView) v.findViewById(R.id.newsFullContent);
            newsFullImage = (ImageView) v.findViewById(R.id.newsFullImage);
            context = v.getContext();
            v.setOnClickListener(this);
        }
        public TextView getTestTextCV() {
            return testTextCV;
        }
        public TextView getTestTextCV2() {
            return testTextCV2;
        }
        public ImageView getImageCV() {
            return imageViewCV;
        }

        @Override
        public void onClick(View v) {
            Log.d(TAG, "Element " + getAdapterPosition() + " clicked.");
            newsFullTitle.setText("SomeTitle");
            newsFullContent.setText("SomeContent");
            //etc
            Intent intent = new Intent(context, NewsFullScreenActivity.class);
            context.startActivity(intent);
        }
    }

    public NewsAdapter(ArrayList<Datum> myDataset) {
        this.mDataset = myDataset;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    //Создание нового view
        View v = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.one_news_carview, viewGroup, false);
        return new ViewHolder(v);
    }
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int position) {
        Log.d(TAG, "Element " + position + " set.");
        //Получение эемента из датасет в этой позиции и замена контента вью
        //этим элементом
        viewHolder.getTestTextCV().setText(mDataset.get(position).getTitle());
        viewHolder.getTestTextCV2().setText(mDataset.get(position).getUpdatedAt());
    }
    @Override
    public int getItemCount() {
        return mDataset.size();
    }
}

 public class NewsFullScreenActivity extends AppCompatActivity {
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.news_full_screen);
    }
}

При попытке установить значения

newsFullTitle.setText("SomeTitle");
newsFullContent.setText("SomeContent");

вылетает ошибка:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference at game.normal.com.normalgame4.news.news.recycler.view.all.NewsAdapter$ViewHolder.onClick(NewsAdapter.java:78)

Очевидно что findViewById возвращает null. Кто-то может подсказать почему вьюхи хранят null если в конструкторе я их нашел?

Answer 1

Вы должны в методе onBindViewHolder реализовывать такие функции как onClick и т.д.

перенесите их туда.

@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position) {
     Log.d(TAG, "Element " + position + " set.");
     viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Log.d(TAG, "Element " + getAdapterPosition() + " clicked.");
               newsFullTitle.setText("SomeTitle");
               newsFullContent.setText("SomeContent");
               //etc
               Intent intent = new Intent(context, NewsFullScreenActivity.class);
               context.startActivity(intent);
            }
     });
     //Получение эемента из датасет в этой позиции и замена контента вью
     //этим элементом
     viewHolder.getTestTextCV().setText(mDataset.get(position).getTitle());
     viewHolder.getTestTextCV2().setText(mDataset.get(position).getUpdatedAt());
}
READ ALSO
Long cannot be cast to JSONObject

Long cannot be cast to JSONObject

ЗдравствуйтеХочу распарсить вот этот JSON файл

412
Продумывание логики &ldquo;Морского боя&rdquo;

Продумывание логики “Морского боя”

ЗдравствуйтеСобираюсь писать Морской бой для Android и вот начал, как правило, с логики

317
Добавить ReactJS в проект

Добавить ReactJS в проект

Подскажите начинающему: есть сверстанная страничка со всякими мультиселектами, поиском по ней и так далееХочу переписать всё jQuery на React,...

459
Блок с описанием при клике на картинку [требует правки]

Блок с описанием при клике на картинку [требует правки]

Есть CSS, который позволяет делать такие эффекты с изображениями; но проблема в том, что как только всплывает изображение (при клике на него),...

377