8

Automatyczne przewijanie to problem & również przejście do określonej pozycji za pomocą kodu jest trudne.Nie działa Notifydatasetchange on RecyclerView z wybieraniem środkowym Horizontal Scrollview?

Wykonuję dwa recyclerView w zależności od siebie za pomocą przewijania poziomego i wyboru środka.

Więc mój problem jest metodą Notifydatasetchanged i resetowanie recyclerView świetnym miejscu na 0 i to przewijanie wachlarz wyboru, bo to powrót złego indeks ...

Kiedy chcę się dostać do centrum indeks selekcyjny po zmianie danych. Korzystam z poniższego przykładu, aby to osiągnąć, wprowadzając pewne zmiany.

Get center visible item of RecycleView when scrolling

muszę zmienić dane na zwoju Pierwszej recyclerView Adapter do drugiego adaptera recyclerView ze zmianą danych.

Ale Scrollview ustawić pozycję w pierwszej pozycji Próbowałem notifyItemRangeChanged (int, int) notifyItemRangeInserted (int, int) METODY ...

Szczegółowy Opis: Jestem zmianę rodzaju i wyzerować wartość Spójrz na scrollview. Muszę zmienić wybraną pozycję dolnego widoku przewijania. Zwłaszcza nie mogę uzyskać pozycji środkowej, zmieniając dane. Oznacza, że ​​jeśli zgłoszę adapter niż indeks, pozostanie on taki, jaki jest. Muszę pracować jak normalny adapter po zresetowaniu danych.

Z góry dziękuję.

public void getRecyclerview_Type() { 

    final RecyclerView recyclerView_Type = (RecyclerView) findViewById(R.id.recycleView); 
    if (recyclerView_Type != null) { 
     recyclerView_Type.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       setTypeValue(); 
      } 
     }, 300); 
     recyclerView_Type.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       // recyclerView_Type.smoothScrollToPosition(Type_Adapter.getItemCount() - 1); 
       setTypeValue(); 
      } 
     }, 5000); 
    } 
    ViewTreeObserver treeObserver = recyclerView_Type.getViewTreeObserver(); 
    treeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 

     @Override 
     public boolean onPreDraw() { 
      recyclerView_Type.getViewTreeObserver().removeOnPreDrawListener(this); 
      finalWidthDate = recyclerView_Type.getMeasuredWidth(); 
      itemWidthDate = getResources().getDimension(R.dimen.item_dob_width_padding); 
      paddingDate = (finalWidthDate - itemWidthDate)/2; 
      firstItemWidthDate = paddingDate; 
      allPixelsDate = 0; 

      final LinearLayoutManager dateLayoutManager = new LinearLayoutManager(getApplicationContext()); 
      dateLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); 
      recyclerView_Type.setLayoutManager(dateLayoutManager); 
      recyclerView_Type.addOnScrollListener(new RecyclerView.OnScrollListener() { 
       @Override 
       public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
        super.onScrollStateChanged(recyclerView, newState); 
        synchronized (this) { 
         if (newState == RecyclerView.SCROLL_STATE_IDLE) { 
          calculatePositionAndScroll_Type(recyclerView); 
         } 
        } 
       } 

       @Override 
       public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
        super.onScrolled(recyclerView, dx, dy); 
        allPixelsDate += dx; 
       } 
      }); 
      if (mTypeBeanArrayList == null) { 
       mTypeBeanArrayList = new ArrayList<>(); 
      } 
      getMedicationType(); 
      Type_Adapter = new Medication_Type_RecyclerAdapter(Add_Reminder_medicationlook_Activity.this, mTypeBeanArrayList, (int) firstItemWidthDate); 
      recyclerView_Type.setAdapter(Type_Adapter); 
      Type_Adapter.setSelecteditem(Type_Adapter.getItemCount() - 1); 
      return true; 
     } 
    }); 
} 

private void getMedicationType() { 

    for (int i = 0; i < mTypeBeanArrayList.size(); i++) { 
     Medication_TypeBean medication_typeBean = mTypeBeanArrayList.get(i); 


     Log.print("Image name :" +medication_typeBean.getType_image_name()); 
     if (i == 0 || i == (mTypeBeanArrayList.size() - 1)) { 
      medication_typeBean.setType(VIEW_TYPE_PADDING); 
     } else { 
      medication_typeBean.setType(VIEW_TYPE_ITEM); 
     } 
     mTypeBeanArrayList.set(i, medication_typeBean); 

    } 
} 

/* jeśli to najważniejsze, jeśli expectedPositionDate < 0 recyclerView powróci do najbliższego elementu */

private void calculatePositionAndScroll_Type(RecyclerView recyclerView) { 
    int expectedPositionDate = Math.round((allPixelsDate + paddingDate - firstItemWidthDate)/itemWidthDate); 

    if (expectedPositionDate == -1) { 
     expectedPositionDate = 0; 
    } else if (expectedPositionDate >= recyclerView.getAdapter().getItemCount() - 2) { 
     expectedPositionDate--; 
    } 
    scrollListToPosition_Type(recyclerView, expectedPositionDate); 

} 

/* this if most important, if expectedPositionDate < 0 recyclerView will return to nearest item*/ 
private void scrollListToPosition_Type(RecyclerView recyclerView, int expectedPositionDate) { 
    float targetScrollPosDate = expectedPositionDate * itemWidthDate + firstItemWidthDate - paddingDate; 
    float missingPxDate = targetScrollPosDate - allPixelsDate; 
    if (missingPxDate != 0) { 
     recyclerView.smoothScrollBy((int) missingPxDate, 0); 
    } 
    setTypeValue(); 

} 

private void setTypeValue() { 
    int expectedPositionDateColor = Math.round((allPixelsDate + paddingDate - firstItemWidthDate)/itemWidthDate); 
    int setColorDate = expectedPositionDateColor + 1; 

    Type_Adapter.setSelecteditem(setColorDate); 
    mTxt_type_name.setText(mTypeBeanArrayList.get(setColorDate).getMedication_type_name()); 

    mSELECTED_TYPE_ID = setColorDate; 

    //NotifyLookChangetoType(setColorDate); 
} 

// Rodzaj Adapter

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

    private ArrayList<Medication_TypeBean> medication_typeBeanArrayList; 
    private static final int VIEW_TYPE_PADDING = 1; 
    private static final int VIEW_TYPE_ITEM = 2; 
    private int paddingWidthDate = 0; 
    private Context mContext; 
    private int selectedItem = -1; 

    public Medication_Type_RecyclerAdapter(Context context, ArrayList<Medication_TypeBean> dateData, int paddingWidthDate) { 
     this.medication_typeBeanArrayList = dateData; 
     this.paddingWidthDate = paddingWidthDate; 
     this.mContext = context; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if (viewType == VIEW_TYPE_ITEM) { 
      final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_medication_type, 
        parent, false); 
      return new ViewHolder(view); 
     } else { 
      View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_medication_type, 
        parent, false); 
      RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams(); 
      layoutParams.width = paddingWidthDate; 
      view.setLayoutParams(layoutParams); 
      return new ViewHolder(view); 
     } 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     Medication_TypeBean medication_typeBean = mTypeBeanArrayList.get(position); 
     if (getItemViewType(position) == VIEW_TYPE_ITEM) { 
      // holder.mTxt_Type.setText(medication_typeBean.getMedication_type_name()); 
      //holder.mTxt_Type.setVisibility(View.VISIBLE); 
      holder.mImg_medication.setVisibility(View.VISIBLE); 
      int d = R.drawable.ic_type_pill; 
      try { 
       //Due to Offline requirements we do code like this get the images from our res folder 

       if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_pill")) { 
        d = R.drawable.ic_type_pill; 
       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_patch")) { 
        d = R.drawable.ic_type_patch; 
       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_capsule")) { 

        d = R.drawable.ic_type_capsule; 

       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_ring")) { 

        d = R.drawable.ic_type_ring; 

       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_inhaler")) { 

        d = R.drawable.ic_type_inhaler; 


       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_spray")) { 

        d = R.drawable.ic_type_spray; 


       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_bottle")) { 

        d = R.drawable.ic_type_bottle; 

       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_drop")) { 

        d = R.drawable.ic_type_drop; 


       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_pessaries")) { 

        d = R.drawable.ic_type_pessaries; 

       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_sachets")) { 

        d = R.drawable.ic_type_sachets; 


       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_tube")) { 

        d = R.drawable.ic_type_tube; 


       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_suppository")) { 

        d = R.drawable.ic_type_suppository; 

       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_injaction")) { 

        d = R.drawable.ic_type_injaction; 

       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_spoon")) { 

        d = R.drawable.ic_type_spoon; 

       } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_powder")) { 

        d = R.drawable.ic_type_powder; 

       } else { 
        d = R.drawable.ic_type_pill; 
       } 

       Bitmap icon = BitmapFactory.decodeResource(mContext.getResources(), 
         d); 
       holder.mImg_medication.setImageBitmap(icon); 
      } catch (Exception e) { 
       Log.print(e); 
      } 


      //  BitmapDrawable ob = new BitmapDrawable(mContext.getResources(), icon); 
      // img.setBackgroundDrawable(ob); 
      // holder.mImg_medication.setBackground(ob); 

      // Log.print("Type Adapter", "default " + position + ", selected " + selectedItem); 
      if (position == selectedItem) { 
       Log.print("Type adapter", "center" + position); 
       // holder.mTxt_Type.setTextColor(Color.parseColor("#76FF03")); 
       //holder.mImg_medication.setColorFilter(Color.GREEN); 
       // holder.mTxt_Type.setTextSize(35); 
       holder.mImg_medication.getLayoutParams().height = (int) mContext.getResources().getDimension(R.dimen.item_dob_width) + 10; 
       holder.mImg_medication.getLayoutParams().width = (int) mContext.getResources().getDimension(R.dimen.item_dob_width) + 10; 
      } else { 
       holder.mImg_medication.getLayoutParams().height = (int) mContext.getResources().getDimension(R.dimen.item_dob_width) - 10; 
       holder.mImg_medication.getLayoutParams().width = (int) mContext.getResources().getDimension(R.dimen.item_dob_width) - 10; 
       // holder.mTxt_Type.setTextColor(Color.WHITE); 
       //holder.mImg_medication.setColorFilter(null); 
       // holder.mTxt_Type.setVisibility(View.INVISIBLE); 
       // holder.mTxt_Type.setTextSize(18); 
       // holder.mImg_medication.getLayoutParams().height = 70; 
       // holder.mImg_medication.getLayoutParams().width = 70; 
      } 
     } else { 
      holder.mImg_medication.getLayoutParams().height = (int) mContext.getResources().getDimension(R.dimen.item_dob_width) - 10; 
      holder.mImg_medication.getLayoutParams().width = (int) mContext.getResources().getDimension(R.dimen.item_dob_width) - 10; 
      // holder.mTxt_Type.setVisibility(View.INVISIBLE); 
      holder.mImg_medication.setVisibility(View.INVISIBLE); 
     } 
    } 

    public void setSelecteditem(int selecteditem) { 
     this.selectedItem = selecteditem; 
     notifyDataSetChanged(); 

     if (medication_lookBeanArrayList != null && Look_Adapter != null) { 
      NotifyLookChangetoType(selecteditem); 
     } 
    } 

    public int getSelecteditem() { 
     return selectedItem; 
    } 

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

    @Override 
    public int getItemViewType(int position) { 
     Medication_TypeBean medication_typeBean = medication_typeBeanArrayList.get(position); 
     if (medication_typeBean.getType() == VIEW_TYPE_PADDING) { 
      return VIEW_TYPE_PADDING; 
     } else { 
      return VIEW_TYPE_ITEM; 
     } 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     //public TextView mTxt_Type; 
     public ImageView mImg_medication; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      // mTxt_Type = (TextView) itemView.findViewById(R.id.mTxt); 
      mImg_medication = (ImageView) itemView.findViewById(R.id.mImg_medication); 
     } 
    } 
} 

//Type Adapter ends ************************************************ 

enter image description here

+0

Nie jestem pewien, co próbujesz zrobić. Czy chcesz, aby górna lista przewijała się do tej samej pozycji, co dolna lista? Kiedy chcesz, aby na górnej liście zmieniła się wybrana pozycja? – Caleb

+0

Zmieniam typ i resetuję wartość Look scrollview. Potrzebuję zmienić wybraną pozycję dolnego przewijania. Specjalnie nie mogę uzyskać pozycji środkowej, zmieniając dane. Oznacza, że ​​jeśli zgłoszę adapter niż indeks, pozostanie on niezmieniony. Muszę pracować, jak normalny adapter po zresetowaniu danych. – KDOSHI

+0

@Caleb: Szczegółowo wyjaśniam sprawę. Czy możesz to teraz sprawdzić? – KDOSHI

Odpowiedz

0

I nie jestem pewien, czy dobrze cię rozumiem, ale chcesz zmienić dane jednego r ecyclerview i zeruj wartość innego widoku recyklingu

Spróbuj użyć recyclerView.scrollToPosition (INDEX_YOU_WANT_TO_SCROLL_TO);

JEŚLI CHCESZ OSIĄGNĄĆ CENTRUM NASTĘPUJĄCEJ UŻYWANIA DANYCH recyclerview.scrollToPosition (arraylist.size()/2); arrayList, w którym przechowywane są dane do pobrania

Powiązane problemy