java - 将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 的字段
解决方案
看了很多之后,我发现使用 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)
推荐阅读
- java - 暂停/恢复录音
- mysql - 循环遍历所有表并重命名列
- python - Python根据列数据预测列标题
- c - GNU GCC 编译器 - 对齐属性
- c# - Return only one value from JObject with two values in it C#
- sql-server - 按报表项目计算排序行组
- ios - 找不到 SDK 'iphoneos11.2'
- windows - 如何检查文档是否打开预览窗格
- ssl - MacOS Mojave 更新 SSL/TLS (?) 后无法从“https://rubygems.org/”安装 gems
- css - VS 捆绑发布时出现 CSS 缩小错误