2017-08-31 59 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错误。 –

相关问题