2017-01-06 7 views
0

Ich versuche, so etwas zu tun: enter image description herenotifydatasetchanged() sieht Effekt nicht nach unten scrollen

zu erweitern oder reduzieren meine cardView Ich nenne die notifydatasetchanged() Methode, aber ich habe diese Methode setzt den Blick auf das erste Elemente und blättern Sie sehr schnell zu meiner alten Ansicht. Wie kann der Benutzer diese Schriftrolle nicht sehen? Zu meinem Problem hier zu zeigen ist ein Video: https://drive.google.com/open?id=0B7LMfg4tJlisVVlXajVuVlIyd3c

Mein Adapter

public class CardsViewAdapter erweitert RecyclerView.Adapter { Privat Spiel [] mDataset; // private boolean isPopupVisible = false; int rotationAngle = 0;

// Provide a reference to the views for each data item 
// Complex data items may need more than one view per item, and 
// you provide access to all the views for a data item in a view holder 
public static class ViewHolder extends RecyclerView.ViewHolder { 
    // each data item is just a string in this case 
    public TextView mTextView; 
    public ImageView imageView; 
    public LinearLayout test2; 
    public TextView test3; 
    boolean isPopupVisible; 

    public ViewHolder(View v) { 
     super(v); 
     mTextView = (TextView) v.findViewById(R.id.text_cards); 
     imageView = (ImageView) v.findViewById(R.id.item_description_game_more); 
     test2 = (LinearLayout) v.findViewById(R.id.popup_layout); 
     test3 = (TextView) v.findViewById(R.id.test_view); 
     isPopupVisible = false; 

    } 
} 

// Provide a suitable constructor (depends on the kind of dataset) 
public CardsViewAdapter(Game[] myDataset) { 
    mDataset = myDataset; 
} 

// Create new views (invoked by the layout manager) 
@Override 
public CardsViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
               int viewType) { 
    // create a new view 
    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.cards_resume_game, parent, false); 
    // set the view's size, margins, paddings and layout parameters 
    //... 

    ViewHolder vh = new ViewHolder(v); 
    return vh; 
} 

// Replace the contents of a view (invoked by the layout manager) 
@Override 
public void onBindViewHolder(final ViewHolder holder, int position) { 
    // - get element from your dataset at this position 
    // - replace the contents of the view with that element 
    //TODO : complete 
    final int pos = position; 
    holder.mTextView.setText(String.valueOf(mDataset[position].getId_game())); 
    holder.test3.setText("Position : "+pos); 
    // Set the expanded or collapsed mode here 
    if(mDataset[position].expanded) 
     expandView(holder.test2,holder.imageView); 
    else 
     collapseView(holder.test2,holder.imageView); 


    // Now set the onClickListener like this 
    holder.imageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      // Animate the imageView here 
      animateImageView(holder.imageView); 

      // Toggle the expanded attribute value 
      if(mDataset[pos].expanded) mDataset[pos].expanded = false; 
      else mDataset[pos].expanded = true; 

      // Now call notifyDataSetChanged to make the change to effect 
      refreshList(); 
     } 
    }); 



} 

// Extra functions inside your adapter class to improve readability 
private void collapseView(View v,ImageView imageView) { 
    CardsAnimationHelper.collapse(v); 
} 


private void expandView(View v,ImageView imageView) { 
    CardsAnimationHelper.expand(v); 
} 

private void animateImageView(ImageView imageView) { 
    ObjectAnimator anim = ObjectAnimator.ofFloat(imageView, "rotation",rotationAngle, rotationAngle + 180); 
    anim.setDuration(animationDuration); 
    anim.start(); 
    rotationAngle += 180; 
    rotationAngle = rotationAngle % 360; 
} 

long animationDuration = 500; 

private void refreshList() { 
    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      notifyDataSetChanged(); 
     } 
    }, animationDuration); 
} 

// Return the size of your dataset (invoked by the layout manager) 
@Override 
public int getItemCount() { 
    return mDataset.length; 
} 
+0

Verwenden notifyDataSetChanged() -Methode nicht, es zu versuchen: holder.imageView.setOnClickListener (neu View.OnClickListener() { @Override public void onClick (Blick v) { // die Toggle erweiterte Attributwert if (mDataset [pos] .expanded) mDataset [pos] .expanded = false; else mDataset [pos] .expanded = true; if (mDataset [Position] .expanded) Expand (holder.test2 , halter.imageView); else collapseView (holder.test2, holder.imageView); } }); –

+0

Können Sie eine Antwort geben und ich akzeptiere es nach Überprüfung etwas – filol

+0

Ich würde vorschlagen, es zuerst zu versuchen, wenn es hilft. –

Antwort

0

Verwenden Sie die RecyclerView notifyItemChanged(int position) Methode, dann werden Sie die Liste nicht vollständig aktualisieren.

Um optisch ansprechender zu sein, können Sie auch android:animateLayoutChanges="true" in Ihrer Layoutdatei verwenden, dies wird Layoutänderungen automatisch animieren (https://developer.android.com/training/animation/layout.html).

+0

Danke, genau das habe ich gebraucht – filol

0

notifydatasetchanged() scrollt es nicht nur Updates. Verwenden Sie recyclerview.smoothScrollToPosition(int position) zum Scrollen

0

Sie können zwei Möglichkeiten zum Scrollen verwenden.

  1. smoothScrollToPosition (int position) [Wenn Sie Smooth erreichen]
  2. setSelection (int position)

Führen Sie diese Aktion in der Post oder postDelayed wie pro Ihre Anforderung.