2016-03-05 106 views
0

我與RecyclerView和一個自定義的TextView,剛剛得到一個rotate屬性的問題:RecyclerView不回收文本視圖中正確

public class IconTextView extends TextView { 

    boolean rotate = false; 

    public IconTextView(Context context) { 
     super(context); 
    } 

    public IconTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public IconTextView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    /** 
    * Start rotate animation. 
    * @param rotate boolean 
    */ 
    public void setRotate(boolean rotate) { 
     this.rotate = rotate; 
     if (rotate) { 
      rotateInfinite(); 
     } 
    } 

    private void rotateInfinite() { 
     Animation anim = new RotateAnimation(0.0f, 360.0f, 
       Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 
       0.5f); 
     anim.setDuration(1000); 
     anim.setRepeatMode(Animation.INFINITE); 
     anim.setRepeatCount(Animation.INFINITE); 
     anim.setInterpolator(new LinearInterpolator()); 
     startAnimation(anim); 
    } 
} 

適配器:

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.RotatingViewHolder> { 

    public ArrayList<Item> items = new ArrayList<>(); 

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

    @Override 
    public RotatingViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new RotatingViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.search_item_single, parent, false)); 
    } 

    @Override 
    public void onBindViewHolder(RotatingViewHolder holder, int position) { 

     Item item = items.get(position); 

     holder.mTextViewIcon.setText(item.icon); 
     holder.mTextViewIcon.setRotate(true); 
     holder.mTextViewTitle.setText(item.title); 
    } 

    public static class RotatingViewHolder extends RecyclerView.ViewHolder { 

     @Bind(R.id.mTextViewIcon) 
     IconTextView mTextViewIcon; 

     @Bind(R.id.mTextViewTitle) 
     TextView mTextViewTitle; 

     public RotatingViewHolder(View mView) { 
      super(mView); 
      ButterKnife.bind(this, mView); 
     } 
    } 

    public static class Item { 

     String icon, title; 
     boolean rotating; 

     public Item(String icon, String title, boolean rotating) { 
      this.icon = icon; 
      this.title = title; 
      this.rotating = rotating; 
     } 
    } 
} 

活動:

public class MainActivity extends AppCompatActivity { 

    @Bind(R.id.recyclerView) 
    RecyclerView recyclerView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ButterKnife.bind(this); 

     ItemAdapter itemAdapter = new ItemAdapter(); 

     recyclerView.setAdapter(itemAdapter); 
     recyclerView.requestFocus(); 
     recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 

     for (int i = 0; i < 40; i++) { 
      itemAdapter.items.add(new ItemAdapter.Item("Foo", "Bar", true)); 
     } 

     recyclerView.getAdapter().notifyDataSetChanged(); 
    } 
} 

所以這實際上起作用,文本正在旋轉。但是,只要我向下滾動一下,又一次隱藏的文本視圖停止旋轉。任何想法會發生什麼?

我把小項目到GitHub上,嘗試一下:當viewholder循環https://github.com/ArtworkAD/RecyclerViewTest

回答

1

動畫被清除,視圖的onDetachedFromWindow()在內部調用。我剛剛重新開始動畫,如果rotatetrue在視圖的onAttachedToWindow()。動畫似乎很好。

IconTextView.java

@Override protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    if (anim != null && rotate) { 
     startAnimation(anim); 
    } 
    } 
+0

它的工作原理,aweeesome謝謝; d –