当前位置: 首页 > 知识库问答 >
问题:

在android中每次点击选项卡时重新加载片段中的数据

齐夕
2023-03-14

我已经创建了一个应用程序的布局有三个标签在Android2.3。每个选项卡都有一个片段,在每个片段中,都有一个列表视图。在列表视图中显示的所有数据都来自互联网,数据总是在变化,所以每次我看那个片段的时候都想重新加载数据。例如,我现在正在观看“tab1”,当我单击“tab2”时,“tab2”中的数据将重新加载,而当我单击返回“tab1”时,“tab1”中的数据也将再次重新加载。我试过了

ft.detach(frg);FT.attach(frg);ft.commit();

public class MainActivity extends ActionBarActivity {

    private ViewPager pager;
    private TabsAdapter mTabsAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        pager = new ViewPager(this);
        pager.setId(R.id.pager);
        setContentView(pager);

        final ActionBar bar = getSupportActionBar();  
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mTabsAdapter = new TabsAdapter(this, getSupportActionBar(), pager);
        mTabsAdapter.addTab(bar.newTab().setText("tab1"), Tab1.class, null);
        mTabsAdapter.addTab(bar.newTab().setText("tab2"), Tab2.class, null);
        mTabsAdapter.addTab(bar.newTab().setText("tab3"), Tab3.class, null);
    }
}
public class Tab1 extends ListFragment{
    private String result;
    protected ArrayAdapter listAdapter;
    private ArrayList<String> items = new ArrayList<String>();
    final String uri = "http://localhost/sample.php";

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View rootView = inflater.inflate(R.layout.list, container, false);
        items.clear();
        Thread t = new Thread(new sendPostRunnable());
        t.start();
        listAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, items);
        setListAdapter(listAdapter);
        return rootView;
    }

    class sendPostRunnable implements Runnable{
        @Override
        public void run(){
            result = sendPostDataToInternet();
            String temp = "Not result.";
            try {
                JSONTokener jsonTokener = new JSONTokener(result); 
                JSONObject jsonObject = (JSONObject) jsonTokener.nextValue(); 
                JSONArray jarray = jsonObject.getJSONArray("response");
                for (int i = 0; i < jarray.length(); i++) { 
                    temp = "";
                    JSONObject jobject = jarray.getJSONObject(i); 
                    temp += "Name: "+jobject.getString("name")+"\n"; 
                    temp += "Email: "+jobject.getString("email"); 
                    items.add(temp);
                    temp = "";
                } 
                if(jarray.length() < 1){
                    items.add(temp);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            getActivity().runOnUiThread(new Runnable() {
                public void run() {
                    listAdapter.notifyDataSetChanged();
                }
            });

        }
    }

    private String sendPostDataToInternet(){
        HttpPost httpRequest = new HttpPost(uri);
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        try{
            httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);
            if (httpResponse.getStatusLine().getStatusCode() == 200){
                String strResult = EntityUtils.toString(httpResponse.getEntity());
                return strResult;
            }
        } catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

TabSAdapter

public class TabsAdapter extends FragmentPagerAdapter implements TabListener, OnPageChangeListener{
    private final Context mContext;
    private final ActionBar mActionBar;
    private final ViewPager mViewPager;
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
    private final String TAG = "";

    static final class TabInfo{
        private final Class<?> clss;
        private final Bundle args;

        TabInfo(Class<?> _class, Bundle _args){
            clss = _class;
            args = _args;
        }
    }

    public TabsAdapter(FragmentActivity activity, ActionBar bar, ViewPager pager) {
        super(activity.getSupportFragmentManager());
        mContext = activity;
        mActionBar = bar;
        mViewPager = pager;
        mViewPager.setAdapter(this);
        mViewPager.setOnPageChangeListener(this);

    }

    public void addTab(Tab tab, Class<?> clss, Bundle args){
        TabInfo info = new TabInfo(clss, args);
        tab.setTag(info);
        tab.setTabListener(this);
        mTabs.add(info);
        mActionBar.addTab(tab);
        notifyDataSetChanged();
    }

    @Override
    public void onPageSelected(int position) {
        mActionBar.setSelectedNavigationItem(position); 
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        mViewPager.setCurrentItem(tab.getPosition());
        Log.v(TAG, "clicked");
        Object tag = tab.getTag();
        for (int i = 0; i<mTabs.size(); i++){
            if (mTabs.get(i) == tag){
                mViewPager.setCurrentItem(i);
            }
        }
    }

    @Override
    public Fragment getItem(int position) {
        TabInfo info = mTabs.get(position);
        return Fragment.instantiate(mContext, info.clss.getName(), info.args);
    }

    @Override
    public int getCount() {
        return mTabs.size();
    }
}

共有1个答案

杜辉
2023-03-14

在片段中插入一些接口,如onmyrefreshlistener,然后:

public void onPageSelected(int position) { 
    ((OnMyRefreshListener)pagerViewAdapter.getItem()).onMyRefresh();
}
 类似资料:
  • 我在android中使用BottomNavigationView来制作一个像Instagram一样的应用程序。我在NavigationTabs中使用片段。应用程序有5个标签初始我已经设置为活动标签的中间标签和加载它一旦应用程序启动。当我单击任何其他选项卡时,就会进行网络调用并加载数据。现在,当我按下on back按钮或再次单击last选项卡(在启动时加载)时,片段将被重新创建,并进行网络调用以加载

  • 我已经在我的片段中重写了以下方法:setUserVisibleHint 在fragment类中,变量设置为:private var isLoadOnce=false。 我有3个片段,问题是当我的活动popsup时,第一个片段是可见的,如果我单击最后一个选项卡,也就是第三个选项卡加载第三个片段,什么也不会发生,即web服务根本不会调用。

  • 我使用有5个选项卡的BottomNavigationView。最初,我加载第一个标签一旦应用程序启动。当我单击任何其他选项卡时,就会调用API并加载数据。现在,当我再次单击上一个选项卡(在启动时加载)时,API调用将再次加载相同的数据。

  • 我有一个视页,有3个标签在里面。所有三个选项卡都有它们的片段。我注意到,当我将adapter设置为ViewPager时,每个片段数据都是在第一次加载的。 我需要的是只有当特定的标签被点击时才加载相应标签的片段数据。

  • 我在我的项目中使用并以片段形式显示数据。这是一个很棒的图书馆,工作很棒。每个片段都由一个学者的讲座组成,这些讲座是从web服务加载的。访问web服务的代码位于片段的方法中。目前,所有片段的数据在添加到时同时加载。我想知道是否只有当用户单击/滑动到特定的选项卡时才能加载片段的数据。不是一次什么都做。 当前的代码是相当标准的,我从提供的示例[android解决方案]中获得了帮助。1 为了确保Fragm

  • 我正在开发一个应用程序,使用ActionBar导航,我有3个标签(我不使用tabhost)如下图: 在第一个选项卡中,将显示一个名为FragmentListItem的片段,如果单击Item1,FragmentListItem将被另一个名为FragmentItemDetails的片段替换,该片段显示所选项的详细信息。 我的问题是,当我选择Tab2或tab3,然后再次选择Tab1,我得到的不再是fra