مشکل با tablayoute داینامیک و ویوپیجر(لطفا راهنمایی کنید)
دوستان خسته نباشین.یه مشکل اساسی دارم اگ لطف کنید راهنمایی کنید بنده رو تا از شر این مشکل رها بشم واقعا ممنونم.قبلا هم در این خصوص یک تاپیک گذاشته بودم اما نتیجه ای نگرفتم و این شد ک دوباره مطرح کنم.ببینید من یه ویوپیجر دارم . یک تب لایوت هم خب دارم.و تنها یک فرگمنت که شامل یک ریسایکل ویو هست دارم.خب سناریو کارم به این صورت هست.به ازای سایز یک ارای لیست ، فرگمنت به ویوپیجرم اضافه میشه به صورت کاملا داینامیک.خب به هر ایتم این tablayoute یک ایدی اختصاص دادم.در لحظه تعویض این تب یعنی این ایدی گرفته میشه و درخواست به سرور ارسال میشه و بعد از دریافت اطلاعات فرگمنت را با استفاده از یک اینترفیس رفرش میکنم.تا اینجا هیچ مشکلی ندارم و همه چی اوکی هست.اما فقط با تعویض تب لایوت ها اوکی هست ولی همچین که با خود ویوپیجر عوض میکنم به مشکل میخوره و انگار فرگمنت اصلا رفرنش نمیشه.دیتاها جابجا میشه!!!!!!!!دوستان خواهشا راهنمایی کنید واقعا همه راه ها رو تست کردم نشد ک نشد
public class ActivityTabLayouteCategory extends AppCompatActivity{
public static ArrayList<Category> res = new ArrayList<>();
public int id;
/////اینترفیس مربوط به رفرش از دورن فرگمنت
private FragmentRefreshListener fragmentRefreshListener;
public FragmentRefreshListener getFragmentRefreshListener() {
return fragmentRefreshListener;
}
public void setFragmentRefreshListener(FragmentRefreshListener fragmentRefreshListener) {
this.fragmentRefreshListener = fragmentRefreshListener;
}
public interface FragmentRefreshListener {
void onRefresh();
}
///////////////////////////////////////////////////////////////////////////////
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab);
final TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
setupViewPager(viewPager);
tabLayout.setupWithViewPager(viewPager);
id = res.get(res.size()-1).getId();
///.متدی هست که درخواست به سرور و دریافت اطلاعات از اینجا انجام میشود
getData();
////این تیکه کد را برای اینکه ویوپیجر از سمت راست شروع شود گذاشتم
viewPager.setCurrentItem(res.size() - 1);
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
ActivityTabLayouteCategory.ViewPagerAdapter adapter = new ActivityTabLayouteCategory.ViewPagerAdapter(getSupportFragmentManager());
//مقدار دهی ایدی با توجه به تعویض تب پیج
long iddd = adapter.getItemId(tab.getPosition());
id = res.get((int) iddd).getId();
getData();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
//////////////////////////////////////////////////////////////////////////////
private void setupViewPager(ViewPager viewPager) {
ActivityTabLayouteCategory.ViewPagerAdapter adapter = new ActivityTabLayouteCategory.ViewPagerAdapter(getSupportFragmentManager());
for (int i = 0; i < res.size(); i++) {
adapter.addFrag(new ProductCardFragmment(), res.get(i).getName(), res.get(i).getId());
}
viewPager.setAdapter(adapter);
viewPager.setVerticalScrollBarEnabled(true);
}
/////////////////////////////////////////////////////////
public void getData() {
//Do something after 100ms
ActionProduct actionCategori = new ActionProduct(ActivityTabLayouteCategory.this, String.valueOf(id));
actionCategori.getResult(new OnResultListener() {
public void onFailed1(String paramAnonymousString) {
ProductCardFragmment.resData.clear();
if (getFragmentRefreshListener() != null) {
getFragmentRefreshListener().onRefresh();
}
}
@Override
public void onSuccess1(ArrayList<?> paramlist) {
ProductCardFragmment.resData = (ArrayList<Product>) paramlist;
if (getFragmentRefreshListener() != null) {
getFragmentRefreshListener().onRefresh();
}
}
});
}
//////////////////////
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
private final List<Integer> mFragmentTitleId = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFrag(Fragment fragment, String title, Integer id) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
mFragmentTitleId.add(id);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
///////////////////////////////////////////////////////////////////////////
public class ProductCardFragmment extends Fragment{
public static ArrayList<Product> resData=new ArrayList<>() ;
public RecycleAdapterProduct adapter;
public RecyclerView recyclerView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_category, container, false);
recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view_card);
((ActivityTabLayouteCategory)getActivity()).setFragmentRefreshListener(new ActivityTabLayouteCategory.FragmentRefreshListener() {
@Override
public void onRefresh() {
refresh();
}
});
adaptersetting();
return rootView;
}
public void adaptersetting(){
adapter= new RecycleAdapterProduct(getContext(), resData);
RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 2);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.addItemDecoration(new GridSpacingItemDecoration(1, dpToPx(1), true));
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
}
public void refresh(){
String nameTag=ProductCardFragmment.this.getTag();
Fragment currentFragment = getFragmentManager().findFragmentByTag(nameTag);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.detach(currentFragment);
fragmentTransaction.attach(currentFragment);
fragmentTransaction.commit();
adapter.notifyDataSetChanged();
}
}
مطلبمو به عنوان راه حل کلی برای حل مشکلتون عرض میکنم:
اول اینکه نمیدونم چرا تعداد آیتم فرگمنتتون ( و به تبع اون ، تعداد تب های تب لیوت ) رو نامشخص یا همون داینامیک در نظر گرفتید(به هر حال تو این مورد به نظرم بهتره از PagerTabStrip استفاده کنید و در مورد ViewPagerAdapter هم بهتره از کلاس FragmentStatePagerAdapter استفاده کنید..
نکته بعدی که من متوجه شدم اینه که شما با هر بار کلیک روی هرکدوم از آیتم های تب لیوت دارید یک آبجکت ادپتر جدید میسازید که من منطقش رو متوجه نشدم!...
یه نکته کوچولو دیگه هم اینه که با توجه به پیاده سازی کلاس ادپترتون و اینکه متد getItemId رو تعریف مجدد(override) نکردید باید عرض کنم که این متد در حالت پیشفرضش دقیقا همون پارامتر ارسالیش رو برمیگردونه و استفاده ازش اینجا و به این صورت بی معنیه...
در آخر هم به نظر من بهتره به جای اینکه ملاکتون برای تشخیص اینکه الان کدام فرگمنت در حال نمایش در ویوپیجر هست و به تبع اون ، اطلاعات رو دریافت و به روز کنید ، موقعیت تب سِلِکت شده (position) باشه ، یک خصوصیت جدید در فرگمنتتون در نظر بگیرید و مقادیر خاصی رو به عنوان identifier برای هر فرگمنت درِش واریز کنید که با استفاده از اون ، فرگمنت رو شناسایی کنید و.... و اینکه بهتره مجموعه فرگمنت هایی که در ویوپیجر قرار دادید رو به جای اینکه در متد addFrag ، نیو کنید ابتدا نیو کنید و به یک لیست اضافه کنید و بعد از روی آیتم های اون لیست ، به این متد (addFrag) ارسال کنید....حالا نمیدونم تونستم ذهنتون رو یکم شفاف تر کنم یا نه!!امیدوارم تونسته باشم...
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .