PagerSlidingTabStrip: как обновить внутренний фрагмент списка в текущей вкладке во время выполнения и остановить загрузку данных для следующей вкладки

Я застрял в проблеме со списком просмотра, используемым с внутренним фрагментом внутри вкладок ViewPager "навигационный ящик-страница-скользящая-вкладка-полоска", приведенным в этом примере с git hub.

Я использую тот же пример и все 4 вкладки, имеющие представление списка с другим набором arraylist для там адаптеров.

Я использую только один фрагмент и основы позиции вкладок. Я загружаю различные данные списка во внутренний фрагмент arrayAdapter. Также у меня есть две кнопки, одна из которых - удалить, а другая - Добавить.

Что я хочу: если я нажму кнопку добавления, то она должна добавить новые данные в список массивов (в зависимости от положения вкладки добавить новое добавление в соответствующий массив arrayList) и обновить данные списка.

В моем коде это обновление текущей вкладки просмотра, но в следующей вкладке просмотр списка также обновляет и берет данные предыдущей вкладки. Пожалуйста, помогите мне в этом, любая помощь будет оценена.

У меня есть один файл класса для этого. Если мой подход неверен, пожалуйста, дайте мне знать правильный подход.

открытый класс PageSlidingTabStripFragment extends Fragment {

public static final String TAG = PageSlidingTabStripFragment.class
        .getSimpleName();

private MyListAdapter myAdapter;

private boolean isDeleteBtnClicked = false;
private int tabType = 0;
private ListView myListView;

public static PageSlidingTabStripFragment newInstance() {
    return new PageSlidingTabStripFragment();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.pager, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) view
            .findViewById(R.id.tabs);
    ViewPager pager = (ViewPager) view.findViewById(R.id.pager);
    MyPagerAdapter adapter = new MyPagerAdapter(getChildFragmentManager());
    pager.setAdapter(adapter);
    tabs.setViewPager(pager);

}

public class MyPagerAdapter extends FragmentPagerAdapter {

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    private final String[] TITLES = { "Categories", "Home", "Top Paid",
    "Top Free" };

    @Override
    public CharSequence getPageTitle(int position) {
        return TITLES[position];
    }

    @Override
    public int getCount() {
        return TITLES.length;
    }

    @Override
    public SherlockFragment getItem(int position) {

        return new SuperAwesomeCardFragment().newInstance(position); // here I am calling the fragment by sending the position
    }

}
private ArrayList<String> categoriesList = new ArrayList<String>(); 
private ArrayList<String> homeList = new ArrayList<String>();
private ArrayList<String> topPaidList = new ArrayList<String>();
private ArrayList<String> topFreeList = new ArrayList<String>();

@SuppressLint("ValidFragment")
public class SuperAwesomeCardFragment extends SherlockFragment{

    private final String ARG_POSITION = "position";

    private int position;

    private Button deleteBtn;
    private Button addBtn;

    public SuperAwesomeCardFragment newInstance(int position) {
        SuperAwesomeCardFragment f = new SuperAwesomeCardFragment();
        Bundle b = new Bundle();
        b.putInt(ARG_POSITION, position);
        f.setArguments(b);
        return f;
    }

    public SuperAwesomeCardFragment(){

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        categoriesList.clear();
        // adding element to Categories arraylist
        categoriesList.add("categories -1");
        categoriesList.add("categories -2");
        categoriesList.add("categories -3");
        categoriesList.add("categories -4");

        homeList.clear();
        // adding element to Home arraylist
        homeList.add("home -1");
        homeList.add("home -2");
        homeList.add("home -3");
        homeList.add("home -4");

        topPaidList.clear();
        // adding element to TopPaid arraylist
        topPaidList.add("topPaid -1");
        topPaidList.add("topPaid -2");
        topPaidList.add("topPaid -3");  
        topPaidList.add("topPaid -4");

        topFreeList.clear();
        // adding element to TopFree arraylist
        topFreeList.add("topFree -1");
        topFreeList.add("topFree -2");
        topFreeList.add("topFree -3");
        topFreeList.add("topFree -4"); 

        position = getArguments().getInt(ARG_POSITION); // here I get the position of tab/view pager
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View root = inflater.inflate(R.layout.main_pager_body, container, false);

        myListView = (ListView) root.findViewById(R.id.my_list_view);
        deleteBtn = (Button) root.findViewById(R.id.delete_btn);
        addBtn = (Button) root.findViewById(R.id.add_btn);

        switch (position) {
        // Categories position
        case 0:
            setListView(categoriesList);
            break;
            // Home position
        case 1:
            setListView(homeList);
            break;
            // TopPaid position
        case 2:
            setListView(topPaidList);
            break;
            // TopFree position
        case 3:
            setListView(topFreeList);
            break; 
        } // here I am setting the list view based on the tab/view pager position.

        deleteBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(), "deleteBtn Button clicked", Toast.LENGTH_SHORT).show();

            }
        });

        addBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(), " addBtn Button clicked", Toast.LENGTH_SHORT).show();

                switch (position) {
                // Categories position
                case 0:
                    categoriesList.add("categories -5");
                    setListView(categoriesList);
                    break;
                    // Home position
                case 1:
                    homeList.add("home -5");
                    setListView(homeList);
                    break;
                    // TopPaid position
                case 2:
                    topPaidList.add("topPaid -5");
                    setListView(topPaidList);
                    break;
                    // TopFree position
                case 3:
                    topFreeList.add("topFree -5");
                    setListView(topFreeList);
                    break;
                }

            }
        });

        return root;
    }

    public void setListView(ArrayList<String> myList){
        myAdapter = new MyListAdapter(getActivity().getApplicationContext(), R.layout.list_row, myList);
        myListView.setAdapter(myAdapter);
        myListView.setItemsCanFocus(true);
        myAdapter.notifyDataSetChanged();
    }
}

public class MyListAdapter extends ArrayAdapter<String>
{
    ArrayList<String> myList;
    public MyListAdapter(Context context, int textViewResourceId,
            ArrayList<String> myList) {
        super(context, textViewResourceId, myList);

        this.myList = myList;
    }

    public class ViewHolder {
        private TextView listElementTV;
        private RelativeLayout buttonContains;
        private Button deleteItemBtn;
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;
        ViewHolder holder = null;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            // get the view for assign data to list view
            v = vi.inflate(R.layout.list_row, null);

            TextView listElementTV = (TextView) v.findViewById(R.id.list_element);

            RelativeLayout buttonContains = (RelativeLayout) v.findViewById(R.id.button_contains);
            Button deleteItemBtn = (Button) v.findViewById(R.id.delete_item);

            holder = new ViewHolder();

            holder.listElementTV = listElementTV;
            holder.buttonContains = buttonContains;
            holder.deleteItemBtn = deleteItemBtn;

            v.setTag(holder);
        } else
            holder = (ViewHolder) v.getTag();

        // get list of hospitalityInfo using position
        String listElement = this.myList.get(position); 

        if(listElement != null){
            holder.listElementTV.setText(listElement);
        }

        return v;
    }

}

}

1 ответ

Решение

Android Learner

слишком поздно для ответа, но может быть, помогает другим

Пользователь под ссылкой для решения такой реализации.

Альтернатива для onResume() во время переключения фрагментов

Другие вопросы по тегам