这是我的代码:
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:尝试在com.run.flyproject的空对象引用上调用虚拟方法'android.view.View android.view.View.findViewById(int)' .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(在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller处的java.lang.reflect.Method.invoke(Method.java:372)处的java.lang.reflect.Method.invoke(Native Method)处的ActivityThread.java:5253)。在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)上运行(ZygoteInit.java:899)
并不是说这是一个明确的答案(明确的答案将类似于“您的适配器数量与适配器上可用的视图不一致”之类的东西),但是我的评论可能会有些混乱。你可以做这样的事情...
public class YourAdapter extends RecyclerView.Adapter<YourViewHolder>{
private boolean mSaveImages = false;
private SparseArray<Boolean> mImageSavedFlags = new SparseArray<>();
public void toggleSaveStatus(){
mSaveImages = !mSaveImages;
}
// ... your code
@Override
public void onBindViewHolder(YourViewHolder holder, final int position) {
// Could also manage this in a loop or something
// in your constructor/when you set your adapter data
// but this will set our SparseArray
if(mImageSavedFlags.get(position) == null)
mImageSavedFlags.put(position, false);
// ... your code
if(mSaveImages && !mImageSavedFlags.get(position){
// ... save your image
mImageSavedFlags.put(position, true);
}
}
// ... your code
}
这样,无论何时尝试绑定视图,都可以检查是否要保存ImageViews源,如果尚未保存,则可以保存源并更新SparseArray。
要切换您的状态,只需执行以下操作
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v){
adapter.toggleSaveStatus();
}
}
值得注意的是,这只会在打开保存设置后才保存您实际滚动到的图像。我想您可以强制滚动RecyclerView,但这会引起其他问题。
同样重要的是要认识到,如果您正在执行诸如基于位置从URL或可绘制对象中加载图像之类的操作,则实际上并不需要ImageView来加载源,然后再保存它,因此有很多一种方法(包括库)来保存尚未显式加载到您的应用程序中的图像,这将完全消除在此过程中包括适配器的需要。
我确信这不是执行此操作的唯一方法,并且我确信这不是最佳答案,但是我的评论再次变得有些混乱。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句