java - fragment 中传递的 Arraylist 为空

标签 java android android-fragments arraylist bundle

我在主要 Activity 中创建了一个方法,该方法将 ArrayList Bundle 发送到我的 Fragment 类,但是当我尝试在 Fragment 中获取预期值时,我的 fragment 中声明的 ArrayList 为 null。有人可以帮我 checkin 我的代码吗?

主要 Activity .java: sendBundleData() 是 MainActivity 中用于将 ArrayList 包发送到 fragment 的方法

public class MainActivity extends AppCompatActivity {

private ActionBarDrawerToggle toggle;
private DrawerLayout drawerLayout;
private ListView lv;
private String[] arrValues;
private ArrayAdapter<String> adapter;
DBHelper helper;
public ArrayList<Bible> _bibleValues;

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

    /** Instance of DBHelper */
    helper = new DBHelper(MainActivity.this);

    /** Getting arraylist values from the DBHelper */
    try {
        _bibleValues=helper.queryData();
    } catch (SQLException e) {
        e.printStackTrace();
    }

    /** Initialize drawer layout */
    drawerLayout= (DrawerLayout) findViewById(R.id.drawerLayout_bibledashboard);

    //Getting the values of the String resources to the array
    arrValues=getApplicationContext().getResources().getStringArray(R.array.verse_chapter);

    //Setting the needed parameters in an Array Adapter
    adapter= new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,arrValues);
    lv= (ListView) findViewById(R.id.listview_verseTitle);
    lv.setAdapter(adapter);

    //Specify the OnItemCLick listener in the Listview
    lv.setOnItemClickListener(new DrawerItemClickListener());

    if (savedInstanceState == null){
        selectItem(0);
    }

    /** CHeck if we can createDatabase */
    try {
        helper.createDatabase();
    }catch (IOException e) {
        e.printStackTrace();
        throw  new Error("Unable to Create Database");
    }

    /** CHeck to open the database created */
    try {
        helper.openDatabase();
    }catch (SQLException e) {
        e.printStackTrace();
        throw new Error("Unable to open Database");
    }
    Log.d("Database Creation","Success");



    /** Display Sample Data Query in DATABASE
    try {
        verseList=helper.queryData();

        verseAdapter= new VerseAdapter(this,verseList);

    } catch (SQLException e) {
        e.printStackTrace();
    } */

    /** Setting up DrawerToggle */
    toggle= new ActionBarDrawerToggle(this,drawerLayout,R.string.drawer_opened,R.string.drawer_closed) {
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            invalidateOptionsMenu();
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            invalidateOptionsMenu(); /** ENd of Coding */
        }
    }; //end of toggle '}'

    drawerLayout.addDrawerListener(toggle);

    /** Enabling ActionbarDrawer toggle */
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

} /** End of OnCreate */

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    toggle.onConfigurationChanged(newConfig);
}

@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    toggle.syncState();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (toggle.onOptionsItemSelected(item)) {
    }
    return true;
}


/** Method for sending Bundle of arraylist to the Fragments*/

public void sendBundleData() {

    GenesisFragment gFragment= new GenesisFragment();
    Bundle args= new Bundle();
    args.putParcelableArrayList("verseValues",_bibleValues); /** Make the Object class Parcelable 1st */
    gFragment.setArguments(args);

}


private class DrawerItemClickListener implements ListView.OnItemClickListener {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        selectItem(position);
    }
}

private void setActionBarTitles(int position) {
    String title;
    if (position==0) {
        title="Genesis";
    }else {
        title=arrValues[position];
    }

    getSupportActionBar().setTitle(title);
}

private void selectItem(int position) {
    Fragment fragment;
    switch (position) {
        case 0:
            fragment= new GenesisFragment();
            sendBundleData();
            break;
        default:
            fragment=new GenesisFragment();
            break;
    }

    FragmentTransaction ft= getFragmentManager().beginTransaction();
    ft.replace(R.id.bible_screenlayout,fragment);
    ft.addToBackStack(null);
    ft.commit();
    setActionBarTitles(position);
    drawerLayout.closeDrawer(lv);
}

我的 fragment 类: 在 fragment 的 onCreate 方法中,我尝试检索包

    public class GenesisFragment extends Fragment {

    ListView lv;
    ArrayList<Bible> verseList;
    VerseAdapter verseAdapter;



    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        Log.d("ON ATTACH","onAttache method!");
    }

    /** @Override */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("ON CREATE","onCreate");

        Bundle bundle=getArguments();

        verseList= new ArrayList<>();
        verseList=bundle.getParcelableArrayList("verseValues"); //retrieving bundles in the MainActivity



    }

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

        verseAdapter= new VerseAdapter(getActivity(),verseList);
        // Inflate the layout for this fragment
        View v= inflater.inflate(R.layout.fragment_genesis, container, false);

        return v;



    }

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

        lv=(ListView)getActivity().findViewById(R.id.listview_genesis);

        lv.setAdapter(verseAdapter);
        verseAdapter.notifyDataSetChanged();


    }
}

最佳答案

这是因为您在 sendBundleData() 中将参数设置为不同的 fragment 实例并替换了一个单独的实例

将 fragment 作为参数传递给方法

public void sendBundleData(Fragment fragment) {


Bundle args= new Bundle();
args.putParcelableArrayList("verseValues",_bibleValues); /** Make the Object class Parcelable 1st */
fragment.setArguments(args);

}

你的 switch case 看起来像

  switch (position) {
    case 0:
        fragment= new GenesisFragment();
        sendBundleData(fragment);
        break;
    default:
        fragment=new GenesisFragment();
        break;
}

关于java - fragment 中传递的 Arraylist 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38700042/

相关文章:

java - 为什么我的 HTTP POST 请求无法发送到我的网页?

android - 我可以使用 Android studio Avd 管理器在 Windows 上运行 iOS 模拟器吗?

android - 将触摸事件从对话框 fragment 传递到下方的 View (在父 Activity 内)

java - 放置自动完成 fragment 在 Android 5.0 及更高版本上不起作用

java - Android:从 Volley 回调中填充 fragment 中的 ListView

java - 如何安装 Eclipse Paho 客户端 View

java - 如何将私钥与证书链绑定(bind)?

java - 如何进行JoinTable注解映射

android - 如何在 Android 上合成乐器的声音(钢琴、鼓、吉他等...)

android - 从 BroadcastReceiver 启动 Activity