【问题标题】:Adding items to listview from bundle in fragment将项目从片段中的包添加到列表视图
【发布时间】:2015-07-13 16:59:09
【问题描述】:

场景:

第一个用户登录并进入包含默认打开的 homefragment 的 mainactivity。现在,用户从这里转到新活动,我在其中添加一些文本以编辑文本并单击添加按钮,该按钮将用户返回到主活动中的主页片段。

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

默认情况下,主页片段第一次加载它不包含任何包。

首先当我的 Main Activity 加载这个时触发:

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;
  }

}

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

在这里,我向 edittext 添加了一些文本,并将该数据通过 Intent 传递回 mainactivity,如下所示:

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);
    }

现在我的问题是我在 homefragment 中有一个列表视图,那么如何将此值添加到列表视图中 我正在尝试使用这种方式,但 logcat 向我显示 null 异常,因为当我的 mainactivity 加载 home 片段时,我没有从意图中获得任何价值:

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;
  }

}

谁能帮我解决这个问题?

【问题讨论】:

  • 为什么不使用 startActivityForResult() ?
  • @JafarKhQ-你能给我示范一下如何使用 startActivityForResult()

标签: android listview android-intent android-fragments


【解决方案1】:

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
        }
    }
}

【讨论】:

    【解决方案2】:

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

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

    所以它不会崩溃。

    【讨论】:

    • @Vishal-首先感谢您的回复,但最初当我的 mainactivity 加载主页片段时,它也会加载它尝试获取应用程序崩溃的字符串 ItemName 的位置。
    • 查找更新的答案。如果找不到,它将返回空白字符串。
    猜你喜欢
    • 2015-06-22
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多