是否可以控制“轮播”查看器项目的位置?

时间:2019-05-05 06:37:45

标签: android

我已经实现了Carousel Viewpager ...但是我被困在一点。 ArrayList中有10个图像项...显示前3个项(0,1,2位置),我们可以水平滚动一个 我想要的是,当我单击第一个位置(即0)时,它应该转到位置1,而当我单击位置2时,它应该位于位置1。 我该如何实现?enter image description here

Method in mainActivity 

private void showDrinkList() {
    try {
        DisplayMetrics metrics = new DisplayMetrics();
        Objects.requireNonNull(getActivity()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int pageMargin = ((metrics.widthPixels / 3) * 2);
        pager.setPageMargin(-pageMargin);
        CarouselPagerAdapter adapter = new CarouselPagerAdapter(context,this.getChildFragmentManager(), this.getChildFragmentManager(), pager, drinkLists);
        pager.setAdapter(adapter);
        pager.addOnPageChangeListener(adapter);
        if (drinkLists.size() > 1)
            pager.setCurrentItem(1);
        pager.setOffscreenPageLimit(3);
        pager.setHorizontalScrollBarEnabled(true);

    } catch (Exception e) {
        e.printStackTrace();
    } }
Carousel Adapter - 
import android.content.Context;
import android.graphics.Interpolator;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.widget.Toast;
import java.lang.reflect.Field;
import java.util.List;
import ae.frink.android.R;
import ae.frink.android.app.customDialog.RedeemDialog;
import ae.frink.android.model.BeanDrinkImage;
import ae.frink.android.utils.FixedSpeedScroller;
import ae.frink.android.utils.ViewPagerCustomDuration;
public class CarouselPagerAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener {
    public final static float BIG_SCALE = 0.8f;
    private final static float SMALL_SCALE = 0.4f;
    private final static float DIFF_SCALE = BIG_SCALE - SMALL_SCALE;
    private FragmentManager context;
    private Context c;
    private FragmentManager fragmentManager;
    private float scale;
    public static ViewPager viewPager;
    private List<BeanDrinkImage.DrinkList> drinkLists;
    private CarouselPagerAdapter adapter;
    //private ItemFragment itemFragment;

    public CarouselPagerAdapter(Context c, FragmentManager context, FragmentManager fm, ViewPager viewPager,
                                List<BeanDrinkImage.DrinkList> drinkLists) {
        super(fm);
        this.fragmentManager = fm;
        this.context = context;
         this.c = c;
      //  this.itemFragment = new ItemFragment(drinkLists);
        this.viewPager = viewPager;
        this.drinkLists = drinkLists;}

    @Override
    public Fragment getItem(int position) {
        // make the first pager bigger than others
        try {
            if (position == 0)    //BarInformationFrag.FIRST_PAGE)
                scale = SMALL_SCALE;
            else if(position == 1)
                scale = BIG_SCALE;
            else if(position == 2)
                scale = SMALL_SCALE;
            else
                scale = SMALL_SCALE;
         position = position % drinkLists.size();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.e("drinkSize", "....----" + drinkLists.size());
        // ItemFragment itemFragment = new ItemFragment();
        return ItemFragment.newInstance(context, position, scale, drinkLists);
    }
 @Override
    public int getCount() {
//        int count = 0;
//        try {
//            count = BarInformationFrag.count * BarInformationFrag.LOOPS;
//        } catch (Exception e) {
//            // TODO: handle exception
//            e.printStackTrace();
//        }
//        return count;
        return drinkLists.size();
    }
  @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        try {
            if (positionOffset >= 0f && positionOffset <= 1f) {
                CarouselLinearLayout cur = getRootView(position);
                CarouselLinearLayout next = getRootView(position + 1);
                cur.setScaleBoth(BIG_SCALE - DIFF_SCALE * positionOffset);
                next.setScaleBoth(SMALL_SCALE + DIFF_SCALE * positionOffset);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
@Override
    public void onPageSelected(int position) {
}
@Override
    public void onPageScrollStateChanged(int state) {
 }

    @SuppressWarnings("ConstantConditions")
    private CarouselLinearLayout getRootView(int position) {
        return (CarouselLinearLayout) fragmentManager.findFragmentByTag(this.getFragmentTag(position))
                .getView().findViewById(R.id.root_container);
    }
 private String getFragmentTag(int position) {
        return "android:switcher:" + viewPager.getId() + ":" + position;
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
}




Carousel Linear Layout -

import android.content.Context;
  import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.LinearLayout;

public class CarouselLinearLayout extends LinearLayout {
    private float scale = CarouselPagerAdapter.BIG_SCALE;
//    private float scale = .5f;

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

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

    public void setScaleBoth(float scale) {
        this.scale = scale;
        this.invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // The main mechanism to display scale animation, you can customize it as your needs
        int w = this.getWidth();
        int h = this.getHeight();
         canvas.scale(scale, scale, w / 2, h / 2);

    }
}

item Fragment - 
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import ae.frink.android.R;
import ae.frink.android.app.customDialog.RedeemDialog;
import ae.frink.android.connection.ApiClient;
import ae.frink.android.model.BeanDrinkImage;

import static ae.frink.android.Carousel.CarouselPagerAdapter.viewPager;


public class ItemFragment extends Fragment {

    private static final String POSITON = "position";
    private static final String SCALE = "scale";
    private static final String DRAWABLE_RESOURE = "resource";
    private static final String DRINK_LIST = "drinkList";
    private List<BeanDrinkImage.DrinkList> dL;
    private static final String IMAGE = "image";
    public ArrayList<Integer> imageArray;
    private Context context;
    private List<BeanDrinkImage.DrinkList> drinkLists;
    private SharedPreferences sharedPreferences;

    private int screenWidth;
    private int screenHeight;

    /* private int[] imageArray = new int[]{R.drawable.cocktail_lime_gin_fizz_1, R.drawable.cocktail_lime_gin_fizz_1,
             R.drawable.cocktail_lime_gin_fizz_1, R.drawable.cocktail_lime_gin_fizz_1, R.drawable.cocktail_lime_gin_fizz_1,
             R.drawable.cocktail_lime_gin_fizz_1, R.drawable.cocktail_lime_gin_fizz_1, R.drawable.cocktail_lime_gin_fizz_1,
             R.drawable.cocktail_lime_gin_fizz_1, R.drawable.cocktail_lime_gin_fizz_1};
 */

    public ItemFragment() {
    }

/*

    @SuppressLint("ValidFragment")
    public ItemFragment(List<BeanDrinkImage.DrinkList> drinkLists) {
        this.drinkLists = drinkLists;
    }
*/


    public static Fragment newInstance(FragmentManager context, int pos, float scale, List<BeanDrinkImage.DrinkList> dL) {

        ItemFragment fr = new ItemFragment();

        Bundle b = new Bundle();
        b.putInt(POSITON, pos);
        b.putFloat(SCALE, scale);
        b.putParcelableArrayList(DRINK_LIST, (ArrayList) dL);
        //drinkLists=dL;
        // this.context = context;
        // this.dL = dL;
        // b.putIntegerArrayList(IMAGE, imageArray);
        Log.e("drinkSize", "....+++"+dL.size());
        fr.setArguments(b);
        return fr;//frFragment.instantiate(context, ItemFragment.class.getName(), b);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWidthAndHeight();
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
    }

    @SuppressLint("SetTextI18n")
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        context = getActivity();
        final int postion = this.getArguments().getInt(POSITON);
        float scale = this.getArguments().getFloat(SCALE);
        this.imageArray = this.getArguments().getIntegerArrayList(IMAGE);
        drinkLists = (ArrayList) this.getArguments().getParcelableArrayList(DRINK_LIST);

//         TODO 21 sep changes

//        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(screenWidth / 3,
//                h/4);

        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(screenWidth / 2,
                screenWidth/2);

        LinearLayout linearLayout = (LinearLayout) inflater.inflate(R.layout.fragment_image, container, false);
        TextView textView = (TextView) linearLayout.findViewById(R.id.text);
        CarouselLinearLayout root = (CarouselLinearLayout) linearLayout.findViewById(R.id.root_container);
        ImageView imageView = (ImageView) linearLayout.findViewById(R.id.pagerImg);
        ImageView starImage = (ImageView) linearLayout.findViewById(R.id.imgStar);
        imageView.setLayoutParams(layoutParams);
        String imageUrl = "";
        try {
            Log.e("drinkSize", "...."+drinkLists.size());
            if (drinkLists.size() > 0) {
                imageUrl =  ApiClient.IMAGE_URL + drinkLists.get(postion).getImage();
                Picasso.get().load(imageUrl).into(imageView);
                Log.e("drinkName", drinkLists.get(postion).getDrinkName());
                textView.setText(drinkLists.get(postion).getDrinkName());
                if (drinkLists.get(postion).getIs_recomended() == 1) {
                    starImage.setVisibility(View.VISIBLE);
                } else {
                    starImage.setVisibility(View.INVISIBLE);
                }
            }



            imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (getActivity() != null) {


                            RedeemDialog redeemDialog = new RedeemDialog(getActivity(), drinkLists, postion);
                            redeemDialog.setCanceledOnTouchOutside(true);
                            redeemDialog.show();

                        // 12-march
                      /*  if (sharedPreferences.getString(CommonVar.IS_SUBSCRIBED, "0").equals("0")) {
                            Toast.makeText(getContext(), "Please subscribe first", Toast.LENGTH_SHORT).show();
                        } else {
                            RedeemDialog redeemDialog = new RedeemDialog(getActivity(), list, postion);
                            redeemDialog.setCanceledOnTouchOutside(true);
                            redeemDialog.show();
                        }*/

                    }
                }
            });
            root.setScaleBoth(scale);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return linearLayout;
    }

    /**
     * Get device screen width and height
     */

    private void getWidthAndHeight() {
        DisplayMetrics displaymetrics = new DisplayMetrics();
        try {
            Objects.requireNonNull(getActivity()).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
            screenHeight = displaymetrics.heightPixels;
            screenWidth = displaymetrics.widthPixels;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

holder.setIsRecyclable(false);

答案 1 :(得分:0)

  if (position == 0) {
  scale = SMALL_SCALE;}
            else if(position == 1){

                scale = BIG_SCALE;
}
            else if(position == 2)
  {
              scale = SMALL_SCALE;
}
            else{

                scale = SMALL_SCALE;
}