Android的RecyclerView奇怪endAllStagingAnimators错误 [英] Android RecyclerView strange endAllStagingAnimators error

查看:3012
本文介绍了Android的RecyclerView奇怪endAllStagingAnimators错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 RecyclerView 显示项目很奇怪的问题。首先它不显示的项目(奇怪的 D / OpenGLRenderer:带手柄0x6861d090 上0x6dd9c400(CardView endAllStagingAnimators)出现 - 以前从未发生过)和后退按钮不起作用(它但似乎没有反应)。好吧,让我们开始。我有一些片段(这里是与片段 RecyclerView

I have very strange problem with displaying item in RecyclerView. first of all it does not display items (strange D/OpenGLRenderer: endAllStagingAnimators on 0x6dd9c400 (CardView) with handle 0x6861d090 appears - never happened before) and back button does not work (it appears but does not react). Ok lets start. I have some Fragment (here is that fragment with RecyclerView:

在这里输入的形象描述

我也有1相同的片段如此,但他们中的一个conatins你可以看到厨房类型和第二个具有餐类型。当我点击列表中的项目之一,在这两种情况下采取行动重定向我到新的活动。

I also have 1 identical fragment to that but one of them conatins as you can see kitchen types and second one has meal types. When I click on one of list items, in both cases action redirects me to new activity

当我点击了一些的项目f.e第一个,这里正是这种 RecyclerView 适配器内部发生什么:

When I click on some of that items f.e first one, here it is what happen inside this RecyclerView adapter:

@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);
        }

    });
}

当我preSS的那个项目之一我送2个参数为新的活动分别是: TYPE_NAME - 帮助我,如果我将使用新开业得到知道活动从服务器下载包含数据厨房类型配方或餐类型配方和 DISPLAY_TYPE - 用于发送请求的MySQL数据库。这是第二个适配器一些code(你可以几乎相同):

When I press one of that items I send 2 parameters to new activity which are: TYPE_NAME - helps me to get know if I will be using newly opened activity to download data from server containing kitchen types recipes or meal types recipes and DISPLAY_TYPE - used to send request to MySQL database. This is some code from 2nd adapter (as you can almost identical):

        Intent intent = new Intent(context, RecipeActivity.class);
        intent.putExtra(TYPE_NAME, mealItem.getMealName());
        intent.putExtra(DISPLAY_TYPE, 1);
        context.startActivity(intent);

这是我所得到的新开里面的活动:

This is what I get inside newly opened activity:

在这里输入的形象描述

正如你可以看到,尽管事实上没有什么displying RecipeAdapter 正确地做出我认为:

As you can see nothing is displying despite the fact RecipeAdapter is made correctly I think:

在这里,你有它的code:

Here you have it's code:

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;
    }
}

下面是该活动的XML文件:

Here is XML file of that activity:

<?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>

这是活动的主要code:

This is main code of the activity:

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();
    }
}

我可以保证,一切都很好,有下载和 putExtra 工作正常所以参数都正确地发送。 D / OpenGLRenderer:带手柄0x6861d090 和不工作向上按钮<上0x6dd9c400(CardView)endAllStagingAnimators /只是显示它那奇怪的错误问题code>。某人能帮助我?

I can guarantee that everything is fine with downloading and putExtra works fine so the parameters are send correctly. Just the problem with displaying it and that strange error: D/OpenGLRenderer: endAllStagingAnimators on 0x6dd9c400 (CardView) with handle 0x6861d090 and not working up button. Can sb help me?

推荐答案

我添加

<application android:hardwareAccelerated="false">
<activity android:hardwareAccelerated="true" />
</application>

在清单和解决我的问题。

in Manifest and solve my problem.

这篇关于Android的RecyclerView奇怪endAllStagingAnimators错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆