首页 > 解决方案 > 将arraylist发送到片段以动态填充数据

问题描述

我正在用 cardview 制作一个 viewpager 来动态显示我活跃的服务。这些服务通过我的 api 中的 json 到达,直到这里一切正常。我取出 json 的数据并将它们保存在一个数组列表中,然后将其传递给 CardFragmentPagerAdapter,然后从那里生成相应的卡片视图。

关键是我需要将相同的数组传递给片段,以便能够放置每个卡片视图的名称、描述、照片等,并分配 id 以供以后使用。

我有一个我找到的示例代码。我希望你能帮助我。在此处输入图像描述

这是主要活动

    movidata.nombre = "Servicio por dias"
    movidata.desc = "venta de servicio por dias de 4 u 8 horas"
    movidata.foto = "ok"
    movidata.id = "2"
    data.add(movidata)



    guardar_servicios()

    val viewPager = findViewById(R.id.viewPager) as ViewPager

    val pagerAdapter = CardFragmentPagerAdapter(this,supportFragmentManager, dpToPixels(2, this), data)
    val fragmentCardShadowTransformer = ShadowTransformer(viewPager, pagerAdapter)
    fragmentCardShadowTransformer.enableScaling(true)

    viewPager.setAdapter(pagerAdapter)
    viewPager.setPageTransformer(false, fragmentCardShadowTransformer)
    viewPager.setOffscreenPageLimit(3)

这是适配器

public class CardFragmentPagerAdapter  extends FragmentStatePagerAdapter implements CardAdapter{


private List<CardFragment> fragments;
private float baseElevation;
public ArrayList<servicio> objectList;
Context mContext ;

public CardFragmentPagerAdapter(Context mContext ,FragmentManager fm, float baseElevation, ArrayList<servicio> objects ) {


    super(fm);
    fragments = new ArrayList<>();
    this.baseElevation = baseElevation;
    this.objectList = objects;
    this.mContext = mContext;

    for(int i = 0; i< objectList.size(); i++){
        addCardFragment(new CardFragment());
        objectList.get(i).getNombre();

    }
}


@Override
public float getBaseElevation() {
    return baseElevation;
}

@Override
public CardView getCardViewAt(int position) {
    return fragments.get(position).getCardView();
}

@Override
public int getCount() {
    //return fragments.size();
    return objectList.size();
}



@Override
public Fragment getItem(int position) {
    return CardFragment.getInstance(position);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Object fragment = super.instantiateItem(container, position);
    fragments.set(position, (CardFragment) fragment);
    return fragment;
}

public void addCardFragment(CardFragment fragment) {
    fragments.add(fragment );
}

}

这是片段

public class CardFragment extends Fragment {
private CardView cardView;

JSONArray obj;

public static Fragment getInstance(int position) {
    CardFragment f = new CardFragment();
    Bundle args = new Bundle();
    args.putInt("position", position);
    f.setArguments(args);

    return f;
}


@SuppressLint("DefaultLocale")
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.item_servicios, container, false);


    cargarpreferencias();


    cardView = (CardView) view.findViewById(R.id.cardView);
    cardView.setMaxCardElevation(cardView.getCardElevation() * CardAdapter.MAX_ELEVATION_FACTOR);

    TextView title = (TextView) view.findViewById(R.id.title);
    Button button = (Button)view.findViewById(R.id.button);



    title.setText(String.format("Card %d", getArguments().getInt("position")));


    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(getActivity(), "Button in Card " + getArguments().getInt("position")
                    + "Clicked!" , Toast.LENGTH_SHORT).show();
        }
    });

    return view;
}

public CardView getCardView() {
    return cardView;
}

这是片段的接口

public interface CardAdapter {

public final int MAX_ELEVATION_FACTOR = 8;

float getBaseElevation();

CardView getCardViewAt(int position);

int getCount();

Object instantiateItem(ViewGroup container, int position);

}

我想要的是能够根据主数组列表更改显示 Cardtitle 的字段

标签: javaandroid

解决方案


看了很多之后,我发现使用 PagerAdapter 更容易做我想做的事,这里我留下代码

这是适配器

public class AdapterServicios extends PagerAdapter implements CardAdapter {


private List<Model_Servicios> mData;
private List<CardView> mViews;
private float baseElevation;

public AdapterServicios(float baseElevation) {

    mData = new ArrayList<>();
    mViews = new ArrayList<>();
    this.baseElevation = baseElevation;

}

public void addCardItem(Model_Servicios item) {
    mViews.add(null);
    mData.add(item);

}

public float getBaseElevation() {
    return baseElevation;
}

@Override
public CardView getCardViewAt(int position) {
    return mViews.get(position);
}

@Override
public int getCount() {
    return mData.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == object;
}


@Override
public Object instantiateItem(final ViewGroup container, int position)  {

    View view = LayoutInflater.from(container.getContext())
            .inflate(R.layout.item_servicios, container, false);

    container.addView(view);
    bind(mData.get(position), view, container.getContext());
    CardView cardView = (CardView) view.findViewById(R.id.cardView);


    /*if (baseElevation == 0) {
        baseElevation = cardView.getCardElevation();
    }*/

    final int page = position;

    Button button =(Button)view.findViewById(R.id.button_service);

    cardView.setMaxCardElevation(baseElevation * MAX_ELEVATION_FACTOR);
    mViews.set(position, cardView);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (page ==0 ){

                Intent intent = new Intent(container.getContext(), Login_Activity.class);
                container.getContext().startActivity(intent);

                Toast.makeText(container.getContext(),"Aseo por dias", Toast.LENGTH_LONG).show();
            } else if (page == 1) {
                Toast.makeText(container.getContext(),"Aseo 2", Toast.LENGTH_LONG).show();

            } else if (page == 2){
                Toast.makeText(container.getContext(),"Aseo 3", Toast.LENGTH_LONG).show();

            }else
                Toast.makeText(container.getContext(),"Aseo 4", Toast.LENGTH_LONG).show();


        }
    });
    return view;

}



@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((View) object);
    mViews.set(position, null);
}


private void bind(Model_Servicios item, View view, Context context) {


    ImageView imageView;
    TextView titulo, descrip;

    imageView = (ImageView)view.findViewById(R.id.img_service);
    titulo =(TextView) view.findViewById(R.id.title_service);
    descrip =(TextView) view.findViewById(R.id.description_service);


    TextView titleTextView = (TextView) view.findViewById(R.id.title_service);
    TextView contentTextView = (TextView) view.findViewById(R.id.description_service);

    titleTextView.setText(item.getNombre());
    contentTextView.setText(item.getDescripcion());


    String url = item.getFoto();


    Glide.with(context)
            .load(url)
            .into(imageView);

}

}

活动主

                            mCardShadowTransformer = ShadowTransformer(viewPager, mCardAdapter)




                        viewPager.setAdapter(mCardAdapter)
                        viewPager.setPageTransformer(false, mCardShadowTransformer)
                        viewPager.setOffscreenPageLimit(3)

推荐阅读