我很难让Fragments与Tabs/Swiping一起使用。我有一个 Activity 和两个 fragment ,其中一个具有ListView。我想要的是当我使用ListView从 fragment 1滑动到 fragment 时,刷新ListView,或者如果可能的话,重新创建第二个 fragment ...。

我现在正在尝试的是使用FragmentTransaction.replace()这样的:

public void onTabSelected(Tab arg0, android.app.FragmentTransaction arg1) {
    // TODO Auto-generated method stub

    Fragment frag = new FragmentTwo();

    FragmentTransaction trans = getSupportFragmentManager().beginTransaction();

    if (arg0.getPosition() == 1) {
        trans.replace(R.id.pager, frag);
        trans.addToBackStack(null);
        trans.commit();
    }
}

所以我以为,当我滑动到选项卡2(即带有ListView的选项卡)时,它将替换为它创建的新选项卡。实际发生的是,当我滑动到选项卡2时,它会使用ListView重新创建 fragment (我知道,因为在onCreateView中有一个对话框显示在屏幕上),但是 fragment/选项卡是空白/黑色。我究竟做错了什么?这个创建的 fragment 会去哪里?

我不知道这些 fragment 的代码是否相关,但是请告诉我是否应该张贴它,并且我可以这样做。这是我的PagerAdapter类。
public class TabsPagerAdapter extends FragmentPagerAdapter {
public TabsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int index) {

    switch (index) {
    case 0:
        return new FragmentOne();
    case 1:
        return new FragmentTwo();
    case 2:
        return new FragmentThree();
    }
    return null;
}

@Override
public int getCount() {
    // get item count - equal to number of tabs
    return 3;
}
}

谢谢你的帮助!我真的很想把头发拔出来:(

编辑:

当您从选项卡1滑动到选项卡2时,选项卡2会显示我的对话框,然后加载该选项卡,但是如果我返回到选项卡1,则全黑...如果再次回到选项卡2,它会再次创建并显示我的对话框然后又变黑了...

编辑:(添加 ListView fragment 代码)

公共(public)类FragmentTwo扩展了Fragment {
// Progress Dialog
private ProgressDialog pDialog;

// Creating JSON Parser object
JSONParser_Helpers2 jParser = new JSONParser_Helpers2();

ArrayList<HashMap<String, String>> tripList;

// url to get all products list
private static String url_all_trips = "http://10.0.2.2/android_connect/get_all_trips.php";

// JSON Node names
private static final String TAG_SUCCESS = "success";
private static final String TAG_TRIPS = "trips";
private static final String TAG_TRIPID = "tripid";
private static final String TAG_TRIPNAME = "tripName";
private static final String TAG_UID = "uid32";

// products JSONArray
JSONArray trips = null;

View rootView;
Button btnRefresh;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    //View rootView = inflater.inflate(R.layout.fragment_one, container, false);

    rootView = inflater.inflate(R.layout.fragment_two, container, false);
    btnRefresh = (Button) rootView.findViewById(R.id.refresh);

    // Hashmap for ListView
    tripList = new ArrayList<HashMap<String, String>>();

    // Loading products in Background Thread
    new LoadAllProducts().execute();

    // Get listview
    ListView lv = (ListView) rootView.findViewById(R.id.list);


    // on seleting single product
    // launching Edit Product Screen
    lv.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //getting values from selected ListItem
        String tripid = ((TextView) view.findViewById(R.id.pid)).getText().toString();

        //starting new intent
        Intent in = new Intent(getActivity(), EditTrip_Activity.class);
        //sending pid to next activity
        in.putExtra(TAG_TRIPID, tripid);

        //starting new activity and expecting some response back
        startActivityForResult(in, 100);
    }

    });
    return rootView;
}

/**
 * Background Async Task to Load all product by making HTTP Request
 * */
class LoadAllProducts extends AsyncTask<String, String, String> {

    ListView lv = (ListView) rootView.findViewById(R.id.list);
    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Loading your trips. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    /**
     * getting All products from url
     * */
    protected String doInBackground(String... args) {
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        // getting JSON string from URL
        JSONObject json = jParser.makeHttpRequest(url_all_trips, "GET", params);

        // Check your log cat for JSON response
        Log.d("All Trips: ", json.toString());

        try {
            // Checking for SUCCESS TAG
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1) {
                // products found
                // Getting Array of Products
                trips = json.getJSONArray(TAG_TRIPS);

                // looping through All Products
                for (int i = 0; i < trips.length(); i++) {
                    JSONObject c = trips.getJSONObject(i);

                    // Storing each json item in variable
                    String tripid = c.getString(TAG_TRIPID);
                    String tripname = c.getString(TAG_TRIPNAME);
                    String userId = c.getString("uid");

                    // creating new HashMap
                    DatabaseHandler_Helpers db = new DatabaseHandler_Helpers(getActivity());
                    HashMap<String, String> map = new HashMap<String, String>();

                    if (userId.equals(db.getUserDetails().get("uid"))) {
                        // adding each child node to HashMap key => value
                        map.put(TAG_TRIPID, tripid);
                        map.put(TAG_TRIPNAME, tripname);

                        // adding HashList to ArrayList
                        tripList.add(map);
                    } //else {
                        //map.put(TAG_TRIPID, "");
                        //map.put(TAG_TRIPNAME, "You have no tracked trips.");

                        //tripList.add(map);
                    //}
                }
            } else {
                // no products found
                // Launch Add New product Activity
                Intent i = new Intent(getActivity(),
                        NewTrip_Activity.class);
                // Closing all previous activities
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog after getting all products
        pDialog.dismiss();

        // updating UI from Background Thread
        ((Activity) getActivity()).runOnUiThread(new Runnable() {
            public void run() {
                /**
                 * Updating parsed JSON data into ListView
                 * */

                ListAdapter adapter = new SimpleAdapter(
                        getActivity(), tripList,
                        R.layout.list_item, new String[] { TAG_TRIPID,
                                TAG_TRIPNAME},
                        new int[] { R.id.pid, R.id.name });
                // updating listview
                ((ListView) lv.findViewById(R.id.list)).setAdapter(adapter);
            }
        });
     }
 }

}

最佳答案

尝试扩展FragmentStatePagerAdapter而不是FragmentPagerAdapter。

这是我的 fragment 代码,对我来说很好用:

//Adapter
public class AllPagesAdapter extends FragmentStatePagerAdapter {



            public AllPagesAdapter(FragmentManager fm) {

                super(fm);

            }

            @Override
            public Fragment getItem(int index) {

        switch (index) {
            case 0:

                return new Android();

            case 1:

                return new CoreJava();
            case 2:

                return new J2EE();

            case 3:

                return new Database();

            case 4:

                return new WebServices();


        }
        return null;


    }

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

}

//For example, this is one fragment:

public class Database extends Fragment {

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

        View databaseview = inflater.inflate(R.layout.database, container, false);

        return databaseview;

    }


}

//My MainActivity

public class AllActivities extends FragmentActivity implements ActionBar.TabListener {

    public ViewPager viewPager;
    private AllPagesAdapter mAdapter;
    private ActionBar actionBar;
    private String [] tabs = {"Android","CoreJava","J2EE","Database","Web Services"};

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

        //Initializing all stuff
        viewPager = (ViewPager)findViewById(R.id.pager);

        actionBar = getActionBar();
        mAdapter = new AllPagesAdapter(getSupportFragmentManager());
        viewPager.setAdapter(mAdapter);
        actionBar.setHomeButtonEnabled(true);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);



        //Add the tabs here
        for(String tab_name:tabs){
            actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
        }

        viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){

            @Override
        public void onPageSelected(int position){

                //on Page change, that particular page should be selected
                actionBar.setSelectedNavigationItem(position);
            }

            @Override
                public void onPageScrolled(int arg0,float arg1,int arg2){

            }
            @Override
        public void onPageScrollStateChanged(int position){

            }

        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction fragmentTransaction) {

        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction fragmentTransaction) {



    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction fragmentTransaction) {

        viewPager.setCurrentItem(tab.getPosition());

    }
}

让我知道您是否还希望在任一 fragment 中实现listview。

希望这可以帮助..:)

10-07 19:31
查看更多