Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RecyclerView奇怪的endAllStagingAnimators错误_Android_Android Intent_Android Recyclerview - Fatal编程技术网

Android RecyclerView奇怪的endAllStagingAnimators错误

Android RecyclerView奇怪的endAllStagingAnimators错误,android,android-intent,android-recyclerview,Android,Android Intent,Android Recyclerview,我在RecyclerView中显示项目时遇到了非常奇怪的问题。首先,它不显示项目(奇怪的D/OpenGLRenderer:endAllStagingAnimators在0x6dd9c400(CardView)上显示,句柄为0x6861d090,以前从未出现过),后退按钮不起作用(它出现但没有反应)。好的,我们开始吧。我有一些片段(这是带有回收视图的片段: 我也有一个与之相同的片段,但其中一个片段包含厨房类型,第二个片段包含用餐类型。当我单击其中一个列表项时,在这两种情况下,操作都会将我重定向到

我在
RecyclerView
中显示项目时遇到了非常奇怪的问题。首先,它不显示项目(奇怪的
D/OpenGLRenderer:endAllStagingAnimators在0x6dd9c400(CardView)上显示,句柄为0x6861d090
,以前从未出现过),后退按钮不起作用(它出现但没有反应)。好的,我们开始吧。我有一些
片段
(这是带有
回收视图的片段

我也有一个与之相同的片段,但其中一个片段包含厨房类型,第二个片段包含用餐类型。当我单击其中一个列表项时,在这两种情况下,操作都会将我重定向到新活动

当我点击其中一些项目f.e first one时,这里就是这个
RecyclerView
适配器中发生的事情:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    KitchenTypeItem kitchenItem = kitchenItems.get(position);
    holder.kitchenTypeName.setText("Kuchnia " + kitchenItem.getKitchenName());
    holder.kitchenTypeImgThumbnail.setImageResource(kitchenItem.getKitchenThumbnail());
    holder.kitchenTypeDescription.setText(kitchenItem.getKitchenDescription());

    holder.setClickListener(new ItemClickListener() {

        @Override
        public void onClick(View view, int position) {
            KitchenTypeItem kitchenItem = kitchenItems.get(position);

            Intent intent = new Intent(context, RecipeActivity.class);
            intent.putExtra(TYPE_NAME, kitchenItem.getKitchenName());
            intent.putExtra(DISPLAY_TYPE, 0);
            context.startActivity(intent);
        }

    });
}
当我按下其中一项时,我会向新活动发送两个参数:
TYPE\u NAME
-帮助我了解我是否将使用新打开的活动从服务器下载包含
厨房类型
菜谱或
膳食类型
菜谱和
显示类型
-用于向MySQL数据库发送请求。这是来自第二个适配器的一些代码(您可以使用几乎相同的代码):

这是我在新打开的活动中得到的信息:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/recipe_activity_coordinator_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".RecipeActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/log_reg_background"
        android:orientation="vertical">

        <!-- Toolbar -->
        <include
            android:id="@+id/toolbar"
            layout="@layout/tool_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/activity_recipe_recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="8dp"
            android:clipToPadding="false"/>

    </LinearLayout>

</android.support.design.widget.CoordinatorLayout>
public class RecipeActivity extends AppCompatActivity {

    private static String TAG = RecipeActivity.class.getSimpleName().toString();

    private ArrayList<RecipeItem> recipeItems;
    private RecipeAdapter recipeAdapter;
    private ProgressDialog pDialog;
    private CoordinatorLayout coordinatorLayout;
    private BroadcastReceiver broadcastReceiver;
    private int offset;

    private String typeName;
    private int displayType;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recipe);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        offset = 0;

        recipeItems = new ArrayList<>();

        coordinatorLayout = (CoordinatorLayout) findViewById(
                R.id.recipe_activity_coordinator_layout);

        RecyclerView recipeRecyclerView  = (RecyclerView) findViewById(
                R.id.activity_recipe_recyclerview);

        recipeAdapter = new RecipeAdapter(getApplicationContext(), recipeItems);

        recipeAdapter.setCoordinatorLayout(coordinatorLayout);

        recipeRecyclerView.setHasFixedSize(true);
        recipeRecyclerView.setAdapter(recipeAdapter);
        recipeRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        recipeRecyclerView.setItemAnimator(new DefaultItemAnimator());

        getBundleExtras();  // Getting Argument Passed By Meal Or Kitchen Type Adapter
        setActivityTitle(); // Setting Title Depending On Adapter Type

        setBroadcastReceiver();
    }

    @Override
    public void onResume() {
        registerReceiver(broadcastReceiver, new IntentFilter(
                "android.net.conn.CONNECTIVITY_CHANGE"));
        Log.d(TAG, "Zarejestrowano BroadcastReceiver'a");
        super.onResume();
    }

    @Override
    public void onPause() {
        unregisterReceiver(broadcastReceiver);
        Log.d(TAG, "Wyrejestrowano BradcasReceiver'a");
        super.onPause();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.home) {
            NavUtils.navigateUpFromSameTask(this);

            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private void getBundleExtras() {
        Bundle extras = getIntent().getExtras();
        // Static Fields Could Bo From MealAdapter Aswell
        typeName = extras.getString(KitchenTypeAdapter.TYPE_NAME);
        displayType = extras.getInt(KitchenTypeAdapter.DISPLAY_TYPE);
        Log.d(TAG, "Trzymano dane z listy fragmentu: typeName=" + typeName + ", displayType=" +
                displayType);
    }

    private void setActivityTitle() {
        switch (displayType) {
            case 0: {
                setTitle(getString(R.string.nav_kitchen_type));
                Log.d(TAG, "Ustawiono tytuł: " + displayType);
                break;
            }
            case 1: {
                setTitle(getString(R.string.nav_meal_type));
                Log.d(TAG, "Ustawiono tytuł: " + displayType);
                break;
            }
        }
    }

    private void setBroadcastReceiver() {
        broadcastReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
                        Context.CONNECTIVITY_SERVICE);
                NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
                if (activeNetwork == null) {
                    Log.d(TAG, "Brak połączenia. Pokazuję komuikat.");
                    showSnackbarInfo(getString(R.string.err_msg_connection_problem),
                            R.color.snackbar_error_msg);
                } else {
                    if (recipeItems.isEmpty()) {
                        Log.d(TAG, "Jest połączenie. Listy puste. Pobieram przepisy.");
                        getRecipes();
                    } else {
                        Log.d(TAG, "Jest połączenie. Listy pełne. Nic nie robię.");
                    }
                }
            }

        };
    }

    private void getRecipes() {
        switch (displayType) {
            case 0: {
                Log.d(TAG, "Pobieranie przepisów z warunkiem typ_kuchnii");
                getKitchenTypeRecipes();
                break;
            }
            case 1: {
                Log.d(TAG, "Pobieranie przepisów z warunkiem typ_posiłku");
                getMealTypeRecipes();
                break;
            }
        }
    }

    private void getKitchenTypeRecipes() {
        JsonArrayRequest kitchenTypeRecipesReq = new JsonArrayRequest(prepareGetMethodUrl(),
                new Response.Listener<JSONArray>() {

                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d("odpowiedz", "Odpowiedź przepisów: " + response.toString());
                        Log.d("odpowiedz", "Dlugosc response: " + Integer.toString(
                                response.length()));
                        if (response.length() == 0) {
                            showSnackbarInfo("Na serwerze nic nie ma (kitchen type)", R.color.snackbar_info_msg);
                        } else {
                            for (int i = 0; i < response.length(); i++) {
                                try {
                                    JSONObject jObj = response.getJSONObject(i);
                                    RecipeItem recipeItem = new RecipeItem();
                                    recipeItem.setRecipeUniqueID(jObj.getString("unique_id"));
                                    recipeItem.setRecipeTitle(jObj.getString("title"));
                                    recipeItem.setRecipeImgThumbnailLink(jObj.getString(
                                            "img_tumbnail_link"));
                                    recipeItem.setRecipeAddAte(jObj.getString("add_date"));
                                    recipeItem.setRecipeKitchenType(jObj.getString("kitchen_type"));
                                    recipeItem.setRecipeMealType(jObj.getString("meal_type"));
                                    recipeItem.setRecipeLikeCount(jObj.getString("like_count"));

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }
                            recipeAdapter.notifyItemRangeInserted(recipeItems.size(),
                                    response.length());
                        }
                    }

                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e("odpowiedz", "Błąd pobierania przepisów (kichen type): " +
                                Integer.toString(error.networkResponse.statusCode));

                        showSnackbarInfo(Integer.toString(error.networkResponse.statusCode),
                                R.color.snackbar_error_msg);
                    }

                });
        AppController.getInstance().addToRequestQueue(kitchenTypeRecipesReq);
    }

    private void getMealTypeRecipes() {
        JsonArrayRequest mealTypeRecipesReq = new JsonArrayRequest(prepareGetMethodUrl(),
                new Response.Listener<JSONArray>() {

                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d("odpowiedz", "Odpowiedź przepisów: " + response.toString());
                        Log.d("odpowiedz", "Dlugosc response: " + Integer.toString(
                                response.length()));
                        if (response.length() == 0) {
                            showSnackbarInfo("Na serwerze nic nie ma (meal_type)",
                                    R.color.snackbar_info_msg);
                        } else {
                            for (int i = 0; i < response.length(); i++) {
                                try {
                                    JSONObject jObj = response.getJSONObject(i);
                                    RecipeItem recipeItem = new RecipeItem();
                                    recipeItem.setRecipeUniqueID(jObj.getString("unique_id"));
                                    recipeItem.setRecipeTitle(jObj.getString("title"));
                                    recipeItem.setRecipeImgThumbnailLink(jObj.getString(
                                            "img_tumbnail_link"));
                                    recipeItem.setRecipeAddAte(jObj.getString("add_date"));
                                    recipeItem.setRecipeKitchenType(jObj.getString("kitchen_type"));
                                    recipeItem.setRecipeMealType(jObj.getString("meal_type"));
                                    recipeItem.setRecipeLikeCount(jObj.getString("like_count"));

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }
                            recipeAdapter.notifyItemRangeInserted(recipeItems.size(),
                                    response.length());
                        }
                    }

                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                            Log.e("odpowiedz", "Błąd pobierania przepisów (meal type): " +
                                    Integer.toString(error.networkResponse.statusCode));

                        showSnackbarInfo(Integer.toString(error.networkResponse.statusCode),
                                R.color.snackbar_error_msg);
                    }

                });
        AppController.getInstance().addToRequestQueue(mealTypeRecipesReq);
    }

    private String prepareGetMethodUrl() {
        switch (displayType) {
            case 0: {
                return AppConfig.URL_GETRECIPESBYKITCHENTYPE + "?kitchen_type=" + typeName +
                        "&offset=" + Integer.toString(offset);
            }

            case 1: {
                return AppConfig.URL_GETRECIPESBYMEALTYPE + "?meal_type=" + typeName +
                        "&offset=" + Integer.toString(offset);
            }

            default:
                return null;
        }
    }

    // Showing Dialog Window
    private void showDialog() {
        if (!pDialog.isShowing()) {
            pDialog.show();
        }
    }

    // Hiding Dialog Window
    private void hideDialog() {
        if (pDialog.isShowing()) {
            pDialog.dismiss();
        }
    }

    // Fucntion Showing Text In Snackbar
    private void showSnackbarInfo(String info, int textColor) {
        Snackbar snackbar = Snackbar.make(coordinatorLayout, info, Snackbar.LENGTH_LONG);

        View sbView = snackbar.getView();
        TextView sbText = (TextView) sbView.findViewById(android.support.design.R.id.snackbar_text);
        sbText.setTextColor(ContextCompat.getColor(getApplicationContext(), textColor));

        snackbar.show();
    }
}

正如您所看到的,尽管
RecipeAdapter
制作正确,但没有任何不愉快之处,我认为:

这是代码:

public class RecipeAdapter extends RecyclerView.Adapter<RecipeAdapter.ViewHolder> {

    private static String TAG = RecipeAdapter.class.getSimpleName().toString();

    private Context context;
    private ArrayList<RecipeItem> recipeItems;
    private CoordinatorLayout coordinatorLayout;

    public RecipeAdapter(Context context, ArrayList<RecipeItem> recipeItems) {
        this.context = context;
        this.recipeItems = recipeItems;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recipe_item, parent,
                false);

        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        RecipeItem recipeItem = recipeItems.get(position);
        Picasso.with(context).load(recipeItem.getRecipeImgThumbnailLink()).into(
                holder.recipeItemImgThumbnail);
        holder.recipeItemTitle.setText(recipeItem.getRecipeTitle());
        holder.recipeItemKitchenMealType.setText("Kuchnia " + recipeItem.getRecipeKitchenType() +
                ", " + recipeItem.getRecipeMealType());
        holder.recipeItemAddDate.setText(recipeItem.getRecipeAddDate());
        holder.recipeItemLikeCount.setText(recipeItem.getRecipeLikeCount());
        holder.setClickListener(new ItemClickListener2() {

            @Override
            public void onClick(View view, int position, boolean isLongClick) {
                if (!isLongClick) {
                    // go to recipes site
                } else {
                    RecipeItem recipeItem = recipeItems.get(position);
                    FragmentActivity fragmentActivity = (FragmentActivity)(context);
                    FragmentManager fragmentManager = fragmentActivity.getSupportFragmentManager();
                    RecipeAddDialogFragment recipeDialogFragment = new RecipeAddDialogFragment();
                    Log.d(TAG, "Ustawiono recipeUniqueId, coordinatorLayout oraz " +
                            "recipeDialogFragment w klasie RecipeAddDialogFragment");
                    recipeDialogFragment.setReferences(recipeItem.getRecipeUniqueID(),
                            coordinatorLayout, recipeDialogFragment);

                    Log.d(TAG, "Uruchamiam okno dialogowe RecipeAddDialogFragment");
                    recipeDialogFragment.show(fragmentManager, "recipeDialogFragment");
                }
            }

        });
    }

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

    // Recipe Item Holder
    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,
            View.OnLongClickListener {

        private ImageView recipeItemImgThumbnail;
        private TextView recipeItemTitle;
        private TextView recipeItemKitchenMealType;
        private TextView recipeItemAddDate;
        private TextView recipeItemLikeCount;
        private ItemClickListener2 clickListener2;

        public ViewHolder(View itemView) {
            super(itemView);
            recipeItemImgThumbnail = (ImageView) itemView.findViewById(
                    R.id.recipe_item_img_thumbnail);
            recipeItemTitle = (TextView) itemView.findViewById(R.id.recipe_item_title);
            recipeItemKitchenMealType = (TextView) itemView.findViewById(
                    R.id.recipe_item_kitchen_meal_type);
            recipeItemAddDate = (TextView) itemView.findViewById(R.id.recipe_item_add_date);
            recipeItemLikeCount = (TextView) itemView.findViewById(R.id.recipe_item_like_count);

            itemView.setOnClickListener(this);
            itemView.setOnLongClickListener(this);
        }

        public void setClickListener(ItemClickListener2 itemClickListener2) {
            this.clickListener2 = itemClickListener2;
        }

        @Override
        public void onClick(View view) {
            clickListener2.onClick(view, getAdapterPosition(), false);
        }

        @Override
        public boolean onLongClick(View view) {
            clickListener2.onClick(view, getAdapterPosition(), true);

            return true;
        }
    }

    public void setCoordinatorLayout(CoordinatorLayout coordinatorLayout) {
        this.coordinatorLayout = coordinatorLayout;
    }
}
公共类RecipeAdapter扩展了RecyclerView.Adapter{ 私有静态字符串标记=RecipeAdapter.class.getSimpleName().toString(); 私人语境; 私人ArrayList recipeItems; 私人协调人布局协调人布局; 公共RecipeAdapter(上下文,ArrayList recipeItems){ this.context=上下文; this.recipeItems=recipeItems; } @凌驾 public ViewHolder onCreateViewHolder(视图组父级,int-viewType){ 视图v=LayoutInflater.from(parent.getContext())。充气(R.layout.recipe_项,父项, 假); 返回新的视图持有者(v); } @凌驾 公共无效onBindViewHolder(ViewHolder,int位置){ RecipeItem RecipeItem=recipeItems.get(位置); Picasso.with(context).load(recipeItem.getRecipeImgThumbnailLink())到( 持有人。收款人(缩略图); holder.recipeItemTitle.setText(recipeItem.getRecipeittle()); holder.recipeItemKitchenMealType.setText(“Kuchnia”+recipeItem.getRecipeKitchenType())+ “,”+recipeItem.getRecipeMealType()); holder.recipeItemAddDate.setText(recipeItem.getRecipeAddDate()); holder.recipeItemLikeCount.setText(recipeItem.getRecipeLikeCount()); holder.setClickListener(新项目ClickListener2(){ @凌驾 公共void onClick(视图、int位置、布尔值isLongClick){ 如果(!isLongClick){ //转到食谱网站 }否则{ RecipeItem RecipeItem=recipeItems.get(位置); FragmentActivity FragmentActivity=(FragmentActivity)(上下文); FragmentManager FragmentManager=fragmentActivity.getSupportFragmentManager(); RecipeAddialogFragment recipeDialogFragment=新RecipeAddialogFragment(); Log.d(标签“Ustawiono recipeUniqueId、Coordinator Layout oraz”+ “recipeDialogFragment w klasie recipeDialogFragment”); recipeDialogFragment.setReferences(recipeItem.getRecipeUniqueID(), 协调布局,相互分离); Log.d(标记“Uruchamiam okno dialogowe RecipeAddialogFragment”); recipeDialogFragment.show(片段管理器,“recipeDialogFragment”); } } }); } @凌驾 public int getItemCount(){ 返回recipeItems.size(); } //食谱项目持有者 类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener, View.OnLongClickListener{ private ImageView RecipeItemg缩略图; 私有文本视图recipeItemTitle; 私有文本视图recipeItemKitchenMealType; 私有文本视图recipeItemAddDate; 私有文本视图recipeItemLikeCount; 私有项目clickListener2 clickListener2; 公共视图持有者(视图项视图){ 超级(项目视图); RecipeItem缩略图=(ImageView)itemView.findViewById( R.id.recipe\u item\u img\u缩略图); recipeItemTitle=(TextView)itemView.findViewById(R.id.recipe\u item\u title); recipeItemKitchenMealType=(TextView)itemView.findViewById( R.id.配方、项目、厨房、膳食、类型); recipeItemAddDate=(TextView)itemView.findViewById(R.id.recipe\u item\u add\u date); recipeItemLikeCount=(TextView)itemView.findViewById(R.id.recipe\u item\u like\u count); setOnClickListener(这个); setOnLongClickListener(此); } 公共无效设置ClickListener(项ClickListener2项ClickListener2){ this.clickListener2=项目clickListener2; } @凌驾 公共void onClick(视图){ 单击Listener2.onClick(视图,getAdapterPosition(),false); } @凌驾 仅长按公共布尔值(视图){ 单击Listener2.onClick(视图,getAdapterPosition(),true); 返回true; } } 公共无效设置CoordinatorLayout(CoordinatorLayout CoordinatorLayout){ this.coordinatorLayout=coordinatorLayout; } } 以下是该活动的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/recipe_activity_coordinator_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".RecipeActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/log_reg_background"
        android:orientation="vertical">

        <!-- Toolbar -->
        <include
            android:id="@+id/toolbar"
            layout="@layout/tool_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/activity_recipe_recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="8dp"
            android:clipToPadding="false"/>

    </LinearLayout>

</android.support.design.widget.CoordinatorLayout>
public class RecipeActivity extends AppCompatActivity {

    private static String TAG = RecipeActivity.class.getSimpleName().toString();

    private ArrayList<RecipeItem> recipeItems;
    private RecipeAdapter recipeAdapter;
    private ProgressDialog pDialog;
    private CoordinatorLayout coordinatorLayout;
    private BroadcastReceiver broadcastReceiver;
    private int offset;

    private String typeName;
    private int displayType;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recipe);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        offset = 0;

        recipeItems = new ArrayList<>();

        coordinatorLayout = (CoordinatorLayout) findViewById(
                R.id.recipe_activity_coordinator_layout);

        RecyclerView recipeRecyclerView  = (RecyclerView) findViewById(
                R.id.activity_recipe_recyclerview);

        recipeAdapter = new RecipeAdapter(getApplicationContext(), recipeItems);

        recipeAdapter.setCoordinatorLayout(coordinatorLayout);

        recipeRecyclerView.setHasFixedSize(true);
        recipeRecyclerView.setAdapter(recipeAdapter);
        recipeRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        recipeRecyclerView.setItemAnimator(new DefaultItemAnimator());

        getBundleExtras();  // Getting Argument Passed By Meal Or Kitchen Type Adapter
        setActivityTitle(); // Setting Title Depending On Adapter Type

        setBroadcastReceiver();
    }

    @Override
    public void onResume() {
        registerReceiver(broadcastReceiver, new IntentFilter(
                "android.net.conn.CONNECTIVITY_CHANGE"));
        Log.d(TAG, "Zarejestrowano BroadcastReceiver'a");
        super.onResume();
    }

    @Override
    public void onPause() {
        unregisterReceiver(broadcastReceiver);
        Log.d(TAG, "Wyrejestrowano BradcasReceiver'a");
        super.onPause();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.home) {
            NavUtils.navigateUpFromSameTask(this);

            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private void getBundleExtras() {
        Bundle extras = getIntent().getExtras();
        // Static Fields Could Bo From MealAdapter Aswell
        typeName = extras.getString(KitchenTypeAdapter.TYPE_NAME);
        displayType = extras.getInt(KitchenTypeAdapter.DISPLAY_TYPE);
        Log.d(TAG, "Trzymano dane z listy fragmentu: typeName=" + typeName + ", displayType=" +
                displayType);
    }

    private void setActivityTitle() {
        switch (displayType) {
            case 0: {
                setTitle(getString(R.string.nav_kitchen_type));
                Log.d(TAG, "Ustawiono tytuł: " + displayType);
                break;
            }
            case 1: {
                setTitle(getString(R.string.nav_meal_type));
                Log.d(TAG, "Ustawiono tytuł: " + displayType);
                break;
            }
        }
    }

    private void setBroadcastReceiver() {
        broadcastReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
                        Context.CONNECTIVITY_SERVICE);
                NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
                if (activeNetwork == null) {
                    Log.d(TAG, "Brak połączenia. Pokazuję komuikat.");
                    showSnackbarInfo(getString(R.string.err_msg_connection_problem),
                            R.color.snackbar_error_msg);
                } else {
                    if (recipeItems.isEmpty()) {
                        Log.d(TAG, "Jest połączenie. Listy puste. Pobieram przepisy.");
                        getRecipes();
                    } else {
                        Log.d(TAG, "Jest połączenie. Listy pełne. Nic nie robię.");
                    }
                }
            }

        };
    }

    private void getRecipes() {
        switch (displayType) {
            case 0: {
                Log.d(TAG, "Pobieranie przepisów z warunkiem typ_kuchnii");
                getKitchenTypeRecipes();
                break;
            }
            case 1: {
                Log.d(TAG, "Pobieranie przepisów z warunkiem typ_posiłku");
                getMealTypeRecipes();
                break;
            }
        }
    }

    private void getKitchenTypeRecipes() {
        JsonArrayRequest kitchenTypeRecipesReq = new JsonArrayRequest(prepareGetMethodUrl(),
                new Response.Listener<JSONArray>() {

                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d("odpowiedz", "Odpowiedź przepisów: " + response.toString());
                        Log.d("odpowiedz", "Dlugosc response: " + Integer.toString(
                                response.length()));
                        if (response.length() == 0) {
                            showSnackbarInfo("Na serwerze nic nie ma (kitchen type)", R.color.snackbar_info_msg);
                        } else {
                            for (int i = 0; i < response.length(); i++) {
                                try {
                                    JSONObject jObj = response.getJSONObject(i);
                                    RecipeItem recipeItem = new RecipeItem();
                                    recipeItem.setRecipeUniqueID(jObj.getString("unique_id"));
                                    recipeItem.setRecipeTitle(jObj.getString("title"));
                                    recipeItem.setRecipeImgThumbnailLink(jObj.getString(
                                            "img_tumbnail_link"));
                                    recipeItem.setRecipeAddAte(jObj.getString("add_date"));
                                    recipeItem.setRecipeKitchenType(jObj.getString("kitchen_type"));
                                    recipeItem.setRecipeMealType(jObj.getString("meal_type"));
                                    recipeItem.setRecipeLikeCount(jObj.getString("like_count"));

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }
                            recipeAdapter.notifyItemRangeInserted(recipeItems.size(),
                                    response.length());
                        }
                    }

                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e("odpowiedz", "Błąd pobierania przepisów (kichen type): " +
                                Integer.toString(error.networkResponse.statusCode));

                        showSnackbarInfo(Integer.toString(error.networkResponse.statusCode),
                                R.color.snackbar_error_msg);
                    }

                });
        AppController.getInstance().addToRequestQueue(kitchenTypeRecipesReq);
    }

    private void getMealTypeRecipes() {
        JsonArrayRequest mealTypeRecipesReq = new JsonArrayRequest(prepareGetMethodUrl(),
                new Response.Listener<JSONArray>() {

                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d("odpowiedz", "Odpowiedź przepisów: " + response.toString());
                        Log.d("odpowiedz", "Dlugosc response: " + Integer.toString(
                                response.length()));
                        if (response.length() == 0) {
                            showSnackbarInfo("Na serwerze nic nie ma (meal_type)",
                                    R.color.snackbar_info_msg);
                        } else {
                            for (int i = 0; i < response.length(); i++) {
                                try {
                                    JSONObject jObj = response.getJSONObject(i);
                                    RecipeItem recipeItem = new RecipeItem();
                                    recipeItem.setRecipeUniqueID(jObj.getString("unique_id"));
                                    recipeItem.setRecipeTitle(jObj.getString("title"));
                                    recipeItem.setRecipeImgThumbnailLink(jObj.getString(
                                            "img_tumbnail_link"));
                                    recipeItem.setRecipeAddAte(jObj.getString("add_date"));
                                    recipeItem.setRecipeKitchenType(jObj.getString("kitchen_type"));
                                    recipeItem.setRecipeMealType(jObj.getString("meal_type"));
                                    recipeItem.setRecipeLikeCount(jObj.getString("like_count"));

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }
                            recipeAdapter.notifyItemRangeInserted(recipeItems.size(),
                                    response.length());
                        }
                    }

                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                            Log.e("odpowiedz", "Błąd pobierania przepisów (meal type): " +
                                    Integer.toString(error.networkResponse.statusCode));

                        showSnackbarInfo(Integer.toString(error.networkResponse.statusCode),
                                R.color.snackbar_error_msg);
                    }

                });
        AppController.getInstance().addToRequestQueue(mealTypeRecipesReq);
    }

    private String prepareGetMethodUrl() {
        switch (displayType) {
            case 0: {
                return AppConfig.URL_GETRECIPESBYKITCHENTYPE + "?kitchen_type=" + typeName +
                        "&offset=" + Integer.toString(offset);
            }

            case 1: {
                return AppConfig.URL_GETRECIPESBYMEALTYPE + "?meal_type=" + typeName +
                        "&offset=" + Integer.toString(offset);
            }

            default:
                return null;
        }
    }

    // Showing Dialog Window
    private void showDialog() {
        if (!pDialog.isShowing()) {
            pDialog.show();
        }
    }

    // Hiding Dialog Window
    private void hideDialog() {
        if (pDialog.isShowing()) {
            pDialog.dismiss();
        }
    }

    // Fucntion Showing Text In Snackbar
    private void showSnackbarInfo(String info, int textColor) {
        Snackbar snackbar = Snackbar.make(coordinatorLayout, info, Snackbar.LENGTH_LONG);

        View sbView = snackbar.getView();
        TextView sbText = (TextView) sbView.findViewById(android.support.design.R.id.snackbar_text);
        sbText.setTextColor(ContextCompat.getColor(getApplicationContext(), textColor));

        snackbar.show();
    }
}

这是活动的主要代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/recipe_activity_coordinator_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".RecipeActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/log_reg_background"
        android:orientation="vertical">

        <!-- Toolbar -->
        <include
            android:id="@+id/toolbar"
            layout="@layout/tool_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/activity_recipe_recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="8dp"
            android:clipToPadding="false"/>

    </LinearLayout>

</android.support.design.widget.CoordinatorLayout>
public class RecipeActivity extends AppCompatActivity {

    private static String TAG = RecipeActivity.class.getSimpleName().toString();

    private ArrayList<RecipeItem> recipeItems;
    private RecipeAdapter recipeAdapter;
    private ProgressDialog pDialog;
    private CoordinatorLayout coordinatorLayout;
    private BroadcastReceiver broadcastReceiver;
    private int offset;

    private String typeName;
    private int displayType;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recipe);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        offset = 0;

        recipeItems = new ArrayList<>();

        coordinatorLayout = (CoordinatorLayout) findViewById(
                R.id.recipe_activity_coordinator_layout);

        RecyclerView recipeRecyclerView  = (RecyclerView) findViewById(
                R.id.activity_recipe_recyclerview);

        recipeAdapter = new RecipeAdapter(getApplicationContext(), recipeItems);

        recipeAdapter.setCoordinatorLayout(coordinatorLayout);

        recipeRecyclerView.setHasFixedSize(true);
        recipeRecyclerView.setAdapter(recipeAdapter);
        recipeRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        recipeRecyclerView.setItemAnimator(new DefaultItemAnimator());

        getBundleExtras();  // Getting Argument Passed By Meal Or Kitchen Type Adapter
        setActivityTitle(); // Setting Title Depending On Adapter Type

        setBroadcastReceiver();
    }

    @Override
    public void onResume() {
        registerReceiver(broadcastReceiver, new IntentFilter(
                "android.net.conn.CONNECTIVITY_CHANGE"));
        Log.d(TAG, "Zarejestrowano BroadcastReceiver'a");
        super.onResume();
    }

    @Override
    public void onPause() {
        unregisterReceiver(broadcastReceiver);
        Log.d(TAG, "Wyrejestrowano BradcasReceiver'a");
        super.onPause();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.home) {
            NavUtils.navigateUpFromSameTask(this);

            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private void getBundleExtras() {
        Bundle extras = getIntent().getExtras();
        // Static Fields Could Bo From MealAdapter Aswell
        typeName = extras.getString(KitchenTypeAdapter.TYPE_NAME);
        displayType = extras.getInt(KitchenTypeAdapter.DISPLAY_TYPE);
        Log.d(TAG, "Trzymano dane z listy fragmentu: typeName=" + typeName + ", displayType=" +
                displayType);
    }

    private void setActivityTitle() {
        switch (displayType) {
            case 0: {
                setTitle(getString(R.string.nav_kitchen_type));
                Log.d(TAG, "Ustawiono tytuł: " + displayType);
                break;
            }
            case 1: {
                setTitle(getString(R.string.nav_meal_type));
                Log.d(TAG, "Ustawiono tytuł: " + displayType);
                break;
            }
        }
    }

    private void setBroadcastReceiver() {
        broadcastReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
                        Context.CONNECTIVITY_SERVICE);
                NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
                if (activeNetwork == null) {
                    Log.d(TAG, "Brak połączenia. Pokazuję komuikat.");
                    showSnackbarInfo(getString(R.string.err_msg_connection_problem),
                            R.color.snackbar_error_msg);
                } else {
                    if (recipeItems.isEmpty()) {
                        Log.d(TAG, "Jest połączenie. Listy puste. Pobieram przepisy.");
                        getRecipes();
                    } else {
                        Log.d(TAG, "Jest połączenie. Listy pełne. Nic nie robię.");
                    }
                }
            }

        };
    }

    private void getRecipes() {
        switch (displayType) {
            case 0: {
                Log.d(TAG, "Pobieranie przepisów z warunkiem typ_kuchnii");
                getKitchenTypeRecipes();
                break;
            }
            case 1: {
                Log.d(TAG, "Pobieranie przepisów z warunkiem typ_posiłku");
                getMealTypeRecipes();
                break;
            }
        }
    }

    private void getKitchenTypeRecipes() {
        JsonArrayRequest kitchenTypeRecipesReq = new JsonArrayRequest(prepareGetMethodUrl(),
                new Response.Listener<JSONArray>() {

                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d("odpowiedz", "Odpowiedź przepisów: " + response.toString());
                        Log.d("odpowiedz", "Dlugosc response: " + Integer.toString(
                                response.length()));
                        if (response.length() == 0) {
                            showSnackbarInfo("Na serwerze nic nie ma (kitchen type)", R.color.snackbar_info_msg);
                        } else {
                            for (int i = 0; i < response.length(); i++) {
                                try {
                                    JSONObject jObj = response.getJSONObject(i);
                                    RecipeItem recipeItem = new RecipeItem();
                                    recipeItem.setRecipeUniqueID(jObj.getString("unique_id"));
                                    recipeItem.setRecipeTitle(jObj.getString("title"));
                                    recipeItem.setRecipeImgThumbnailLink(jObj.getString(
                                            "img_tumbnail_link"));
                                    recipeItem.setRecipeAddAte(jObj.getString("add_date"));
                                    recipeItem.setRecipeKitchenType(jObj.getString("kitchen_type"));
                                    recipeItem.setRecipeMealType(jObj.getString("meal_type"));
                                    recipeItem.setRecipeLikeCount(jObj.getString("like_count"));

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }
                            recipeAdapter.notifyItemRangeInserted(recipeItems.size(),
                                    response.length());
                        }
                    }

                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e("odpowiedz", "Błąd pobierania przepisów (kichen type): " +
                                Integer.toString(error.networkResponse.statusCode));

                        showSnackbarInfo(Integer.toString(error.networkResponse.statusCode),
                                R.color.snackbar_error_msg);
                    }

                });
        AppController.getInstance().addToRequestQueue(kitchenTypeRecipesReq);
    }

    private void getMealTypeRecipes() {
        JsonArrayRequest mealTypeRecipesReq = new JsonArrayRequest(prepareGetMethodUrl(),
                new Response.Listener<JSONArray>() {

                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d("odpowiedz", "Odpowiedź przepisów: " + response.toString());
                        Log.d("odpowiedz", "Dlugosc response: " + Integer.toString(
                                response.length()));
                        if (response.length() == 0) {
                            showSnackbarInfo("Na serwerze nic nie ma (meal_type)",
                                    R.color.snackbar_info_msg);
                        } else {
                            for (int i = 0; i < response.length(); i++) {
                                try {
                                    JSONObject jObj = response.getJSONObject(i);
                                    RecipeItem recipeItem = new RecipeItem();
                                    recipeItem.setRecipeUniqueID(jObj.getString("unique_id"));
                                    recipeItem.setRecipeTitle(jObj.getString("title"));
                                    recipeItem.setRecipeImgThumbnailLink(jObj.getString(
                                            "img_tumbnail_link"));
                                    recipeItem.setRecipeAddAte(jObj.getString("add_date"));
                                    recipeItem.setRecipeKitchenType(jObj.getString("kitchen_type"));
                                    recipeItem.setRecipeMealType(jObj.getString("meal_type"));
                                    recipeItem.setRecipeLikeCount(jObj.getString("like_count"));

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }
                            recipeAdapter.notifyItemRangeInserted(recipeItems.size(),
                                    response.length());
                        }
                    }

                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                            Log.e("odpowiedz", "Błąd pobierania przepisów (meal type): " +
                                    Integer.toString(error.networkResponse.statusCode));

                        showSnackbarInfo(Integer.toString(error.networkResponse.statusCode),
                                R.color.snackbar_error_msg);
                    }

                });
        AppController.getInstance().addToRequestQueue(mealTypeRecipesReq);
    }

    private String prepareGetMethodUrl() {
        switch (displayType) {
            case 0: {
                return AppConfig.URL_GETRECIPESBYKITCHENTYPE + "?kitchen_type=" + typeName +
                        "&offset=" + Integer.toString(offset);
            }

            case 1: {
                return AppConfig.URL_GETRECIPESBYMEALTYPE + "?meal_type=" + typeName +
                        "&offset=" + Integer.toString(offset);
            }

            default:
                return null;
        }
    }

    // Showing Dialog Window
    private void showDialog() {
        if (!pDialog.isShowing()) {
            pDialog.show();
        }
    }

    // Hiding Dialog Window
    private void hideDialog() {
        if (pDialog.isShowing()) {
            pDialog.dismiss();
        }
    }

    // Fucntion Showing Text In Snackbar
    private void showSnackbarInfo(String info, int textColor) {
        Snackbar snackbar = Snackbar.make(coordinatorLayout, info, Snackbar.LENGTH_LONG);

        View sbView = snackbar.getView();
        TextView sbText = (TextView) sbView.findViewById(android.support.design.R.id.snackbar_text);
        sbText.setTextColor(ContextCompat.getColor(getApplicationContext(), textColor));

        snackbar.show();
    }
}
公共类RecipeActivity扩展了AppCompatiActivit