2017-08-31 39 views
0

我們目前正在開發一個項目,無法通過這個奇怪的NullPointerException。我們必須將特定的EditText轉換爲TextView才能使我們的GridView正常工作。現在的問題是,所有教程似乎都使用了一個Activity,而我們正在使用Fragment。我們的「MainActivity」只是在這裏啓動一些初學者的東西(啓動畫面,簡介滑塊等)。所有其他的東西都發生在我們的「HomeFragment」中。我們的目標是捕獲一張圖片,寫一個標題和一些內容,然後將其保存到一個SQLite數據庫中,以後可以用它在GridView中顯示它。無法將EditText投射到自定義適配器中的TextView中

我們使用this guys(github)模板來創建我們自己的數據庫(並重寫了一些內容,因爲我們使用的是碎片,當然)。

在閱讀代碼時忍受着我們,它還沒有最終確定。垃圾代碼仍在裏面。

FragmentHome.class

public class FragmentHome extends Fragment { 

private ImageButton mUnicornButton; 
private ImageButton mBaseballbatButton; 
private ImageButton mExplosionButton; 
private ImageButton mCowButton; 
private ImageButton mShitButton; 
private ImageButton mPenguinButton; 

private final int REQUEST_GALLERY_CODE = 999; 

EditText edtTitle, edtContent; 
Button btnAdd, btnChoose; 

private ImageView mImageView; 
protected View mView; 

private static final int CAMERA_REQUEST = 1888; 

public FragmentHome() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
} 


public static SQLiteHelper sqLiteHelper; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_home, container, false); 
    this.mView = v; 

    initUI(v); 
    sqLiteHelper = new SQLiteHelper(getActivity().getApplicationContext(), "ListDB.sqlite",null,1); 
    sqLiteHelper.queryData("CREATE TABLE IF NOT EXISTS DBLIST(Id INTEGER PRIMARY KEY AUTOINCREMENT, title VARCHAR, content VARCHAR, image BLOB)"); 

    btnChoose.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},REQUEST_GALLERY_CODE); 
     } 
    }); 
    Button photoButton = v.findViewById(R.id.add_foto); 
    photoButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(cameraIntent, CAMERA_REQUEST); 
     } 
    }); 
    btnAdd.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      try{ 
       sqLiteHelper.insertData(
         edtTitle.getText().toString().trim(), 
         edtContent.getText().toString().trim(), 
         imageViewToByte(mImageView) 
         ); 
       Toast.makeText(getActivity().getApplicationContext(),"Added",Toast.LENGTH_SHORT).show(); 
       edtTitle.setText(""); 
       edtContent.setText(""); 
       mImageView.setImageResource(R.mipmap.ic_launcher_round); 

      } catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
    }); 



    return v; 
} 

private byte[] imageViewToByte(ImageView image) { 
    Bitmap bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap(); 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.JPEG,0,stream); 
    byte[] byteArray = stream.toByteArray(); 
    return byteArray; 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){ 
    if(requestCode == REQUEST_GALLERY_CODE){ 
     if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
      Intent intent = new Intent(Intent.ACTION_PICK); 
      intent.setType("image/*"); 
      startActivityForResult(intent, REQUEST_GALLERY_CODE); 
     } 
     else { 
      Toast.makeText(getActivity().getApplicationContext(),"No Permissions",Toast.LENGTH_SHORT).show(); 
     } 
     return; 
    } 
    super.onRequestPermissionsResult(requestCode,permissions,grantResults); 
} 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data){ 
    if(requestCode == CAMERA_REQUEST){ 
     if(resultCode == Activity.RESULT_OK){ 
      Bitmap bmp = (Bitmap) data.getExtras().get("data"); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 

      bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 
      byte[] byteArray = stream.toByteArray(); 

      Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray,0,byteArray.length); 

      mImageView.setImageBitmap(bitmap); 
     } 
    } 
} 

private void initUI(View v) { 

    [...] //initializes everything using findViewById() 
} 

} 

DBListAdapter.class(我們的定製適配器)

public class DBListAdapter extends BaseAdapter{ 

private Context context; 
private int layout; 
private ArrayList<DBList> dblistsList; 

public DBListAdapter(Context context, int layout, ArrayList<DBList> dblistsList) { 
    this.context = context; 
    this.layout = layout; 
    this.dblistsList = dblistsList; 
} 

@Override 
public int getCount() { 
    return dblistsList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return dblistsList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 


private class ViewHolder{ 
    ImageView imageView; 
    TextView txtTitle, txtContent; 
} 


@Override 
public View getView(int position, View view, ViewGroup viewGroup) { 

    View row = view; 
    ViewHolder holder = new ViewHolder(); 
    if(row==null){ 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = inflater.inflate(layout, null); 

     holder.txtTitle = row.findViewById(R.id.input_title); 
     holder.txtContent = row.findViewById(R.id.input_content); 
     holder.imageView = row.findViewById(R.id.fotoView); 
     row.setTag(holder); 
    } 
    else{ 
     holder = (ViewHolder) row.getTag(); 

    } 

    DBList dbList = dblistsList.get(position); 

    holder.txtTitle.setText(dbList.getTitle()); 
    holder.txtContent.setText(dbList.getContent()); 

    byte[] dblistImage = dbList.getImage(); 
    Bitmap bitmap = BitmapFactory.decodeByteArray(dblistImage, 0, dblistImage.length); 

    holder.imageView.setImageBitmap(bitmap); 
    return row; 
} 
} 

的問題是在這個適配器。

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference at s***.d***.u***.th***ive.DBListAdapter.getView(DBListAdapter.java:78) 

我們無法弄清楚如何從fragment_home.xml投下的EditText成一個TextView,這是需要的ViewHolder。

fragment_home.xml

[...] 
<ImageView 
    android:id="@+id/fotoView" 
    android:layout_width="match_parent" 
    android:layout_height="250dp" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentTop="true" 
    android:background="@color/Gainsboro" 
    app:srcCompat="@android:drawable/ic_menu_camera" /> 

<EditText 
    android:id="@+id/input_title" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:hint="Title" 
    android:inputType="text" 
    android:maxLines="1" 
    android:textAlignment="center" 
    android:layout_above="@+id/input_content" 
    android:layout_alignParentStart="true" /> 

<EditText 
    android:id="@+id/input_content" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:hint="@string/hint_what" 
    android:inputType="textMultiLine" 
    android:textAlignment="center" 
    android:layout_above="@+id/linearLayout" 
    android:layout_alignParentStart="true" 
    android:layout_marginBottom="33dp" /> [...] 

任何幫助,將不勝感激,我的心在燃燒,現在,我certaintly不知道如何解決這個問題。如果你需要更多,請問我。現在有點累了,所以可能會遲到重播。

+0

如果'fragment_home.xml'是你'Fragment'佈局,那麼'ImageView'和那些'TextView's應該是在一個單獨的佈局列表項的' R.id',你可以在你的'DBListAdapter'構造函數調用中將其作爲第二個參數傳遞給它。 –

+0

將您的ViewHolder的類型從'TextView'改爲'EditText' –

+0

@MikeM。我已經使用瞭解決方案,現在它顯示在我的網格中,但不是作爲TextView。我仍然可以「編輯」網格內的內容。 –

回答

0

好..首先,你需要創建新的XML文件,並將它命名爲你想...讓我們假設它的名字是list_reycle_view然後將這些意見傳遞給它

<ImageView 
    android:id="@+id/fotoView" 
    android:layout_width="match_parent" 
    android:layout_height="250dp" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentTop="true" 
    android:background="@color/Gainsboro" 
    app:srcCompat="@android:drawable/ic_menu_camera" /> 

<EditText 
    android:id="@+id/input_title" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:hint="Title" 
    android:inputType="text" 
    android:maxLines="1" 
    android:textAlignment="center" 
    android:layout_above="@+id/input_content" 
    android:layout_alignParentStart="true" /> 

<EditText 
    android:id="@+id/input_content" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:hint="@string/hint_what" 
    android:inputType="textMultiLine" 
    android:textAlignment="center" 
    android:layout_above="@+id/linearLayout" 
    android:layout_alignParentStart="true" 
    android:layout_marginBottom="33dp" /> 

然後..更換這些線

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    row = inflater.inflate(layout, null); 

與此線

row= LayoutInflater.from(context).inflate(R.layout.list_recycle_view,viewGroup,false); 

並運行程序

+0

這是解決方案,謝謝!現在我只需重新設計我的GridView,它應該是好的去! +1 –

+0

我可以在結果中添加它,現在它顯示爲EditText,而不是我的列表中的TextView。還有什麼方法可以施展它? –

+0

你可以更新你的問題並解釋你想要投射哪個編輯文本..以及哪個文本視圖 –

0
ViewHolder holder = null; 
if (row == null) { 
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    row = inflater.inflate(layout, null); 
    holder = new ViewHolder(); 
    holder.txtTitle = row.findViewById(R.id.input_title); 
    holder.txtContent = row.findViewById(R.id.input_content); 
    holder.imageView = row.findViewById(R.id.fotoView); 
    row.setTag(holder); 
} 
+0

?除了改變對象的創建而不是外部的if子句之外,沒有任何事情可做。仍然收到NullPo錯誤。 –

相關問題