Невозможно использовать EditText в TextView в пользовательском адаптере

109
8

мы в настоящее время работаем над проектом и не можем пройти через это странное исключение NullPointerException. Мы должны указать конкретный EditText в TextView, чтобы заставить наш GridView работать. Проблема прямо сейчас в том, что все учебники, похоже, используют Activity, а мы используем фрагмент. Наша "MainActivity" находится здесь, чтобы инициализировать некоторые стартовые вещи (Splash Screen, Intro Slider и т.д.). Все остальное происходит в нашем "HomeFragment". Цель состоит в том, чтобы захватить изображение, написать заголовок и некоторый контент, а затем сохранить его в базе данных SQLite, которая может быть использована для показа в GridView позже.

Мы использовали этот ребята (github) шаблон для создания собственного db (и переписали некоторые вещи, потому что мы используем Фрагменты, конечно).

Потерпите нас при чтении кода, он еще не завершен. Тонны нежелательного кода все еще внутри.

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)

Мы не можем понять, как отбросить EditText из файла fragment_home.xml в 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" /> [...]

Любая помощь будет оценена, мой разум горит прямо сейчас, я определенно не знаю, как это решить. Если вам нужно больше, просто спросите меня. Теперь он устал, поэтому, вероятно, собираюсь переиграть поздно.

спросил(а) 2021-01-19T16:58:32+03:00 6 месяцев, 2 недели назад
1
Решение
90

okey.. Во-первых, вам нужно создать новый 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);

и запустите свою программу

ответил(а) 2021-01-19T16:58:32+03:00 6 месяцев, 2 недели назад
45

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);
}

ответил(а) 2021-01-19T16:58:32+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема