RecyclerView не отображается после нажатия кнопки «Назад» на панели действий

#java #android #gridview #android-recyclerview

#java #Android #просмотр сетки #android-recyclerview

Вопрос:

Привет, я создаю приложение, в котором MainActivity отображает сетку некоторых категорий. При нажатии на каждую категорию открывается другое действие (GridItemActivity) с некоторым RecyclerView. Также при нажатии на RecyclerView открывается GalleryActivity для отображения содержимого (ImageView и TextView) для выбранного списка. В файле манифеста я установил родительские элементы каждого действия, как показано ниже:

AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gridrecycler">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".GalleryActivity">
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".GridItemActivity"/>
        </activity>
        <activity android:name=".GridItemActivity" >
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity"/>
        </activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
  

Проблема в том:

  1. Когда я нажимаю на значок «Назад» на панели действий GalleryActivity, ожидаемо отображается GridActivity, но затем без содержимого (мои элементы RecyclerView не отображаются). Также заголовок панели действий меняется на название приложения.

  2. Каков наилучший способ настройки прослушивателя onClick на адаптере recycler? Должно ли это быть в методе onBindViewHolder или в классе ViewHolder или где это должно быть. Если это относится к классу ViewHolder, то, пожалуйста, покажите мне, как реализовать это в моем коде, потому что я чего-то не понимаю.

GridItemActivity.java

 package com.example.gridrecycler;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;

import java.util.ArrayList;

public class GridItemActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private ArrayList<String> mNames = new ArrayList<>();

    private int[] images = {
            R.drawable.apples,R.drawable.bakes,R.drawable.banana,R.drawable.craves,
            R.drawable.grapes,R.drawable.orange,R.drawable.pineapple,R.drawable.redgrapes,
            R.drawable.strawberrys,R.drawable.watermelons
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_grid_item);
        //enable back Button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Log.d(TAG, "onCreate: started");

        Log.d(TAG, "getIncomingItent: checking for incoming intents");
        if (getIntent().hasExtra("name")){
            Log.d(TAG, "getIncomingItent: found intent extra");

            String categoryName = getIntent().getStringExtra("name");
            setActionBarTitle(categoryName);

            initImageBitmaps();
        }
    }

    private void setActionBarTitle(String title)
    {
        getSupportActionBar().setTitle(title);
    }

    private void initImageBitmaps(){
        Log.d(TAG, "initImageBitmaps: preparing bitmaps");

        mNames.add("Apple");
        mNames.add("Bakes");
        mNames.add("Banana");
        mNames.add("Craves");
        mNames.add("Grapes");
        mNames.add("Oranges");
        mNames.add("Pineapple");
        mNames.add("Pepper");
        mNames.add("Strawberry");
        mNames.add("Watermelon");

        initRecyclerView();
    }

    private void initRecyclerView(){
        Log.d(TAG, "initRecyclerView: init recyclerview");
        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, mNames, images);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }
}
  

RecyclerViewAdapter.java

 package com.example.gridrecycler;

import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private static final String TAG = "RecyclerViewAdapter";

    private ArrayList<String> mImageNames = new ArrayList<>();
    private int[] mImages;
    private Context mContext;

    public RecyclerViewAdapter(Context mContext, ArrayList<String> mImageNames, int[] mImages) {
        this.mImageNames = mImageNames;
        this.mImages = mImages;
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_listitem, viewGroup, false);
        ViewHolder holder = new ViewHolder(view, mContext, mImages, mImageNames);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int i) {
        Log.d(TAG, "onBindViewHolder: called");
        viewHolder.image.setImageResource(mImages[i]);
        viewHolder.imageName.setText(mImageNames.get(i));
        viewHolder.parentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: clicked on : " mImageNames.get(i));
                Toast.makeText(mContext, mImageNames.get(i), Toast.LENGTH_SHORT).show();

                Intent intent = new Intent(mContext, GalleryActivity.class);
                intent.putExtra("image_url", mImages[i]);
                intent.putExtra("image_name", mImageNames.get(i));
                mContext.startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() {
        return mImageNames.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        ImageView image;
        TextView imageName;
        RelativeLayout parentLayout;
        int[] images;
        ArrayList<String> mImageNames = new ArrayList<>();
        Context context;

        public ViewHolder(@NonNull View itemView, Context context, int[] images, ArrayList<String> mImageNames) {
            super(itemView);
            image = itemView.findViewById(R.id.image);
            imageName = itemView.findViewById(R.id.image_name);
            parentLayout = itemView.findViewById(R.id.parent_layout);

            itemView.setOnClickListener(this);
            this.context = context;
            this.images = images;
        }

        @Override
        public void onClick(View v) {
            //Intent intent = new Intent(mContext, GalleryActivity.class);
            //intent.putExtra("image_url", mImages[getAdapterPosition()]);
            //intent.putExtra("image_name", mImageNames.get(getAdapterPosition()));
            //mContext.startActivity(intent);
        }
    }
}
  

GalleryActivity.java

 package com.example.gridrecycler;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;

public class GalleryActivity extends AppCompatActivity {
    private static final String TAG = "GalleryActivity";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gallery);
        Log.d(TAG, "onCreate: started");
        getIncomingIntent();

    }

    private void getIncomingIntent()
    {
        Log.d(TAG, "getIncomingItent: checking for incoming intents");
        if (getIntent().hasExtra("image_url") amp;amp; getIntent().hasExtra("image_name")){
            Log.d(TAG, "getIncomingItent: found intent extra");

            int imageUrl = getIntent().getIntExtra("image_url", 000);
            String imageName = getIntent().getStringExtra("image_name");
            getSupportActionBar().setTitle(imageName);

            setImage(imageUrl, imageName);
        }
    }

    private void setImage(int imageUrl, String imageName){
        Log.d(TAG, "setImage: setting image url and name to widgets");
        TextView name = findViewById(R.id.image_description);
        name.setText(imageName);

        ImageView image = findViewById(R.id.image);
        image.setImageResource(imageUrl);
    }
}
  

Извините, что задаю слишком много вопросов. Заранее спасибо.

Ответ №1:

Что касается первого вопроса (1), это решило проблему.

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
    }

    return super.onOptionsItemSelected(item);
}
  

Для второго это помогло

 public ViewHolder(@NonNull View itemView, Context context, int[] images, ArrayList<String> mImageNames) {
        super(itemView);
        image = itemView.findViewById(R.id.image);
        imageName = itemView.findViewById(R.id.image_name);
        parentLayout = itemView.findViewById(R.id.parent_layout);

        itemView.setOnClickListener(this);
        this.context = context;
        this.images = images;
        this.mImageNames = mImageNames;
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(mContext, GalleryActivity.class);
        intent.putExtra("image_url", mImages[getAdapterPosition()]);
        intent.putExtra("image_name", mImageNames.get(getAdapterPosition()));
        mContext.startActivity(intent);
    }