一、簡(jiǎn)介:
1、添加和刪除按鈕可動(dòng)態(tài)添加刪減tab頁(yè)面
2、獲取每個(gè)fragment數(shù)據(jù)頁(yè)上的數(shù)據(jù)
3、為每個(gè)數(shù)據(jù)頁(yè)賦值
二、 效果圖:

三、實(shí)現(xiàn):
主要功能實(shí)現(xiàn):(ViewPage2Fragment.java)
先初始化適配器

// 加載自定義的布局文件
view = inflater.inflate(R.layout.activity_viewpage2_plan_filling_upload, null);
tabLayoutUp = view.findViewById(R.id.tab_layout);
viewPagerUp = view.findViewById(R.id.view_pager);
delImage = view.findViewById(R.id.delete);
addImage = view.findViewById(R.id.add);
lastPlan = view.findViewById(R.id.lastPlan);
tvProName = view.findViewById(R.id.tv_pro_name);
tvTime = view.findViewById(R.id.tv_time);
Button upload = view.findViewById(R.id.upload);
tabLayoutUp.setTabMode(MODE_SCROLLABLE);//適合很多tab
//tabLayoutUp.setTabMode(MODE_FIXED);//tab均分,適合少的tab
tabLayoutUp.addOnTabSelectedListener(this);
viewPagerUp.setAdapter(mAdapter);
// 設(shè)置緩存的數(shù)量
viewPagerUp.setOffscreenPageLimit(1);
new TabLayoutMediator(tabLayoutUp, viewPagerUp, (tab, position) -> tab.setText(mAdapter.getPageTitle(position))).attach();
//初始化生成第一個(gè)頁(yè)面
refreshAdapter(true);
//此處只刪除最后一個(gè)頁(yè)面
delImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int count = mAdapter.getItemCount();
mAdapter.removeFragment(count - 1);
mAdapter.notifyDataSetChanged();
}
});
//添加頁(yè)面
addImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int count = mAdapter.getItemCount();
mAdapter.addFragment(count, ViewPage2DataFragment.newInstance(count + ""), (count + 1) + "");
mAdapter.notifyDataSetChanged();
}
});
//計(jì)劃名稱(chēng)
tvProName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showSimpleBottomSheetList();
}
});
//時(shí)間選擇
tvTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePicker();
}
});
//導(dǎo)入上次計(jì)劃
lastPlan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getLastPlan();
}
});
upload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<PlanBean> listBean = new ArrayList<>();
//獲取fragment數(shù)據(jù)頁(yè)的數(shù)量
int count = mAdapter.getItemCount();
if (count > 0) {
if (StringHelper.isEmptyAndNull(tvProName.getText().toString())) {
XToastUtils.error("計(jì)劃名稱(chēng)為空,請(qǐng)?zhí)顚?xiě)!");
return;
} else if (StringHelper.isEmptyAndNull(tvTime.getText().toString())) {
XToastUtils.error("時(shí)間為空,請(qǐng)?zhí)顚?xiě)!");
return;
}
for (int i = 0; i < count; i++) {
//遍歷獲取每個(gè)fragment數(shù)據(jù)頁(yè)
ViewPage2DataFragment st = (ViewPage2DataFragment) mAdapter.createFragment(i);
//調(diào)用數(shù)據(jù)頁(yè)的方法得到數(shù)據(jù)放在listBean中 getData方法在ViewPage2DataFragment中
listBean.add(st.getData());
}
for (int j = 0; j < listBean.size(); j++) {
listBean.get(j).setProName(proNameId);
listBean.get(j).setMonth(tvTime.getText().toString());
if (StringHelper.isEmptyAndNull(listBean.get(j).getZynr())) {
XToastUtils.error("第" + (j + 1) + "頁(yè)數(shù)據(jù)一內(nèi)容為空,請(qǐng)?zhí)顚?xiě)!");
return;
} else if (StringHelper.isEmptyAndNull(listBean.get(j).getFxdj())) {
XToastUtils.error("第" + (j + 1) + "頁(yè)數(shù)據(jù)二內(nèi)容為空,請(qǐng)?zhí)顚?xiě)!");
return;
} else if (StringHelper.isEmptyAndNull(listBean.get(j).getTdsj())) {
XToastUtils.error("第" + (j + 1) + "頁(yè)數(shù)據(jù)三內(nèi)容為空,請(qǐng)?zhí)顚?xiě)!");
return;
} else if (StringHelper.isEmptyAndNull(listBean.get(j).getTdsb())) {
XToastUtils.error("第" + (j + 1) + "頁(yè)數(shù)據(jù)四內(nèi)容為空,請(qǐng)?zhí)顚?xiě)!");
return;
} else if (StringHelper.isEmptyAndNull(listBean.get(j).getSsgdj())) {
XToastUtils.error("第" + (j + 1) + "頁(yè)數(shù)據(jù)五內(nèi)容為空,請(qǐng)?zhí)顚?xiě)!");
return;
} else if (StringHelper.isEmptyAndNull(listBean.get(j).getFzr())) {
XToastUtils.error("第" + (j + 1) + "頁(yè)數(shù)據(jù)六內(nèi)容為空,請(qǐng)?zhí)顚?xiě)!");
return;
}
}
//提交方法 listBean里為頁(yè)面上的數(shù)據(jù)
upData(listBean);
} else {
XToastUtils.error("未獲取到數(shù)據(jù),請(qǐng)?zhí)砑訑?shù)據(jù)后再提交!");
}
}
});
/**
* 導(dǎo)入上次計(jì)劃
* 接口數(shù)據(jù)已注釋?zhuān)颂帪楣潭贁?shù)據(jù),實(shí)際環(huán)境根據(jù)接口返回?cái)?shù)據(jù)顯示
*/
private void getLastPlan() {
// String url ="接口url";
// FormBody body = new FormBody.Builder()
// .build();
// String result = service.httpPost(url,body);
// if(!StringHelper.isEmptyAndNull(result)){
// try {
// org.json.JSONObject jsonObject = new org.json.JSONObject(result);
// String res = jsonObject.getString("res");
// if("0".equals(res)){
// XToastUtils.error("獲取失??!");
// }else{
// JSONArray jsonArray = jsonObject.getJSONArray("obj");
//將當(dāng)前頁(yè)面上的fragment數(shù)據(jù)頁(yè)全部刪除
mAdapter.removeFragmentAll();
//刷新
mAdapter.notifyDataSetChanged();
ViewPage2DataFragment viewPage2DataFragment=new ViewPage2DataFragment();
for (int i = 0; i < 2; i++) {
PlanBean bean = new PlanBean();
// JSONObject js = jsonArray.getJSONObject(i);
// bean.setZynr(js.getString("zynr"));
bean.setZynr("數(shù)據(jù)一一一");
bean.setFxdj("數(shù)據(jù)二二二");
bean.setTdsj("數(shù)據(jù)三三三");
bean.setTdsb("數(shù)據(jù)四四四");
bean.setSsgdj("數(shù)據(jù)五五五");
bean.setFzr("數(shù)據(jù)六六六");
bean.setBz("備注備注");
//添加頁(yè)面 bean則為要顯示到頁(yè)面上的數(shù)據(jù)
mAdapter.addFragment(i, viewPage2DataFragment.newInstances((i+1)+"",bean), (i+1)+"");
//刷新
mAdapter.notifyDataSetChanged();
//制定初始化的頁(yè)面 0則為制定第一個(gè)頁(yè)面為當(dāng)前頁(yè)面
viewPager.setCurrentItem(0, false);
}
// }
// } catch (JSONException e) {
// XToastUtils.error("解析異常,請(qǐng)重試!");
// }
// }
}
/**
* 計(jì)劃名稱(chēng)列表
*/
private void showSimpleBottomSheetList() {
new BottomSheet.BottomListSheetBuilder(getActivity())
.setTitle("計(jì)劃名稱(chēng)")
.addItem("aaaa")
.addItem("bbbb")
.addItem("cccc")
.addItem("dddd")
.setIsCenter(true)
.setOnSheetItemClickListener((dialog, itemView, position, tag) -> {
dialog.dismiss();
tvProName.setText(tag);
})
.build()
.show();
}
/**
* 時(shí)間選擇器
*/
private void showDatePicker() {
if (mDatePicker == null) {
mDatePicker = new TimePickerBuilder(getContext(), (date, v) -> tvTime.setText(DateUtils.date2String(date, DateUtils.yyyyMMdd.get())))
.setTimeSelectChangeListener(date -> Log.i("pvTime", "onTimeSelectChanged"))
.setTitleText("日期選擇")
.build();
}
mDatePicker.show();
}
/**
* 保存提交數(shù)據(jù)
*/
private void upData(List<PlanBean> listBean) {
//提交數(shù)據(jù)
}
/**
* 生成第一個(gè)頁(yè)面
*/
private void refreshAdapter(boolean isShow) {
if (viewPagerUp == null) {
return;
}
if (isShow) {
// 動(dòng)態(tài)加載選項(xiàng)卡內(nèi)容
mAdapter.addFragment(ViewPage2DataFragment.newInstance("1"), "1");
mAdapter.notifyDataSetChanged();
viewPagerUp.setCurrentItem(0, false);
WidgetUtils.setTabLayoutTextFont(tabLayoutUp);
} else {
mAdapter.clear();
}
}
frament數(shù)據(jù)頁(yè)(ViewPage2DataFragment.java)
public class ViewPage2DataFragment extends Fragment {
private static final String KEY_TITLE = "title";
public ViewPage2DataFragment viewPage2DataFragment;
@BindView(R.id.zynr)
EditText zynr;
@BindView(R.id.fxdj)
TextView fxdj;
@BindView(R.id.tdsj)
EditText tdsj;
@BindView(R.id.tdsb)
EditText tdsb;
@BindView(R.id.ssgdj)
EditText ssgdj;
@BindView(R.id.fzr)
EditText fzr;
@BindView(R.id.bz)
EditText bz;
private Unbinder mUnbinder;
@AutoWired(name = KEY_TITLE)
String title;
public static ViewPage2DataFragment instance;
public ViewPage2DataFragment() {
}
public static ViewPage2DataFragment newInstance(String title) {
Bundle args = new Bundle();
args.putString(KEY_TITLE, title);
ViewPage2DataFragment fragment = new ViewPage2DataFragment();
fragment.setArguments(args);
return fragment;
}
/**
* bean為生成頁(yè)面時(shí)傳來(lái)的數(shù)據(jù),先存在Budle中,在下面的方法中取
*/
public ViewPage2DataFragment newInstances(String title, PlanBean bean) {
Bundle args = new Bundle();
args.putString(KEY_TITLE, title);
args.putString("zynr", bean.getZynr());
args.putString("fxdj", bean.getFxdj());
args.putString("tdsj", bean.getTdsj());
args.putString("tdsb", bean.getTdsb());
args.putString("ssgdj", bean.getSsgdj());
args.putString("fzr", bean.getFzr());
args.putString("bz", bean.getBz());
ViewPage2DataFragment fragment = new ViewPage2DataFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
}
@Override
public void onDetach() {
super.onDetach();
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
XRouter.getInstance().inject(this);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_viewpage2_plan_filling_tab_data, container, false);
mUnbinder = ButterKnife.bind(this, view);
instance = this;
initClick();
initData();
return view;
}
private void initClick() {
fxdj.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new BottomSheet.BottomListSheetBuilder(getActivity())
.setTitle("計(jì)劃名稱(chēng)")
.addItem("aaaa")
.addItem("bbbb")
.addItem("cccc")
.addItem("dddd")
.setIsCenter(true)
.setOnSheetItemClickListener((dialog, itemView, position, tag) -> {
dialog.dismiss();
fxdj.setText(tag);
})
.build()
.show();
}
});
}
/**
* 初始化數(shù)據(jù),取Bundle中的數(shù)據(jù)顯示到頁(yè)面
*/
private void initData() {
Bundle bundle = getArguments();
String zynr1 = bundle.getString("zynr");
String fxdj1 = bundle.getString("fxdj");
String tdsj1 = bundle.getString("tdsj");
String tdsb1 = bundle.getString("tdsb");
String ssgdj1 = bundle.getString("ssgdj");
String fzr1 = bundle.getString("fzr");
String bz1 = bundle.getString("bz");
zynr.setText(zynr1);
fxdj.setText(fxdj1);
tdsj.setText(tdsj1);
tdsb.setText(tdsb1);
ssgdj.setText(ssgdj1);
fzr.setText(fzr1);
bz.setText(bz1);
}
/**
* 獲取頁(yè)面上的數(shù)據(jù)
*/
public PlanBean getData() {
PlanBean bean = new PlanBean();
String zynr1 = zynr.getText().toString();
String fxdj1 = fxdj.getText().toString();
String tdsj1 = tdsj.getText().toString();
String tdsb1 = tdsb.getText().toString();
String ssgdj1 = ssgdj.getText().toString();
String fzr1 = fzr.getText().toString();
String bz1 = bz.getText().toString();
bean.setZynr(zynr1);
bean.setFxdj(fxdj1);
bean.setTdsj(tdsj1);
bean.setTdsb(tdsb1);
bean.setSsgdj(ssgdj1);
bean.setFzr(fzr1);
bean.setBz(bz1);
return bean;
}
@Override
public void onDestroyView() {
if (mUnbinder != null) {
mUnbinder.unbind();
}
super.onDestroyView();
}
}
適配器(FragmentStateViewPager2Adapter.java)
public class FragmentStateViewPager2Adapter extends FragmentStateAdapter {
private List<Fragment> mFragmentList = new ArrayList<>();
private List<String> mTitleList = new ArrayList<>();
private List<Long> mIds = new ArrayList<>();
private AtomicLong mAtomicLong = new AtomicLong(0);
public FragmentStateViewPager2Adapter(@NonNull Fragment fragment) {
super(fragment);
}
@NonNull
@Override
public Fragment createFragment(int position) {
return mFragmentList.get(position);
}
public FragmentStateViewPager2Adapter addFragment(Fragment fragment, String title) {
if (fragment != null) {
mFragmentList.add(fragment);
mTitleList.add(title);
mIds.add(getAtomicGeneratedId());
}
return this;
}
/**
* 添加
*/
public FragmentStateViewPager2Adapter addFragment(int index, Fragment fragment, String title) {
if (fragment != null && index >= 0 && index <= mFragmentList.size()) {
mFragmentList.add(index, fragment);
mTitleList.add(index, title);
mIds.add(index, getAtomicGeneratedId());
}
return this;
}
/**
* 刪除
*/
public FragmentStateViewPager2Adapter removeFragment(int index) {
if (index >= 0 && index < mFragmentList.size()) {
mFragmentList.remove(index);
mTitleList.remove(index);
mIds.remove(index);
}
return this;
}
/**
* 刪除所有
*/
public FragmentStateViewPager2Adapter removeFragmentAll() {
mFragmentList.clear();
mTitleList.clear();
mIds.clear();
return this;
}
private long getAtomicGeneratedId() {
return mAtomicLong.incrementAndGet();
}
@Override
public int getItemCount() {
return mFragmentList.size();
}
public void clear() {
mFragmentList.clear();
mTitleList.clear();
mIds.clear();
notifyDataSetChanged();
}
public CharSequence getPageTitle(int position) {
return mTitleList.get(position);
}
@Override
public long getItemId(int position) {
return mIds.get(position);
}
@Override
public boolean containsItem(long itemId) {
return mIds.contains(itemId);
}
}
主布局(activity_viewpage2_plan_filling_upload.xml)
( 注:這里為了減少代碼量,刪除了計(jì)劃名稱(chēng)、選擇時(shí)間、導(dǎo)入計(jì)劃、保存提交的布局)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#efefef"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#F7F7F7"
android:orientation="horizontal">
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_weight="0.9" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.6"
android:orientation="vertical">
<ImageView
android:id="@+id/delete"
android:layout_width="25dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:src="@drawable/delete" />
</LinearLayout>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
style="@style/TabLayoutStyle"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="2" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.6"
android:orientation="vertical">
<ImageView
android:id="@+id/add"
android:layout_width="25dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:src="@drawable/add" />
</LinearLayout>
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_weight="0.9" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="5" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
數(shù)據(jù)頁(yè)布局(fragment_viewpage2_plan_filling_tab_data.xml)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-599696.html
(注:這里為了減少代碼量,刪除了數(shù)據(jù)二、數(shù)據(jù)三等下面的布局,都是重復(fù)的布局,只是id不同)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-599696.html
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#efefef"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="8dp"
android:orientation="vertical">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/write"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.1"
android:text="*"
android:textColor="@color/red"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2.5"
android:text="數(shù)據(jù)一"
android:textColor="#303133"
android:textSize="14sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="3dp"
android:orientation="horizontal">
<EditText
android:id="@+id/zynr"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="14dp"
android:layout_weight="1.1"
android:background="@drawable/bg_edittext"
android:gravity="center_vertical"
android:hint="請(qǐng)?zhí)顚?xiě)"
android:inputType="textMultiLine"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:layout_width="32dp"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
</LinearLayout>
到了這里,關(guān)于Android——viewpage2+tablayout+fragment動(dòng)態(tài)添加刪除的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!