Java can';在AsyncTask中找不到ViewById

Java can';在AsyncTask中找不到ViewById,java,android,android-intent,android-fragments,android-asynctask,Java,Android,Android Intent,Android Fragments,Android Asynctask,无法在AsyncTask中找到ViewById在ArrayAdapter中找不到costum listAdapter在SherlockListFragment中找不到FragmentPagerAdapter中的Fragment 好的,下面是场景: 我有这样一个片段: public class Fragment_Conversation_Section extends SherlockListFragment { View myFragmentView; public Frag

无法在AsyncTask中找到ViewById在ArrayAdapter中找不到costum listAdapter在SherlockListFragment中找不到FragmentPagerAdapter中的Fragment

好的,下面是场景:

我有这样一个片段:

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;
    }


}
我创建了myFragmentView变量以将其传递给自定义ListAdapter

ListAdapter listAdapter = new Adapter_ConversationFragmentAdapter(getActivity(), R.layout.items_conversation,myFragmentView);
现在,这是在我的自定义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;
   }
}

这是因为如果在xml布局文件中找不到输入id,findViewById可以返回空值

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.
我建议您检查是否附加了正确的布局文件,以及其中是否有正确的id


还要检查rootview是否不为null(您可以使用
if(rootview==null)
来检查这一点)

onCreate
onCreateView
之前调用

更多关于

在您的场景中,您在onCreate方法中创建了适配器,但在onCreateView中初始化了视图,所以您得到了NPE,因为在适配器类中rootView为null

在onCreate方法中调用以下代码:

ListAdapter listAdapter = new Adapter_ConversationFragmentAdapter(getActivity(), R.layout.items_conversation,myFragmentView);
setListAdapter(listAdapter);
myFragmentView = inflater.inflate(R.layout.fragment_conversation, container, false);
myFragmentView正在onCreateView中初始化,因此在onCreate方法中为null,因此您可以使用以下代码:

将以下代码复制到onCreate方法:

ListAdapter listAdapter = new Adapter_ConversationFragmentAdapter(getActivity(), R.layout.items_conversation,myFragmentView);
setListAdapter(listAdapter);
myFragmentView = inflater.inflate(R.layout.fragment_conversation, container, false);
或者将适配器移动到该行之后

更新

将代码更改为:

    @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;
    }

并删除onCreate部分

try,
ListAdapter ListAdapter=new Adapter\u ConversationFragmentAdapter(getActivity(),R.layout.items\u conversation,getListView().getRootView())谢谢你的回答。根视图为空。但它的名称是正确的,在该布局中有一个id为progressbar2的视图。正如@shayan pourvatan所说,这是因为onCreate是在OnCreateView之前调用的。我该怎么办?我按你说的移动了适配器。它成功了。谢谢达米特·加姆