在Fragment中将项添加到ListView

时间:2015-05-01 17:31:37

标签: android listview android-fragments

情境:

用户Login --->启动MainActivity - > Navigation drawer从操作栏中的菜单进入新活动

在新活动中,我有edittext,其中包含简单的button

现在,如果我在edittext中添加一些文本并单击按钮,我将edittext放在一个包中,将其传递给MainActivity。

现在我的问题是我能够传递意图并获取捆绑包,但是当我尝试将该文本添加到listview应用程序崩溃时。

这是我的活动代码:

addlist = (ImageButton) findViewById(R.id.btnaddlist);
  findViewById(R.id.btnaddlist).setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    EditText edit = (EditText) findViewById(R.id.txtlist);
                    Intent i = new Intent(CreateList.this,
                            MainActivity.class);
                    Bundle bundle = new Bundle();
                    String ItemName = edit.getText().toString();
                    // Add your data from getFactualResults method to bundle
                    bundle.putString("ListItemName", ItemName);
                    // Add the bundle to the intent
                    i.putExtras(bundle);
                    startActivity(i);
                }
            });

}

这是我的HomeFragment:

ListView lv;
@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.list);
    Bundle itemintent = getActivity().getIntent().getExtras();
    String ItemName = itemintent.getString("ListItemName");
    if (ItemName.equals("ListItemName")) {
        /** Items entered by the user is stored in this ArrayList variable */
        ArrayList<String> list = new ArrayList<String>();
        list.add(ItemName);
        /** Declaring an ArrayAdapter to set items to ListView */
        ArrayAdapter<String> Listadapter;
        Listadapter = new ArrayAdapter<String>(getActivity().getApplicationContext(),android.R.layout.simple_list_item_1, list);
        lv.setAdapter(Listadapter);
        Listadapter.notifyDataSetChanged();
        }

        return rootView;
}

Logcat错误:

05-01 22:54:07.116: D/AndroidRuntime(19368): Shutting down VM
05-01 22:54:07.143: E/AndroidRuntime(19368): FATAL EXCEPTION: main
05-01 22:54:07.143: E/AndroidRuntime(19368): Process: com.sample.example, PID: 19368
05-01 22:54:07.143: E/AndroidRuntime(19368): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sample.example/com.sample.example.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.app.ActivityThread.access$800(ActivityThread.java:148)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.os.Handler.dispatchMessage(Handler.java:102)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.os.Looper.loop(Looper.java:135)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.app.ActivityThread.main(ActivityThread.java:5312)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at java.lang.reflect.Method.invoke(Native Method)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at java.lang.reflect.Method.invoke(Method.java:372)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
05-01 22:54:07.143: E/AndroidRuntime(19368): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
05-01 22:54:07.143: E/AndroidRuntime(19368):    at com.sample.example.HomeFragment.onCreateView(HomeFragment.java:28)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.app.Fragment.performCreateView(Fragment.java:2053)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.app.BackStackRecord.run(BackStackRecord.java:833)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1454)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.app.Activity.performStart(Activity.java:5968)
05-01 22:54:07.143: E/AndroidRuntime(19368):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2277)
05-01 22:54:07.143: E/AndroidRuntime(19368):    ... 10 more

3 个答案:

答案 0 :(得分:0)

根据您的评论,您将获得活动中的数据,但不会获取片段中的数据。也许你无法获得在片段中开始活动的意图数据,但我发现这很奇怪。

你可以解决问题。创建主活动后,获取该数据并将其保存到公共变量中。

public String itemName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle extras = getIntent().getExtras();
        if(extras != null) {
           itemName = extras.getString("ListItemName");
        }
        else{
          // Something else is wrong
          finish();
        }
    }

然后在你片段中做这个

 String ItemName = ((MainActivity) getActivity()).itemName;

答案 1 :(得分:0)

请明确说明您的错误

空对象引用上的

java.lang.String.equals(java.lang.Object)'

所以它在

其中if (ItemName.equals("ListItemName"))为空

ItemName

你能试试吗

this.getArguments().getString("ListItemName")

也使用

传递

fragment.setArguments(bundle);

以下是错误的

Bundle itemintent = getActivity().getIntent().getExtras(); String ItemName = itemintent.getString("ListItemName");

您正在访问捆绑值可能为null的活动的意图

答案 2 :(得分:0)

简单的方法;在MainActivity String获取bundle String并将其保存到另一个String。稍后将Fragment传递给Argument s Bundle s或更好String ItemName = itemintent.getString("ListItemName");本身。

现在,您的问题String ItemName = null可以翻译为getString("ListItemName"),原因是null返回String ItemName = itemintent.getString("ListItemName" ,"this default value helps prevent NPE"); //was added in api 12 您应该使用

String

这样你的错误就会消失,但这不是最终的解决方案,因为你想要一个返回的Bundle,为此采用简单的方法。 这是一个疯狂的猜测,我很擅长我在想Intent nullified Activity的原因是因为你的Intent通过nullfied

使用相同的'{:%Y-%m-%d}'.format(d) 重新创建