آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

مشکل با tablayoute داینامیک و ویوپیجر(لطفا راهنمایی کنید)

کوثر  6 سال پیش  6 سال پیش
0 0

دوستان خسته نباشین.یه مشکل اساسی دارم اگ لطف کنید راهنمایی کنید بنده رو تا از شر این مشکل رها بشم واقعا ممنونم.قبلا هم در این خصوص یک تاپیک گذاشته بودم اما نتیجه ای نگرفتم و این شد ک دوباره مطرح کنم.ببینید من یه ویوپیجر دارم . یک تب لایوت هم خب دارم.و تنها یک فرگمنت که شامل یک ریسایکل ویو هست دارم.خب سناریو کارم به این صورت هست.به ازای سایز یک ارای لیست ، فرگمنت به ویوپیجرم اضافه میشه به صورت کاملا داینامیک.خب به هر ایتم این 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();

    }
}
 
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
مسعود فرمانی  6 سال پیش
0 0

مطلبمو به عنوان راه حل کلی برای حل مشکلتون عرض میکنم:

اول اینکه نمیدونم چرا تعداد آیتم فرگمنتتون ( و به تبع اون ، تعداد تب های تب لیوت ) رو نامشخص یا همون داینامیک در نظر گرفتید(به هر حال تو این مورد به نظرم بهتره از PagerTabStrip استفاده کنید و در مورد ViewPagerAdapter هم بهتره از کلاس FragmentStatePagerAdapter استفاده کنید..

نکته بعدی که من متوجه شدم اینه که شما با هر بار کلیک روی هرکدوم از آیتم های تب لیوت دارید یک آبجکت ادپتر جدید میسازید که من منطقش رو متوجه نشدم!...

یه نکته کوچولو دیگه هم اینه که با توجه به پیاده سازی کلاس ادپترتون و اینکه متد getItemId رو تعریف مجدد(override) نکردید باید عرض کنم که این متد در حالت پیشفرضش دقیقا همون پارامتر ارسالیش رو برمیگردونه و استفاده ازش اینجا و به این صورت بی معنیه...

در آخر هم به نظر من بهتره به جای اینکه ملاکتون برای  تشخیص اینکه الان کدام فرگمنت در حال نمایش در ویوپیجر هست و به تبع اون ، اطلاعات رو دریافت و به روز کنید ، موقعیت تب سِلِکت شده (position) باشه ، یک خصوصیت جدید در فرگمنتتون  در نظر بگیرید و مقادیر خاصی رو به عنوان identifier برای هر فرگمنت درِش واریز کنید که با استفاده از اون ، فرگمنت رو شناسایی کنید و.... و اینکه بهتره مجموعه فرگمنت هایی که در ویوپیجر قرار دادید رو به جای اینکه در متد addFrag ، نیو کنید ابتدا نیو کنید و به یک لیست اضافه کنید و بعد از روی آیتم های اون لیست ، به این متد (addFrag) ارسال کنید....حالا نمیدونم تونستم ذهنتون رو یکم شفاف تر کنم یا نه!!امیدوارم تونسته باشم...

0 0
ممنونم از راهنماییتون دوست عزیز.اما این PagerTabStrip چه تفاوتی با این روشی که در ححال حاضر استفاده کردم داره؟ (6 سال پیش)
0 0
تفاوت که زیاد دارن هم در ظاهر و هم در پیاده سازی جاواشون ولی اگه منظورتون مزیت هست ، مزیت یکی نسبت به اون یکی رو نمیدونم!( البته کاربردشون تاحدودی فرق داره)...TabLayout یه متریال ویجت هست که جایگزین ActionBarTab شده و جدا از ویوپیجر کار میکنه (به عبارتی بخشی از لایه ی اکتیویتی یا فرگمنت هست ) ولی PagerTabStrip درون ویوپیجر باید قرار بگیره و بخشی از ویوپیجر میشه گفت هست...در کل این مورد رو فقط به عنوان سلیقه گفتم :)) ، روی صحبتم بیشتر با قسمت های دیگه ی پاسخم بوده..حالا مشکلتون حل شد؟؟؟ (6 سال پیش)
0 0
بله دوست عزیز فرصت پیش بیاد حتما راه حل صحیح رو میذارم برای دوستای دیگ اگ این مشکل پیش اومد استفاده کنند. (6 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .