RecyclerView загружает дважды продукт по событию click в recyclerView в Android - PullRequest
0 голосов
/ 26 сентября 2018

Я применил recyclerView во фрагменте, в котором я показываю продукт из API, который работает нормально.Я выполнил функцию прослушивания кликов на recyclerView, когда щелкаю по продукту и перехожу к следующему фрагменту.Но когда я перехожу к предыдущему фрагменту, мой recycelerView загружает данные снова и снова.как я могу избежать этого.я хочу чтобы он загружал данные один раз.вот мой код xml code:

<android.support.v7.widget.RecyclerView
    android:id="@+id/lsCategory"
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    android:layout_marginLeft="2dp"
    android:layout_marginTop="4dp"
    android:layout_marginRight="2dp"
    android:background="@color/colorPrimary"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

вот мой recyclerView код:

 public class HomeFragment extends Fragment implements View.OnClickListener {
private List<Category> categories = new ArrayList<>();
    private CategoryAdapter categoryAdapter;

 public void getInfo(View view){
    lsCategory =  view.findViewById(R.id.lsCategory);
}
public void setInfo(){
    getData();
}
public void getData(){
    final StringRequest request = new StringRequest(Request.Method.GET, URLs.homeMainURL,
    new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
                //categories
                JSONArray categoryArray = jsonObject.getJSONArray("ListCategories");
                setCategoryAdapter(categoryArray);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
         error.printStackTrace();
        }
    });
    VolleySingleton.getInstance(context).addToRequestQueue(request);
}
private void setCategoryAdapter(JSONArray array) {

    try {
        for (int i = 0; i < array.length(); i++) {
            JSONObject object = array.getJSONObject(i);
            final String name = object.getString("Name");
            final int Id = object.getInt("ID");
            categories.add(new Category(Id, name));
        }

    }catch(JSONException e) {
        e.printStackTrace();
    }
    categoryAdapter = new CategoryAdapter(context, categories);
    lsCategory.setLayoutManager(new LinearLayoutManager(context,LinearLayoutManager.HORIZONTAL,false));
    lsCategory.setAdapter(categoryAdapter);
}

и вот моя категория Adapter

@Override
public void onBindViewHolder(@NonNull CategoryAdapter.ViewHolder holder, int position) {
    holder.setData(categories.get(position));
}
public class ViewHolder extends RecyclerView.ViewHolder {
    TextView textViewItemName;
    private int Id ;
    public ViewHolder(View itemView) {
        super(itemView);
        textViewItemName = itemView.findViewById(R.id.tvCategoris);
    }
    public void setData(final Category category){
        textViewItemName.setText(category.getCategoryName());
        Id = category.getId();

        textViewItemName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ExpandableCategoryList fragment = new ExpandableCategoryList();
                Bundle bundle = new Bundle();
                bundle.putInt("Id",Id);
                fragment.setArguments(bundle);
                ((MainActivity)context).replaceFragment(fragment,
                        "TAG",null,false);
            }
        });
    }
}

Ответы [ 4 ]

0 голосов
/ 26 сентября 2018

Использовать фрагментTransaction.add (containerViewId, фрагмент, тег);вместо fragTransaction.replace (containerViewId, фрагмент, тег);

Разница между add и replace составляет:

replace удаляет существующий фрагмент и добавляет новый фрагмент.Это означает, что при нажатии кнопки «Назад» фрагмент, который был заменен, будет создан с вызываемым onCreateView.

Принимая во внимание, что add сохраняет существующие фрагменты и добавляет новый фрагмент, что означает, что существующий фрагмент будетактивны, и они не будут в состоянии «пауза», следовательно, при нажатии кнопки «Назад» onCreateView не вызывается для существующего фрагмента (фрагмент, который был там до добавления нового фрагмента).

С точки зрения событий жизненного цикла фрагмента onPause, onResume, onCreateView и другие события жизненного цикла будут вызываться в случае замены, но они не будут вызываться в случае добавления.

0 голосов
/ 26 сентября 2018

Надеюсь, это сработает для вас.

Очистите ваш массив перед тем, как добавлять в него данные, и добавьте перед тем, как попытаться перехватить ваш код.как указано ниже и уведомить ваш адаптер.

  if(categories!=null){
        categories.clear();
     }

try {
       for (int i = 0; i < array.length(); i++) {
            JSONObject object = array.getJSONObject(i);
            final String name = object.getString("Name");
            final int Id = object.getInt("ID");
            categories.add(new Category(Id, name));
        }

    }catch(JSONException e) {
        e.printStackTrace();
    }
    categoryAdapter = new CategoryAdapter(context, categories);
    rvCategory.setLayoutManager(new 
    LinearLayoutManager(context,LinearLayoutManager.HORIZONTAL,false));
    rvCategory.setAdapter(categoryAdapter);
    categoryAdapter.notifyDataSetChanged();
0 голосов
/ 26 сентября 2018

Есть два способа:

Первый:

Если вы используете замену, тогда вы должны также использовать метод addtobackstack (null) с ним.Он не вызовет предыдущий фрагмент метода onCreate снова при переходе от следующего фрагмента к предыдущему фрагменту.Убедитесь, что вы вызываете API в методе onCreate.

Секунда:

Попробуйте прочитать о setRetain (True) во фрагментах, возможно, это поможет вам снова остановить загрузку метода oncreate фрагмента.Убедитесь, что вы вызываете API в методе onCreate.

Надеюсь, это поможет.Удачного кодирования:)

0 голосов
/ 26 сентября 2018

Это распространенная проблема, с которой сталкиваются большинство разработчиков Android, и может быть решена следующими способами.1. Прежде всего, очищайте объект category каждый раз, когда этот фрагмент загружается / вызывается перед добавлением в него данных.Пример.category.clear ();если это список2. Добавьте в свой адаптер setHasStableIds (true); внутри конструктора.Он перестанет дублировать данные в вашем списке.3. Переопределите следующие методы в вашем адаптере (IMP)

    @Override
    public int getItemViewType(int position) {
     return position;
    }

    @Override
    public long getItemId(int position){
        return position;
    }
    @Override
    public int getItemCount() {
        return category.size();
    }

Дайте мне знать, если он работает!

...