在RecyclerView.ViewHolder中获取上下文

时间:2018-08-05 14:01:02

标签: java android android-recyclerview

我想为ListView项首次出现时制作动画。我有以下观察者:

public class SimpleViewHolder extends RecyclerView.ViewHolder
{
    private TextView  simpleTextView;

    public SimpleViewHolder(final View itemView, final SimpleAdapter.onItemClickListener listener) 
    {
        super(itemView);

        simpleTextView  = (TextView)  itemView.findViewById(R.id.simple_text);

        RotateAnimation rotate = new RotateAnimation(0, 360,
                Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
                0.5f);
        rotate.setDuration(1000);
        rotate.setRepeatCount( 0 );
        simpleTextView.setAnimation(rotate);
    }

    public void bindData(final SimpleViewModel viewModel)
    {
        simpleTextView.setText( viewModel.getSimpleText() );
    }
}

一切正常,除了不是通过编程方式设置动画外,我想使用以下方法从XML文件中加载它们:

Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.myanimation);

但是我不清楚如何将上下文获取/传递给RecyclerView.ViewHolder,或者这是否是制作动画的合适位置。

如何在RecyclerView.ViewHolder中加载XML动画,这是为列表项制作动画的正确位置吗?谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用itemView.getContext()来获取上下文

答案 1 :(得分:0)

我不同意动画的摆放位置。我认为这是正确的地方。关于上下文,我将其发送到构造函数中。

public SimpleViewHolder(final View itemView, final SimpleAdapter.onItemClickListener listener, Context context) {
 //use this context...

}

如果您的Recyclerview没有上下文,那么您也可以将上下文传递到Recycleview。我认为没有其他方法可以解决

答案 2 :(得分:0)

获取Context的正确方法可能是例如。在onLongClick()的实现中:

@Override
public boolean onLongClick(View viewHolder) {

    this.mRecyclerView = (SomeLinearView) viewHolder.getParent();

    Context context;
    if(viewHolder.isInEditMode()) {
        context = ((ContextThemeWrapper) this.mRecyclerView.getContext()).getBaseContext();
    } else  {
        context = this.mRecyclerView.getContext();
    }
}

,并且在编辑模式(XML预览)下不会崩溃。将所有变量声明为final只是无用的,并且通常会受到阻碍,除非需要这样做,因为更改了范围。

并且可以同样地应用布局动画:

int resId = R.anim.some_animation;
LayoutAnimationController animation = AnimationUtils.loadLayoutAnimation(context, resId);
this.mRecyclerView.setLayoutAnimation(animation);