M D P
M D P

Reputation: 4620

can't findViewById inside AsyncTask

Can't findViewById inside AsyncTask inside ArrayAdapter costum listAdapter inside SherlockListFragment inside FragmentPagerAdapter. !!!

OK here is the scenario:

I have a fragment like this:

public class Fragment_Conversation_Section extends SherlockListFragment {

    View myFragmentView;

    public Fragment_Conversation_Section() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ListAdapter listAdapter = new Adapter_ConversationFragmentAdapter(getActivity(), R.layout.items_conversation,myFragmentView);
        setListAdapter(listAdapter);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        myFragmentView = inflater.inflate(R.layout.fragment_conversation, container, false);
        return myFragmentView;
    }


}

I created myFragmentView variable to pass it to my custom ListAdapter.

ListAdapter listAdapter = new Adapter_ConversationFragmentAdapter(getActivity(), R.layout.items_conversation,myFragmentView);

Now this is inside my custom ListAdapter

public class Adapter_ConversationFragmentAdapter extends ArrayAdapter<Array_Object_Chat_Interface> {

    Context context;
    int layoutResourceId;   
    int conversationsNo;
    List<Array_Object_Chat_Interface> conversationsItems;
    View rootView;

    public Adapter_ConversationFragmentAdapter(Context context, int layoutResourceId,View myView) {
        super(context, layoutResourceId);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.rootView = myView;
        this.conversationsNo = 0;

        conversationsItems = new ArrayList<Array_Object_Chat_Interface>();
        ArrayList<String> fName = new ArrayList<String>();

        AsyncTask<Void, Integer, String> getConversationsTask = new AsyncTask<Void, Integer, String>(){

            private ProgressBar pb;
            @Override
            protected String doInBackground(Void... params) {

              //doing some http request stuff in background
            }
            @Override
            protected void onPostExecute(String result)
            {
                Log.d("result.>>>", result);
            }


            @Override
            protected void onPreExecute() {

                pb = (ProgressBar) rootView.findViewById(R.id.progressbar2); // this is causing the error
            }


            @Override
            protected void onProgressUpdate(Integer... values) {
                pb.setProgress(values[0]);
            }

        };
        getConversationsTask.execute();



        for (int i = 0; i < conversationsNo; i++){
            Array_Object_Chat_Interface item = new Array_Object_Chat_Interface(fName.get(i));
            conversationsItems.add(item);

        }

    }


    /*private view holder class*/
    private class ViewHolder {
        TextView FName;
    }

    @Override
    public int getCount() {
        return this.conversationsNo;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
       // Check if an existing view is being reused, otherwise inflate the view
       if (convertView == null) {
           LayoutInflater inflater = ((Activity)context).getLayoutInflater();
           convertView = inflater.inflate(layoutResourceId, parent, false);

          holder = new ViewHolder();
          holder.FName = (TextView) convertView.findViewById(R.id.fName);

          convertView.setTag(holder);
       } else {
           holder = (ViewHolder) convertView.getTag();
       }

       Array_Object_Chat_Interface ChatInterface = conversationsItems.get(position);

       holder.FriendName.setText(ChatInterface.fName);

       return convertView;
   }
}

I'm passing myFragmentView from fragment to list adapter which is being passed to new variable(myView) through construction part which is finally passed to the variable "rootView ". now inside onPreExecute() i want to find the progress bar which is inside the layout R.layout.fragment_conversation which was inflated inside onCreateView() of the fragment.

but on runtime it crashes and shows these errors:

logcat:

06-05 17:19:18.854: E/AndroidRuntime(324): FATAL EXCEPTION: main
06-05 17:19:18.854: E/AndroidRuntime(324): java.lang.NullPointerException
06-05 17:19:18.854: E/AndroidRuntime(324):  at com.example.android.Fragments.Adapter_ConversationFragmentAdapter$1.onPreExecute(Adapter_ConversationFragmentAdapter.java:146)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.os.AsyncTask.execute(AsyncTask.java:391)
06-05 17:19:18.854: E/AndroidRuntime(324):  at com.example.android.Fragments.Adapter_ConversationFragmentAdapter.<init>(Adapter_ConversationFragmentAdapter.java:156)
06-05 17:19:18.854: E/AndroidRuntime(324):  at com.example.android.Fragments.Fragment_Conversation_Section.onCreate(Fragment_Conversation_Section.java:26)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:834)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.view.ViewPager.populate(ViewPager.java:804)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.View.measure(View.java:8313)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.View.measure(View.java:8313)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.View.measure(View.java:8313)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.View.measure(View.java:8313)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.View.measure(View.java:8313)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.View.measure(View.java:8313)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.os.Looper.loop(Looper.java:123)
06-05 17:19:18.854: E/AndroidRuntime(324):  at android.app.ActivityThread.main(ActivityThread.java:3683)
06-05 17:19:18.854: E/AndroidRuntime(324):  at java.lang.reflect.Method.invokeNative(Native Method)
06-05 17:19:18.854: E/AndroidRuntime(324):  at java.lang.reflect.Method.invoke(Method.java:507)
06-05 17:19:18.854: E/AndroidRuntime(324):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-05 17:19:18.854: E/AndroidRuntime(324):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-05 17:19:18.854: E/AndroidRuntime(324):  at dalvik.system.NativeStart.main(Native Method) 

Adapter_ConversationFragmentAdapter.java:146 is this line inside onPreExecute():

pb = (ProgressBar) rootView.findViewById(R.id.progressbar2);

Upvotes: 0

Views: 770

Answers (2)

Shayan Pourvatan
Shayan Pourvatan

Reputation: 11948

onCreate called before onCreateView

more info on Android Developer Site

in your scenario you create your adapter in onCreate method but you initilize your view in onCreateView, so you get NPE, because rootView is null in adapter class

you call following code in onCreate method:

ListAdapter listAdapter = new Adapter_ConversationFragmentAdapter(getActivity(), R.layout.items_conversation,myFragmentView);
setListAdapter(listAdapter);

myFragmentView being initialized in onCreateView, so this is null in onCreate method, so you can use following code:

copy following code to onCreate method:

myFragmentView = inflater.inflate(R.layout.fragment_conversation, container, false);

or move adapter initializing after that line

UPDATE

change your code to:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        myFragmentView = inflater.inflate(R.layout.fragment_conversation, container, false);

        ListAdapter listAdapter = new Adapter_ConversationFragmentAdapter(getActivity(), R.layout.items_conversation,myFragmentView);
        setListAdapter(listAdapter);

        return myFragmentView;
    }

and remove onCreate part

Upvotes: 2

Federico Ponzi
Federico Ponzi

Reputation: 2775

This is because findViewById can return a null value if the input id isn't found in the xml layout file.

Finds a view that was identified by the id attribute from the XML that was processed in onCreate(Bundle).

Returns
The view if found or null otherwise.

I suggest you to check if you attach the right layout file, and if there is inside of it the correct id.

Also check for rootview not being null (you can check this using a if(rootview == null))

Upvotes: 0

Related Questions