#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 адаптера, можете ли вы предложить мне способ достижения моей цели?