【发布时间】:2016-05-27 14:42:41
【问题描述】:
这是我的代码:
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.fragment_add_aircraft, container, false);
recyclerView=(RecyclerView)rootView.findViewById(R.id.recyclerAircraftAdd);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
adapter = new AircraftAdapter(getActivity(),path);
recyclerView.setAdapter(adapter);
Button button = (Button)rootView.findViewById(R.id.salvaereo);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
adapter = (AircraftAdapter)recyclerView.getAdapter();
ParseObject aircraft = new ParseObject("Aircrafts");
for(int i = 0;i<adapter.getItemCount(); i++)
{
if (i== 0) //first card
{
View view = recyclerView.getLayoutManager().findViewByPosition(i);
ImageView image = (ImageView)view.findViewById(R.id.aircfraftImg);
image.setDrawingCacheEnabled(true);
image.buildDrawingCache();
Bitmap bm = image.getDrawingCache();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] bytes = stream.toByteArray();
ParseFile file = new ParseFile("Image.jpg",bytes);
aircraft.put("aircraft_image",file);
file.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
Log.d("sa","tutto ok");
}
});
}
else if (i ==1) //second card
{
View view = recyclerView.getLayoutManager().findViewByPosition(i);
EditText immatricolazione =(EditText)view.findViewById(R.id.immatricolazione);
EditText modello = (EditText)view.findViewById(R.id.modello);
EditText manifacturer = (EditText)view.findViewById(R.id.manifacturer);
EditText categoria = (EditText)view.findViewById(R.id.categoria);
EditText classe = (EditText)view.findViewById(R.id.classe);
EditText velocita = (EditText)view.findViewById(R.id.velocita);
EditText autonomia = (EditText)view.findViewById(R.id.autonomia);
EditText consumo = (EditText)view.findViewById(R.id.consumo);
EditText posti = (EditText)view.findViewById(R.id.postitotali);
EditText costo = (EditText)view.findViewById(R.id.costorario);
aircraft.put("re",immatricolazione.getEditableText().toString());
aircraft.put("ml",modello.getEditableText().toString());
aircraft.put("man",manifacturer.getEditableText().toString());
aircraft.put("Aircraft_Type",categoria.getEditableText().toString());
aircraft.put("ar",classe.getEditableText().toString());
aircraft.put("post",Integer.parseInt(posti.getEditableText().toString()));
aircraft.put("meter",Integer.parseInt(consumo.getEditableText().toString()));
aircraft.put("speed",Integer.parseInt(velocita.getEditableText().toString()));
aircraft.put("prezzi",Float.parseFloat(costo.getEditableText().toString()));
aircraft.put("fuel",Integer.parseInt(autonomia.getEditableText().toString()));
}
else if(i==2) //third card
{
View view = recyclerView.getLayoutManager().findViewByPosition(i);
EditText description = (EditText) view.findViewById(R.id.description);
aircraft.put("descrizione", description.getEditableText().toString());
aircraft.put("User", ParseUser.getCurrentUser());
dialog = ProgressDialog.show(getActivity(), "", "Caricamento aereo in corso...", true);
aircraft.saveInBackground(new SaveCallback() {
public void done(ParseException e) {
dialog.dismiss();
if (e == null) {
new AlertDialog.Builder(getActivity())
.setMessage("Caricamento aereo avvenuto con successo!")
.setCancelable(false)
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create().show();
} else {
new AlertDialog.Builder(getActivity())
.setMessage("Non è stato possibile caricare l'aereo, riprova più tardi!")
.setCancelable(false)
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create().show();
}
}
});
}
}
}
});
return rootView;
}
但是有这个问题:如果我为照片(第一张卡)充电并按下按钮,它会上传照片,但如果我写入 EditText,它会崩溃并给我这个错误:
进程:com.run.flyproject,PID:10796 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.view.View android.view.View.findViewById(int)' 在 com.run.flyproject.Fragments.AddAircraftFragment$1.onClick(AddAircraftFragment.java:78) 在 android.view.View.performClick(View.java:4756) 在 android.view.View$PerformClick.run(View.java:19749) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5253) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
【问题讨论】:
-
View数和Item数不一样。 RecyclerView 只创建填充其大小所需的视图。返回的 null 表示该项目位置的视图不存在。
-
但我只有 3 个视图..
-
"如果位置未布置则为空"。无论哪种方式,视图都不存在,您必须为此做好准备。 developer.android.com/reference/android/support/v7/widget/…
-
那我该如何解决呢?
-
声明你的 rootView final 并在你的 onClickListener 中使用
rootView.findViewById(...);。这仍然是 hacky,您需要使用 ViewHolders。
标签: android android-recyclerview