Android:无法从其他活动刷新listfragment

时间:2016-05-25 18:15:08

标签: android android-arrayadapter android-listfragment

我的ListFragment有问题。我无法访问它的ListAdapter,因为我尝试这样做时总是得到NullPointerException:

ListFragment fragment = (ListFragment) getSupportFragmentManager().findFragmentByTag("fraglist1");
BaseAdapter adapter = (BaseAdapter) fragment.getListAdapter();
adapter.notifyDataSetChanged();

下面是我实现片段的XML文件:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/fragment1"
        android:name="com.example.exapmle.handlers.fragments.SavedEventsListFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

以下是我在SavedEventsListFragment.java类中的内容,在代码片段后面有一个onItemClick方法,但它与它无关,所以我将其删除。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fraglist, container, false);
    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    savedevents = new ArrayList<>();
    DatabaseHandler db = new DatabaseHandler(getContext());
    for (Event e : db.getAllEvents()) {
        savedevents.add(e);
    }


    if (savedevents!=null) {
        SavedEventAdapter adapter = new SavedEventAdapter(getContext(), savedevents);

        setListAdapter(adapter);
        getListView().setOnItemClickListener(this);

        ListView lv = getListView(); // your listview inside scrollview
        lv.setOnTouchListener(new ListView.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                        // Disallow ScrollView to intercept touch events.
                        v.getParent().requestDisallowInterceptTouchEvent(true);
                        break;

                    case MotionEvent.ACTION_UP:
                        // Allow ScrollView to intercept touch events.
                        v.getParent().requestDisallowInterceptTouchEvent(false);
                        break;
                }

                // Handle ListView touch events.
                v.onTouchEvent(event);
                return true;
            }
        });
    }
}

这里是SavedEventAdapter.java类,我在其中设置ListView中行的布局:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    //ViewHolder holder;

    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.fraglist_item, parent, false);

    Event e = getItem(position);

    TextView title = (TextView) rowView.findViewById(R.id.title);

    Date parsedstartdate = new Date();
    Date parseenddate = new Date();
    parsedstartdate.setTime(Long.parseLong(e.getStartdate())*1000);
    parseenddate.setTime(Long.parseLong(e.getEnddate())*1000);
    DateFormat df = DateFormat.getDateInstance();

    title.setText(e.getTitle() + "\n" + df.format(parsedstartdate) + " - " + df.format(parseenddate));

    CheckBox chb = (CheckBox) rowView.findViewById(R.id.savedtodbchb);
    chb.setClickable(false);

    ImageView picture = (ImageView) rowView.findViewById(R.id.picture);
    Picasso.with(context).load(e.getPicurl()).error(R.drawable.blackwallpaperbackground_big).resize(400,500).into(picture);
    picture.setColorFilter(Color.rgb(80,80,80), PorterDuff.Mode.MULTIPLY);
    picture.setScaleType(ImageView.ScaleType.FIT_XY);


    return rowView;

基本上我试图将事件添加到数据库,并且当它添加时它应该更新显示数据库中事件的活动中的列表。我得到了这个例外:

FATAL EXCEPTION: main
Process: com.vladmarton.eventaarhus, PID: 14022
java.lang.NullPointerException: Attempt to invoke virtual method 'android.widget.ListAdapter android.support.v4.app.ListFragment.getListAdapter()' on a null object reference
at com.vladmarton.eventaarhus.EventDetailsActivity$1.onClick(EventDetailsActivity.java:122)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

也许我想念一些小东西,我已经尝试了另外两种方法来实现它,我在这里找到了stackoverflow,但没有一个帮助。我对ListFragments有很小的经验,它让我发疯,所以如果有人有任何想法,请评论:)谢谢

1 个答案:

答案 0 :(得分:0)

您没有为片段设置标记,导致findFragmentById()返回null。将XML片段更改为此标记以添加标记。

<fragment
        android:id="@+id/fragment1"
        android:name="com.example.exapmle.handlers.fragments.SavedEventsListFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:tag="fraglist1" />