java - 将数据从 Activity 传递到可滑动 View fragment

标签 java android listview android-fragments tabs

好吧,我是 Android 编程新手,这是我的问题。我有一个异步任务,它通过 httpget 请求从服务器收集 json 数据,并更新可滑动 View 中的 ListView fragment 。我想要一种将数据(一堆字符串)从主 TabActivity 类发送到 Tab1Fragment 类的方法。

我已经尽力将代码精简到最核心的部分。

注意:我已经尝试过在其他类似问题中读过的 bundle 方法,但它们最终都会在 fragment 中抛出 NULL 指针异常,这意味着 bundle 没有被发送。(?)

这是我的主要选项卡 Activity :

 TabActivity.java
public class TabActivity extends ActionBarActivity  implements ActionBar.TabListener {
private String phoneno;
private static String url = "http://my/url/forjson";

//JSON Node Names 
private static final String TAG_OPERATOR = "operator";
private static final String TAG_REGNO = "Reg No";

public String  operator;
public String regNo;


private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
// Tab titles
private String[] tabs = { "Details", "Others"};
Bundle bundle = new Bundle();

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

        Intent intent = getIntent();
    phoneno = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); 
    new JSONParse().execute();

    viewPager = (ViewPager) findViewById(R.id.pager);
    actionBar = getSupportActionBar();
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

    viewPager.setAdapter(mAdapter);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        

    // Adding Tabs
    for (String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name)
                .setTabListener(this));
    }

    /**
     * on swiping the viewpager make respective tab selected
     * */
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            // on changing the page
            // make respected tab selected
            actionBar.setSelectedNavigationItem(position);
        }

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

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}

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

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // on tab selected
    // show respected fragment view
    viewPager.setCurrentItem(tab.getPosition());

}

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

/*Private Class to parse JSON*/
private class JSONParse extends AsyncTask<String, String, JSONObject> {
       private ProgressDialog pDialog;
      @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(TabActivity.this);
            pDialog.setMessage("Getting Data ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
      }
      @SuppressWarnings("finally")
    @Override
        protected JSONObject doInBackground(String... args) {

    //*     
    JSONParser jParser = new JSONParser();

        // Getting JSON from URL    
        StringBuilder finalUrl = new StringBuilder();
        JSONObject jsonForData = new JSONObject();
        try{
        finalUrl.append(url);
        jsonForData = jParser.getJSONFromUrl(finalUrl.toString());

        }catch (JSONException e) {
              e.printStackTrace();
            }
        return jsonForData;
      }

       @Override
         protected void onPostExecute(JSONObject json) {
         pDialog.dismiss();
         try {

            Bundle bundle=new Bundle();
            bundle.putString("oper", json.getString(TAG_OPERATOR));
            bundle.putString("regNo", json.getString(TAG_REGNO));

            mAdapter.getData(bundle);

        } catch (JSONException e) {
          e.printStackTrace();
        }
       }
    }
 }

在上面的代码中,请理解我实例化的 JSONPasrser 类从 url 返回一个 JSONObject 并且它可以工作。所以,没有问题。

此外,我的 fragment 类是一个 ListView ,如下所示:

Tab1Fragment.java

public class Tab1Fragment extends ListFragment{

  @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_tab1, container, false);
        String abc = "No Details Presently Available";

        //Fill all string values with something
        String[] values = new String[2];
        for(int i=0;i<values.length;i++)
            values[i] = " ";
        //Make Sure number of elements match
        try{
        values[0] = "Provider: " +  getArguments().getString("oper");//Gives a NULL value
        values[1] = "No: " + +  getArguments().getString("regNo");//Gives a NULL value

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1,values);
        // Assign adapter to ListView
        setListAdapter(adapter); 
        }
        catch(Exception e){
            e.printStackTrace();
            Log.w("Error","The App didn't have enough elements specified to populate the listview");
        }
        return rootView;
    }
 }

我硬编码的“abc”字符串理想情况下应该包含从 TabActivity 类发送的详细信息。

我希望上面的 fragment 从 TabActivity 类接收数据来填充 ListView 。如有任何帮助,我们将不胜感激:)

编辑:我根据非法参数的建议更改了适配器类,如下所示。

现在, bundle 作为 TabActivity->TabsPagerAdapter->Tab1Fragment 传递 但仍然返回了 NULL 值。

我的适配器类现在如下:

  TabsPagerAdapter.java
 public class TabsPagerAdapter extends FragmentStatePagerAdapter {
 Bundle bundle = new Bundle();

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

@Override
public Fragment getItem(int index) {

    switch (index) {
    case 0:
        Fragment fragment = new Tab1Fragment();

        this.bundle.putString("operator", "hi");
        fragment.setArguments(this.bundle);
        return fragment;
    case 1:
        return new Tab2Fragment();
    }

    return null;
}

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

public void getData(Bundle bundle){
    this.bundle = bundle;
}

}

最佳答案

我可以看到您已经通过 bundle 成功传递了数据。请删除这个。从下面的代码:

this.bundle.putString("operator", "hi");
    fragment.setArguments(this.bundle);

更改它,因为不需要以这种方式访问​​它:

bundle.putString("operator", "hi");
    fragment.setArguments(bundle);

在你的 Tab1Fragment.java 上你可以尝试这样的事情:

    if(getArguments()!=null){
String sentString = getArguments().getString("operator");
}

关于java - 将数据从 Activity 传递到可滑动 View fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24310853/

相关文章:

android - 在手机上设置 <select> 列表选项的样式

android - SlidingTabLayout 选项卡之间的通信

java - 我在服务器输入流扫描仪中收到此 no line found 异常

java - 使用命令提示符编译类时出现错误 : package org. jsoup.Jsoup 不存在

android - 使用相机拍照后自动上传照片到Phonegap

Android 列表适配器问题

Android ListView 搜索和快速滚动

java - 如何获取抽象父类中子类被重写的内容信息

java - 如何在 Freemarker 中自定义/替换异常消息以使它们更有意义?

listview - QML ListView 在其边界之外绘制 ObjectModel