在Fragment中从Bundle添加项目到ListView

3

场景:

用户首次登录并进入主活动,其中包含一个默认打开的主页片段。现在用户从此处转到新活动,在此我向编辑文本添加一些文本,并单击添加按钮,该按钮使用户返回到主活动中的主页片段。

现在我的问题是如何将这些文本添加到我的列表视图中。

由于默认情况下主页片段仅在第一次加载时不包含任何bundle,因此我遇到了麻烦。

当我的主活动加载时,以下内容将触发:

public class HomeFragment extends Fragment  {
    ListView lv;
    public HomeFragment(){}
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_home, container, false);
    return rootView;
  }

}

加载主页片段后,它有一个列表视图,我需要向其中添加一些数据。现在,我通过点击菜单选项进入新的活动。

在这里,我向编辑框中添加一些文本,并通过意图将该数据传递回到主活动,如下所示:

addtask = (Button) findViewById(R.id.btnaddlist);
        findViewById(R.id.btnaddlist).setOnClickListener(
                  new View.OnClickListener() {
                      @Override
                      public void onClick(View arg0) {
                          EditText edit = (EditText) findViewById(R.id.tskname);
                          Intent i = new Intent(AddTask.this,
                                  MainActivity.class);
                          String TaskName = edit.getText().toString();
                          i.putExtra("NewTask", TaskName);
                          startActivity(i);
                      }
                  });

最后,我将使用以下意图获取该值:
String AddedTask ;
     if (intent.hasExtra("NewTask")) {
                 AddedTask = this.getIntent().getExtras().getString("NewTask");
                 Log.d("Task Added:",AddedTask);
                 Bundle bundle = new Bundle();
                 bundle.putString("Task Added", AddedTask);
                 HomeFragment fragobj = new HomeFragment();
                 fragobj.setArguments(bundle);
    }

现在我的问题是,我在主页片段中有一个列表视图,那么我该如何将这个值添加到列表视图中呢?我试着用以下方法,但是logcat显示我遇到了空指针异常,因为当我的MainActivity加载时,HomeFragment首先加载,并且我无法从意图中获取任何值:

public class HomeFragment extends Fragment  {
    ListView lv;
    public HomeFragment(){}
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_home, container, false);
        lv = (ListView)rootView.findViewById(R.id.tasklist);
        Bundle b = getActivity().getIntent().getExtras();
        if (b != null) {
            ArrayList<String> list = new ArrayList<String>();
            ArrayAdapter<String> Listadapter;
            String ItemName = getArguments().getString("Task Added");  
            list.add(ItemName);
            Listadapter = new ArrayAdapter<String>(getActivity().getApplicationContext(),android.R.layout.simple_list_item_1, list);
            lv.setAdapter(Listadapter);
            Listadapter.notifyDataSetChanged();

        }
        return rootView;
  }

}

有人能帮我解决这个问题吗?

1
为什么不使用startActivityForResult()函数? - JafarKhQ
@JafarKhQ,你能给我展示一下如何使用startActivityForResult()的示例吗? - coder
2个回答

2

1- 从HomeFragment/MainActivity启动第二个活动AddTaskActivity,使用以下代码:

startActivityForResult(addTaskIntent, CODE_ADD_TASK);

2- 现在在你的AddTaskActivity中,将btnaddlist回调函数更改为

@Override
public void onClick(View v) {
     EditText edit = (EditText) findViewById(R.id.tskname);
     Intent i = new Intent();
     String TaskName = edit.getText().toString();
     i.putExtra("NewTask", TaskName);
     setResult(RESULT_OK, i);
     finish();
}

3- 在您的MainActivity中重写方法onActivityResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == CODE_ADD_TASK) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            String taskName = data.getStringExtra("NewTask");
            // send this data to your Fragment and add it to the list
        }
    }
}

-1

你可以添加首次加载的检查,如下所示。

String ItemName = getArguments().getString("Task Added", "");  
if(ItemName != "") {
    list.add(ItemName);
}

这样就不会崩溃。


@Vishal-首先感谢您的回复,但最初当我的MainActivity加载时,Home Fragments也会加载,在那里它尝试获取字符串ItemName,导致应用程序崩溃。 - coder
查找更新后的答案。如果未找到,它将返回空字符串。 - vishalk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接