在 activity 开始时使用列表视图获取选项卡中两个选项卡的相同列表

Getting same list for two tabs in tabs with listview on start of activity

所以,我有这个 activity,其中包含带有列表视图的选项卡,我面临的问题是:

第一个和第二个选项卡具有相同的内容,即第二个选项卡应该具有的内容在第一个和第二个选项卡中。

第三个选项卡的内容正确,但这是因为它最初只实例化了第一个和第二个选项卡。 当我设置
mViewPager.setOffscreenPageLimit(2);

三个标签的内容都是一样的,也就是第三个标签的内容

但是在我滚动到第三个选项卡然后滚动回第一个选项卡后,第一个选项卡会刷新并显示正确的内容。

此外,下一个问题是第二个选项卡永远不会刷新,因为它总是在打开的选项卡的右侧或左侧。 我希望标签每次打开时都刷新,因为我会不断更改列表中的 material。

package com.towntrot.anil.towntrot_eventmanager_02;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class SlidingTabsBasicFragment extends Fragment {

ListView list;
public ArrayList<ListModel> CustomListViewValuesArr = new ArrayList<ListModel>();
public guestlist gg;
private SlidingTabLayout mSlidingTabLayout;
private ViewPager mViewPager;
private String[] eventtype={"CHECKED IN","CHECKED OUT","WAITING"};

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

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
    mViewPager.setAdapter(new SamplePagerAdapter());
    mSlidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.sliding_tabs);
    mSlidingTabLayout.setViewPager(mViewPager);
}

class SamplePagerAdapter extends PagerAdapter {

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public boolean isViewFromObject(View view, Object o) {
        return o == view;
    }

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {

        View view = getActivity().getLayoutInflater().inflate(R.layout.pager_item,
                container, false);
        guestlist gg=(guestlist)getActivity();
        StringBuilder sb = new StringBuilder();
        sb.append("");
        sb.append(position);
        String strI = sb.toString();
        Toast.makeText(getActivity(),strI,Toast.LENGTH_LONG).show();
        setListData(gg.getNamelist(), gg.getStatuslist(), gg.getNo0fPeople(), position);
        list= ( ListView )view.findViewById(R.id.list);
        CustomAdapter adapter;
        adapter=new CustomAdapter( getActivity(), CustomListViewValuesArr);
        list.setAdapter(adapter);
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

}
public void setListData(String[] string,String[] status,int no,int pos) {
    CustomListViewValuesArr.clear();
    for (int i = 0; i < no; i++) {

        final ListModel name = new ListModel();
        int x=Integer.parseInt(status[i]);
        if(pos==x){ name.setCompanyName(string[i]);
        CustomListViewValuesArr.add(name);}
    }
}


}

请帮帮我,我看了很多答案,但无法解决这个问题。任何帮助表示赞赏。

问题是每次实例化寻呼机项目时,您都在调用 setListData,这又会用给定位置的数据填充 CustomListViewValuesArr。然后你的列表适配器直接使用这个数组,因为它是在你的片段中定义的,并且根据最后一个实例化的项目,它的内容会改变。

CustomListViewValuesArr改为局部变量;在您的 setListData 方法中创建一个新的 ArrayList<ListModel> 对象并 return 它,使用 returned 对象作为您的 CustomAdapter 构造函数参数。