【问题标题】:Dynamically adding to listView in a fragment from mainActivity从 mainActivity 的片段中动态添加到 listView
【发布时间】:2016-07-01 10:34:21
【问题描述】:

我在 TabLayout 中有一个片段,其中包含一个列表。
我想在每次收到推送通知时填充该列表(来自MainActivity.OnCreate

TabFragment2.java:

public class TabFragment2 extends Fragment {

    ListView lv;
    List<String> your_array_list;
    ArrayAdapter<String> arrayAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.tab_fragment_2, container, false);
        lv = (ListView)view.findViewById(R.id.listView);
        return view;
    }

    public void addToList(String str) {

        your_array_list = new ArrayList<String>();
        your_array_list.add(str);

        arrayAdapter = new ArrayAdapter<String>(
                getActivity(),
                android.R.layout.simple_list_item_1,
                your_array_list );
        lv.setAdapter(arrayAdapter);



    }

}

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
...
...
...
        Bundle extras = getIntent().getExtras();
        // If we returned from a notification
        if(extras !=null) {
            String value = extras.getString("keynme");
            TabFragment2 tab2 = new TabFragment2();
            tab2.addToList("faaa");
        }

    }
}

问题是 TabFragment2 在被 MainActivity 调用时在 getActivity() 上崩溃。 主要活动是否必须将片段传递给活动?还会在fragment中添加吗?

编辑 崩溃日志:

07-01 13:41:50.315 20922-20922/com.push.myapplication E/AndroidRuntime: 

FATAL EXCEPTION: main
Process: com.push.myapplication, PID: 20922
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.push.myapplication/com.push.myapplication.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442)
  at android.app.ActivityThread.access$800(ActivityThread.java:156)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:211)
  at android.app.ActivityThread.main(ActivityThread.java:5373)
  at java.lang.reflect.Method.invoke(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
  at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
  at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:153)
  at com.push.myapplication.TabFragment2.addToList(TabFragment2.java:44)
  at com.push.myapplication.MainActivity.onCreate(MainActivity.java:59)
  at android.app.Activity.performCreate(Activity.java:5990)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442) 
  at android.app.ActivityThread.access$800(ActivityThread.java:156) 
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 
  at android.os.Handler.dispatchMessage(Handler.java:102) 
  at android.os.Looper.loop(Looper.java:211) 
  at android.app.ActivityThread.main(ActivityThread.java:5373) 
  at java.lang.reflect.Method.invoke(Native Method) 
  at java.lang.reflect.Method.invoke(Method.java:372) 
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

【问题讨论】:

  • 请发布您的崩溃日志

标签: android listview android-fragments fragment


【解决方案1】:

getActivity() 如果在相应片段的 onAttach 之前调用,则可以返回 null。

可能的方式:将数组your_array_list作为类变量并在onActivityCreated方法中调用Adapter初始化

【讨论】:

【解决方案2】:

我认为你应该使用接口来实现这一点

【讨论】:

    【解决方案3】:

    最好将您的片段实例创建为TabFragment2 tab2 = TabFragment2.newInstance(); 而不是TabFragment2 tab2 = new TabFragment2();

    【讨论】:

    • 我认为您可能已创建为 TabFragment2 tab2 = new TabFragment2.newInstance(); 而不是 TabFragment2 tab2 = TabFragment2.newInstance();
    • 通过此链接。它可以帮助你:stackoverflow.com/questions/9245408/…
    【解决方案4】:

    你不能这样做

    if(extras !=null) {
                String value = extras.getString("keynme");
                TabFragment2 tab2 = new TabFragment2();
                tab2.addToList("faaa");// if your fragment is not attached to activity subsequent call will crash app.
            }
    
    
    arrayAdapter = new ArrayAdapter<String>(
                    getActivity()// if your fragment is not attached to any activity this will return null,
                    android.R.layout.simple_list_item_1,
                    your_array_list );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      相关资源
      最近更新 更多