将图库中的图像路径保存到 Room Database 并将其显示在 Recycler 列表中
Saving Image path from gallery to Room Database and display it in Recycler list
有一个列表 students.each 行显示图像、名称和编号。
我创建了一个 Room 数据库,并且只设法使用 this 指南将 "name" 和 "number" 列填充到列表中。
当用户打开 AddNewStudentActivity 时,He/She 需要从图库中选择一张照片并为姓名和号码填写两个编辑文本,然后单击 "save" 并将学生保存到学生数据库。
图像应该与这两个文本(姓名和号码)一起显示在列表中。
我不知道如何做到这一点我只是认为这个过程应该像 "setting up an intent that opens the gallery and we can choose an image and get it's path stored on the database and display it from database to the list" 但不知道如何编码 it.there 是关于这个的教程,但他们都使用 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;
}
}
此外,我在 SQLite 中使用了相同的功能,我只存储图像路径并从 SQLite 获取并使用图像 URI 加载图像
holder.imgUserPhoto.setImageURI(Uri.parse(new File(contactModel.getContactPhoto()).toString()));
老实说,这个过程与 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
是您保存在数据库中的信息。在您的实体 class Student.java
中,您可以将 mStudentPic
更改为 String
因此当您插入 Uri
时,您可以使用一种方法:
selectedImageUri.toString();
当您想将其转换回 Uri
:
Uri uri = Uri.parse(yourUriAsString);
我假设您知道如何从数据库中插入和查询值。
然后在您的 onBindViewHolder
中,您可以使用 Glide or Picasso 或任何其他库来加载图像,例如使用 Glide:
Glide.with(context)
.load(new File(uri.getPath()))
.into(imageView);
有一个列表 students.each 行显示图像、名称和编号。 我创建了一个 Room 数据库,并且只设法使用 this 指南将 "name" 和 "number" 列填充到列表中。
当用户打开 AddNewStudentActivity 时,He/She 需要从图库中选择一张照片并为姓名和号码填写两个编辑文本,然后单击 "save" 并将学生保存到学生数据库。
图像应该与这两个文本(姓名和号码)一起显示在列表中。
我不知道如何做到这一点我只是认为这个过程应该像 "setting up an intent that opens the gallery and we can choose an image and get it's path stored on the database and display it from database to the list" 但不知道如何编码 it.there 是关于这个的教程,但他们都使用 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;
}
}
此外,我在 SQLite 中使用了相同的功能,我只存储图像路径并从 SQLite 获取并使用图像 URI 加载图像
holder.imgUserPhoto.setImageURI(Uri.parse(new File(contactModel.getContactPhoto()).toString()));
老实说,这个过程与 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
是您保存在数据库中的信息。在您的实体 class Student.java
中,您可以将 mStudentPic
更改为 String
因此当您插入 Uri
时,您可以使用一种方法:
selectedImageUri.toString();
当您想将其转换回 Uri
:
Uri uri = Uri.parse(yourUriAsString);
我假设您知道如何从数据库中插入和查询值。
然后在您的 onBindViewHolder
中,您可以使用 Glide or Picasso 或任何其他库来加载图像,例如使用 Glide:
Glide.with(context)
.load(new File(uri.getPath()))
.into(imageView);