Выполнение анимации затухания при смене адаптера в RecyclerView

#java #android #android-recyclerview

#java #Android #android-recyclerview

Вопрос:

У меня есть объект RecyclerView:

 // List for filter.
RecyclerView filterList;
  

Затем у меня есть этот пользовательский адаптер для моего RecyclerView:

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

Context mainContext;
private static String[] menuTitle = {"Filter", "Color"};
private static Integer[] menuImgId = {R.drawable.image_effect, R.drawable.color_enhance};

// Remember last item animated.
int lastPosition = -1;

// Sub-Menu Items.
private static Integer[] menuItemId = {AdapterStaticId.EDIT_EFFECT_ADAPTER, AdapterStaticId.EDIT_EFFECT_ADAPTER};

public ArrayList<ListItem> myList;

public static class ViewHolder extends RecyclerView.ViewHolder{

    public LinearLayout container;
    public TextView titleText;
    public ImageView titleImage;


    public ViewHolder(View view){
        super(view);
        container = (LinearLayout)view.findViewById(R.id.list_item_container);
        titleText = (TextView)view.findViewById(R.id.titleText);
        titleImage = (ImageView)view.findViewById(R.id.titleId);
    }
}

MainMenuAdapter(Context MainContext){

    mainContext = MainContext;
    myList = new ArrayList<ListItem>();
    myList.add(new ListItem(menuTitle[0], menuImgId[0]));
    myList.add(new ListItem(menuTitle[1], menuImgId[1]));

}

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

    // Get item in holder to assign value.
    TextView myTitleText = holder.titleText;
    ImageView myTitleImage = holder.titleImage;

    myTitleText.setText(myList.get(position).itemName);
    myTitleImage.setImageResource(myList.get(position).itemImg);

    myTitleImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            EditImageActivity act = (EditImageActivity)mainContext;
            act.ChangeAdapter(menuItemId[position]);
        }
    });

    setAnimation(holder.container, position);
}

// Animation  fade-in for each item i set in this block.
private void setAnimation(View animatedView, int curPos){

    if(curPos > lastPosition){
        Animation performAnimation = AnimationUtils.loadAnimation(mainContext, R.anim.custom_fade_in);
        animatedView.startAnimation(performAnimation);
        lastPosition = curPos;
    }

}
// End setting animation.

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    // Inflate layout and return view holder for binding.
    LayoutInflater myInflate = LayoutInflater.from(mainContext);

    View mainView = myInflate.inflate(R.layout.list_item_layout, null);
    MainMenuAdapter.ViewHolder myViewHolder = new ViewHolder(mainView);

    return myViewHolder;

}

@Override
public int getItemCount() {
    return menuTitle.length;
}

private class ListItem{
    public String itemName;
    public Integer itemImg;

    public ListItem(String IN, Integer II){
        itemName = IN;
        itemImg = II;
    }
}

// To reset position for next time perform fade in animation.
public void resetAnimation(){
    lastPosition = -1;
}
  

}

У меня также есть другой адаптер для пунктов подменю:

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

private int lastPosition = -1;

public static class ViewHolder extends RecyclerView.ViewHolder{
    public LinearLayout container;
    public TextView titleText;
    public ImageView titleImage;


    public ViewHolder(View view){
        super(view);
        container = (LinearLayout)view.findViewById(R.id.list_item_container);
        titleText = (TextView)view.findViewById(R.id.titleText);
        titleImage = (ImageView)view.findViewById(R.id.titleId);
    }
}

Context context;

ArrayList<FilterListItem> filterListItems;

FilterAdapter(Context editAct, ArrayList<FilterListItem> listOfAlgo, int resId){
    context = editAct;
    filterListItems = listOfAlgo;
}

private Context getContext(){
    return context;
}

private EditImageActivity getAct(){
    return (EditImageActivity)context;
}

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

    final FilterListItem item = filterListItems.get(position);

    final ImageView mainImgV = holder.titleImage;
    mainImgV.setImageBitmap(StaticImages.getImage(item.getFilterName()));

    mainImgV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Bitmap resultBitmap = item.getFilterImg(getAct().getOriginBitmap());
            getAct().setSampleBitmap(resultBitmap);
        }
    });

    final TextView filterName = holder.titleText;
    filterName.setText(item.getFilterName());

    setAnimation(holder.container, position);
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    Context mainContext = getContext();
    LayoutInflater myInfla = LayoutInflater.from(mainContext);

    View itemView = myInfla.inflate(R.layout.list_item_layout, null);
    ViewHolder myListViewHolder = new ViewHolder(itemView);

    return myListViewHolder;
}

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

private void setAnimation(View animatedView, int curPos){

    if(curPos > lastPosition){
        Animation performAnimation = AnimationUtils.loadAnimation(context, R.anim.custom_fade_in);
        animatedView.startAnimation(performAnimation);
        lastPosition = curPos;
    }

}

public void resetAnimation(){
    lastPosition = -1;
}
  

}

При переключении между адаптерами, вот мой код:

 @Override
public void ChangeAdapter(int adapterId) {

    back_btn_layout.setVisibility(View.VISIBLE);

    switch(adapterId){
        case AdapterStaticId.EDIT_EFFECT_ADAPTER: {
            myMenuAdapter.resetAnimation();
            filterList.setAdapter(myFilterAdapter);
            break;
        }
    }

}

public void ReturnMainAdapter() {
    back_btn_layout.setVisibility(View.GONE);
    myFilterAdapter.resetAnimation();
    filterList.setAdapter(myMenuAdapter);
}
  

Интерфейс для моей текущей деятельности находится здесь:

     public interface MainAdapterCallback {
    public void ChangeAdapter(int adapterId);
}
  

Вот мой custom_fade_in.xml:

 <set
xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
    <alpha
        android:duration="100"
        android:fromAlpha="0.0"
        android:toAlpha="1.0"/>
</set>
  

При запуске моего приложения эти коды работают хорошо, я вижу анимацию затухания как для пункта главного меню, так и для пункта подменю, когда они появляются также при переключении между 2 адаптерами, нажав соответствующую кнопку, но если я хочу установить анимацию затухания для элемента в моем RecyclerViewкогда будут изменены 2 адаптера, можете ли вы предложить мне способ достижения моей цели?