在操作栏上按下后退按钮后 RecyclerView 不显示
RecyclerView not showing after back button pressed on actionbar
您好,我正在构建一个应用程序,其中 MainActivity 显示某些类别的 GridView。单击每个类别时,另一个 Activity(GridItemActivity) 打开,其中包含一些 RecyclerView。此外,当单击 RecyclerView 时,GalleryActivity 打开以显示所选列表的内容(ImageView 和 TextView)。在清单文件中,我设置了每个 Activity 的 parents,如下所示:
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>
问题是:
当我点击 GalleryActivity 的 ActionBar 上的后退图标时,GridActivity 按预期显示但随后没有内容(我的 RecyclerView 项目没有展示)。 ActionBar 标题也更改为 App 名称。
在回收器适配器上,设置 onClick 监听器的最佳方法是什么。它应该在 onBindViewHolder 方法上还是在 ViewHolder class 中,或者它应该在哪里。如果它在 ViewHolder class 那么请告诉我如何在我的代码中实现它,因为我有点遗漏了一些东西。
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") && 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),这解决了问题。
@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);
}
您好,我正在构建一个应用程序,其中 MainActivity 显示某些类别的 GridView。单击每个类别时,另一个 Activity(GridItemActivity) 打开,其中包含一些 RecyclerView。此外,当单击 RecyclerView 时,GalleryActivity 打开以显示所选列表的内容(ImageView 和 TextView)。在清单文件中,我设置了每个 Activity 的 parents,如下所示:
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>
问题是:
当我点击 GalleryActivity 的 ActionBar 上的后退图标时,GridActivity 按预期显示但随后没有内容(我的 RecyclerView 项目没有展示)。 ActionBar 标题也更改为 App 名称。
在回收器适配器上,设置 onClick 监听器的最佳方法是什么。它应该在 onBindViewHolder 方法上还是在 ViewHolder class 中,或者它应该在哪里。如果它在 ViewHolder class 那么请告诉我如何在我的代码中实现它,因为我有点遗漏了一些东西。
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") && 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),这解决了问题。
@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);
}