【问题标题】:java.lang.IllegalStateException during onitemclick randomlyonitemclick 期间的 java.lang.IllegalStateException 随机
【发布时间】:2018-03-27 02:29:09
【问题描述】:

我在点击时随机收到此错误,并非每次都发生,只是偶尔发生。

java.lang.IllegalStateException:适配器的内容发生了变化,但ListView没有收到通知。确保适配器的内容不是从后台线程修改的,而只是从 UI 线程修改的。确保您的适配器在其内容更改时调用 notifyDataSetChanged()。

import android.content.*;
import android.os.*;
import android.support.v4.app.*;
import android.util.*;
import android.view.*;
import android.widget.*;
import android.widget.AdapterView.*;


import java.util.*;
import org.json.*;

import com.google.firebase.analytics.FirebaseAnalytics;
import com.theappguru.fixturesync.Settings;

import static com.google.android.gms.internal.zzahg.runOnUiThread;


public class menufragment extends Fragment {


    private String TAG = MainActivity.class.getSimpleName();
    public ListView list;
    public ArrayList<menufragmentinfos> countries = new ArrayList<menufragmentinfos>();
    public menufragmentadapter adapter;
    private MainActivity mActivity;
    private FirebaseAnalytics mFirebaseAnalytics;

    public menufragment() {
        // Required empty public constructor
    }

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





    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(com.theappguru.fixturesync.R.layout.menufragment, container, false);
    }

    private class Wrapper
    {

        String Title = "Undefinded";

    }


    @Override
    public void onViewCreated(View view, Bundle savedInstanceState)
    {
        LinearLayout loading = (LinearLayout) getView().findViewById(com.theappguru.fixturesync.R.id.loading);
        loading.setVisibility(View.VISIBLE);

        mFirebaseAnalytics = FirebaseAnalytics.getInstance(getActivity());

        list = (ListView) getView().findViewById(com.theappguru.fixturesync.R.id.list);
        adapter = new menufragmentadapter(this);

        list.setAdapter(adapter);


        list.setOnItemClickListener(new OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                String type = countries.get(position).type;
                String data = countries.get(position).data;
                String link = countries.get(position).link;
                String availability = countries.get(position).availability;
                String date = countries.get(position).date;
                String name = countries.get(position).name;




                if (type.equals("fixture")){
                    mActivity = (MainActivity) getActivity();

                    Bundle bundle = new Bundle();
                    bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, name);
                    bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, type);
                    mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);

                    String url = link;
                    String username = "";
                    String password = "";
                    Settings settings = mActivity.getSettings();
                    settings.putString(Settings.PREF_LASTURL, url);

                    SharedPreferences msharedpref = getActivity().getSharedPreferences("calendar" , 0);
                    SharedPreferences.Editor editor = msharedpref.edit();
                    editor.putString("link", url);
                    editor.putString("name", name);
                    editor.putString("type", "");
                    editor.apply();


                    mActivity.setSource(url, null, username, password);
                    mActivity.test();}


                if (type.equals("menu")){

                    if (availability.equals("not available")){
                        Toast.makeText(getActivity().getApplicationContext(),
                                "Fixtures Not Published Yet Please Check Back After "+date,
                                Toast.LENGTH_LONG)
                                .show();
                    }
                    else {

                        try {


                            Bundle bundle1 = new Bundle();
                            bundle1.putString("message", countries.get(position).data);
                            menufragment fragInfo = new menufragment();
                            fragInfo.setArguments(bundle1);

                            FragmentManager fm = getFragmentManager();
                            FragmentTransaction fragmentTransaction = fm.beginTransaction();
                            fragmentTransaction.add(com.theappguru.fixturesync.R.id.changeFragment, fragInfo);
                            fragmentTransaction.addToBackStack("tag");
                            fragmentTransaction.commit();


                        }
                        catch (Exception e) {
                            Log.e("menu", e.toString());
                        }

                    }
                }

                // Making a request to url and getting response




            }
        });










        new GetContacts().execute();




        super.onViewCreated(view, savedInstanceState);
    }




    private class GetContacts extends AsyncTask<Void, Void, Wrapper> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();


        }

        @Override
        protected Wrapper doInBackground(Void... arg0) {
            HttpHandler sh = new HttpHandler();

            Wrapper w = new Wrapper();
            String Title = "a";




            String jsonStr = getArguments().getString("message");





            Log.e(TAG, "Response from url: " + jsonStr);



            if (jsonStr != null) {
                try {





                    countries.clear();

                    JSONObject data_array=new JSONObject(jsonStr);

                    JSONArray phone = data_array.getJSONArray("data");








                    for (int i = 0 ; i < phone.length() ; i++) {
                        JSONObject obj = new JSONObject(phone.get(i).toString());

                        menufragmentinfos add = new menufragmentinfos();
                        add.name = obj.getString("name");

                        String type = obj.getString("type");
                        String availability = obj.optString("availability");
                        String date = obj.optString("date");


                        add.type = type;
                        add.availability = availability;
                        add.date = date;
                        if (type.equals("menu")){
                            add.data = (obj.toString());
                        }
                        if (type.equals("fixture")){
                            add.link = obj.getString("link");
                        }









                        countries.add(add);


                    }



                } catch (final JSONException e) {
                    Log.e(TAG, "Json parsing error: " + e.toString());



                }
            } else {
                Log.e(TAG, "Couldn't get json from server.");


            }

            return w;
        }


        @Override
        protected void onPostExecute(Wrapper w) {
            super.onPostExecute(w);

            runOnUiThread(new Runnable()
            {
                @Override
                public void run() {
                    adapter.notifyDataSetChanged();
                }});



            LinearLayout loading = (LinearLayout) getView().findViewById(com.theappguru.fixturesync.R.id.loading);
            loading.setVisibility(View.GONE);


        }


    }







    @Override
    public void onPause() {
        runOnUiThread(new Runnable()
        {
            @Override
            public void run() {
                adapter.notifyDataSetChanged();
            }});
        super.onPause();

    }

    /** Called when returning to the activity */
    @Override
    public void onResume() {

        runOnUiThread(new Runnable()
        {
            @Override
            public void run() {
                adapter.notifyDataSetChanged();
            }});
        super.onResume();



    }

    /** Called before the activity is destroyed */
    @Override
    public void onDestroy() {

        super.onDestroy();


    }





}

适配器

import android.content.*;
import android.view.*;
import android.widget.*;

public class menufragmentadapter extends BaseAdapter {

    private RelativeLayout background;

    menufragment main;

    menufragmentadapter(menufragment main)
    {
        this.main = main;
    }

    @Override
    public int getCount() {
        return  main.countries.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    static class ViewHolderItem {
        TextView name;


    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        ViewHolderItem holder = new ViewHolderItem();
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) main.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(com.theappguru.fixturesync.R.layout.menufragmentcells, null);

            holder.name = (TextView) convertView.findViewById(com.theappguru.fixturesync.R.id.name);


            convertView.setTag(holder);
        }
        else
        {




            holder = (ViewHolderItem) convertView.getTag();
        }


        holder.name.setText(this.main.countries.get(position).name);














        return convertView;


    }



}

日志

15 14:22:11.977 16877-16877/com.theappguru.fixturesync E/AndroidRuntime: 致命异常: main 进程:com.theappguru.fixturesync,PID:16877 java.lang.IllegalStateException:适配器的内容已更改,但 ListView 没有收到通知。确保适配器的内容不是从后台线程修改的,而只是从 UI 线程修改的。确保您的适配器在其内容更改时调用 notifyDataSetChanged()。 [在 ListView(2131361839, class android.widget.ListView) with Adapter(class com.theappguru.fixturesync.ui.menufragmentadapter)] 在 android.widget.ListView.layoutChildren(ListView.java:1623) 在 android.widget.AbsListView.onLayout(AbsListView.java:2205) 在 android.view.View.layout(View.java:17564) 在 android.view.ViewGroup.layout(ViewGroup.java:5654) 在 android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079) 在 android.view.View.layout(View.java:17564) 在 android.view.ViewGroup.layout(ViewGroup.java:5654) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:261) 在 android.view.View.layout(View.java:17564) 在 android.view.ViewGroup.layout(ViewGroup.java:5654) 在 android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079) 在 android.view.View.layout(View.java:17564) 在 android.view.ViewGroup.layout(ViewGroup.java:5654) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:261) 在 android.view.View.layout(View.java:17564) 在 android.view.ViewGroup.layout(ViewGroup.java:5654) 在 com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:493) 在 android.view.View.layout(View.java:17564) 在 android.view.ViewGroup.layout(ViewGroup.java:5654) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:261) 在 com.android.internal.policy.DecorView.onLayout(DecorView.java:725) 在 android.view.View.layout(View.java:17564) 在 android.view.ViewGroup.layout(ViewGroup.java:5654) 在 android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2406) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2126) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1286) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6536) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:871) 在 android.view.Choreographer.doCallbacks(Choreographer.java:683) 在 android.view.Choreographer.doFrame(Choreographer.java:619) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6247) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)

【问题讨论】:

标签: java android listview


【解决方案1】:

您的 doInBackground 方法正在修改适配器的内容(清除列表并再次填充它),同时您的适配器也引用了相同的变量。对适配器内的国家/地区列表使用不同的引用,并在 onPostExecute 方法中填充它。

【讨论】:

  • 好的,谢谢我试试看,我认为后台的 do 只在创建时调用一次,不会再出现问题。
  • 我可以知道,为什么投反对票?你用这种方法试过没有用吗?
  • 反对票不是来自我。我刚刚尝试过,不幸的是它没有解决问题。不过还是谢谢。
  • 哦,好吧。如果我有时间,我会试试你的代码,看看我能不能让它工作。您是否尝试通过 Dima Kozhevin 对您的问题发表评论的链接?
猜你喜欢
  • 2012-04-15
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多