Java can';在AsyncTask中找不到ViewById
无法在AsyncTask中找到ViewById在ArrayAdapter中找不到costum listAdapter在SherlockListFragment中找不到FragmentPagerAdapter中的Fragment 好的,下面是场景: 我有这样一个片段: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
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之前调用的。我该怎么办?我按你说的移动了适配器。它成功了。谢谢达米特·加姆