Сохранение пути изображения из галереи в базу данных комнат и отображение его в списке Recycler - PullRequest
0 голосов
/ 30 мая 2018

Есть список студентов. Каждая строка показывает изображение, имя и номер.Я создал базу данных Room и смог заполнить только столбцы «name» и «number» в списке, используя this guide.

Когда пользователь открывает AddNewStudentActivity, ему / ей нужно выбратьфотографию из галереи, заполните два поля editTexts для имени и номера, нажмите «сохранить» и сохраните в StudentDatabase.

изображение должно отображаться в списке вместе с этими двумя текстами (имя и номер).

У меня НЕТ ИДЕИ, как это сделать, я только думаю, что процесс должен быть похож на «создание намерения, которое открывает галерею, и мы можем выбрать изображение и получить его путь , хранящийся в базе данныхи отображать его из базы данных в список ", но не знаю, как его кодировать. Об этом есть учебники, но все они использовали SQLITE, а не Room, и я новичок во всей теме базы данных.

-Спасибо

NewStudentActivity.java

public class NewStudentActivity extends AppCompatActivity {

    public static final String EXTRA_REPLY = "com.example.android.studentlistsql.REPLY";

    private EditText mNameWordView;
    private EditText mNumWordView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_student);
        mNameWordView = findViewById(R.id.name_word);
        mNumWordView = findViewById(R.id.num_word);

        final Button button = findViewById(R.id.button_save);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Intent replyIntent = new Intent();
                if (TextUtils.isEmpty(mNameWordView.getText())) {
                    setResult(RESULT_CANCELED, replyIntent);
                } else {
                    String word = mNameWordView.getText().toString();
                    replyIntent.putExtra(EXTRA_REPLY, word);
                    setResult(RESULT_OK, replyIntent);
                }
                if (TextUtils.isEmpty(mNumWordView.getText())) {
                    setResult(RESULT_CANCELED, replyIntent);
                } else {
                    String word = mNumWordView.getText().toString();
                    replyIntent.putExtra(EXTRA_REPLY, word);
                    setResult(RESULT_OK, replyIntent);
                }
                finish();
            }
        });

    }
}

StudentListAdapter.java

public class StudentListAdapter extends RecyclerView.Adapter<StudentListAdapter.WordViewHolder> {

    class WordViewHolder extends RecyclerView.ViewHolder {
        private final TextView nameItemView;
        private final TextView numberItemView;

        private WordViewHolder(View itemView) {
            super(itemView);
            nameItemView = itemView.findViewById(R.id.nameTextView);
            numberItemView = itemView.findViewById(R.id.numberTextView);
        }
    }

    private final LayoutInflater mInflater;
    private List<Student> mStudents; // Cached copy of words

    StudentListAdapter(Context context) { mInflater = LayoutInflater.from(context); }

    @Override
    public WordViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = mInflater.inflate(R.layout.recyclerview_item, parent, false);
        return new WordViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(WordViewHolder holder, int position) {
        if (mStudents != null) {
            Student current = mStudents.get(position);
            holder.nameItemView.setText(current.getStudentName());
            holder.numberItemView.setText(current.getStudentNumber());
        } else {
            // Covers the case of data not being ready yet.
            holder.nameItemView.setText("No Word");
        }
    }

    void setStudents(List<Student> words){
        mStudents = words;
        notifyDataSetChanged();
    }

    // getItemCount() is called many times, and when it is first called,
    // mWords has not been updated (means initially, it's null, and we can't return null).
    @Override
    public int getItemCount() {
        if (mStudents != null)
            return mStudents.size();
        else return 0;
    }
}

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Если честно, процесс не так уж отличается от Room .Как вы сказали, чтобы выбрать фотографию из Галереи, вы используете намерение:

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "select a picture"), YOUR_IMAGE_CODE);

Затем вы обрабатываете этот случай в onActivityResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == YOUR_IMAGE_CODE) {
        if(resultCode == RESULT_OK)
            Uri selectedImageUri = data.getData();
    }
}

Так что selectedImageUri являетсячасть информации, которую вы сохраняете в своей базе данных.В вашем классе сущностей Student.java вы можете изменить mStudentPic на String, поэтому при вставке Uri вы можете использовать метод:

selectedImageUri.toString();

и когда вы хотите преобразовать его обратно в Uri:

Uri uri = Uri.parse(yourUriAsString);

Я предполагал, что вы знаете, как вставлять и запрашивать значения из базы данных.

И тогда в вашем onBindViewHolder вы можете использовать Glide или Picasso , или любая другая библиотека для загрузки изображения, например, с Glide:

Glide.with(context)
.load(new File(uri.getPath()))
.into(imageView);
0 голосов
/ 30 мая 2018

Кроме того, я использую ту же функцию с SQLite. Я сохраняю только путь к изображению, получаю из SQLite и загружаю изображение, используя URI изображения

holder.imgUserPhoto.setImageURI(Uri.parse(new File(contactModel.getContactPhoto()).toString()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...