Как поместить изображение ссылки в SQLite и отобразить в RecyclerView

#java #android #android-recyclerview

#java #Android #android-recyclerview

Вопрос:

Это мой небольшой проект, я могу ввести имя, адрес и телефон в SQLite и отобразить его. А затем я хочу заполнить ссылку на изображение в поле и отобразить изображение в RecyclerView. Пожалуйста, помогите!

Вот мое приложение и код:

Отображение RecyclerView, без изображения

И я хочу заполнить изображение ссылки в это поле … и появится img!

MainActivity:

 public class MainActivity extends AppCompatActivity {
    private StudentAdapter studentAdapter;
    private ArrayList<Student> studentList;
    private StudentDatabase studentDatabase;
    private FloatingActionButton floatingActionButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        floatingActionButton = findViewById(R.id.floatingActionButton);
        final RecyclerView recyclerView = findViewById(R.id.recycle);

        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        studentAdapter = new StudentAdapter();
        studentDatabase = new StudentDatabase(this);
        studentList = new ArrayList<>();
        studentList = studentDatabase.getAll();
        recyclerView.setAdapter(studentAdapter);
        studentAdapter.setData(studentList);
        Student student = new Student();
        recyclerView.smoothScrollToPosition(studentList.size());

        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, CreateStudent.class);
                Student student = new Student();
                intent.putExtra("data", student);
                startActivityForResult(intent, 800);
            }
        });

        studentAdapter.setOnClickEvent(new StudentAdapter.OnClickEvent() {
            @Override
            public void OnItemClick(int position) {
                Student student = studentList.get(position);
                Intent intent = new Intent(MainActivity.this, ModifyStudent.class);
                intent.putExtra("data", student);
                startActivityForResult(intent, 70);
            }

            @Override
            public void OnDelete(int position) {
                Student student = studentList.get(position);
                studentDatabase.delete(student.getId());
                studentList.remove(position);
                studentList = studentDatabase.getAll();
                studentAdapter.setData(studentList);

            }
        });

    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 70 amp;amp; resultCode == RESULT_OK) {
            Student student = (Student) data.getSerializableExtra("returnData");
            studentDatabase.update(student);
            studentList = studentDatabase.getAll();
            studentAdapter.setData(studentList);
        }
        if (requestCode == 800 amp;amp; resultCode == RESULT_OK) {
            studentList = studentDatabase.getAll();
            studentAdapter.setData(studentList);
        }
    }
}
 

Student.java:

 public class Student implements Serializable {
    private String img;
    private int id;
    private String name;
    private String address;
    private String phone;

    public Student(String img, int id, String name, String address, String phone) {
        this.img = img;
        this.id = id;
        this.name = name;
        this.address = address;
        this.phone = phone;
    }
    public Student(){

    }

    public String getImg() {
        return img;
    }

    public void setImg(String img) {
        this.img = img;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}
 

CreateStudent.java:

 public class CreateStudent extends AppCompatActivity {
    private EditText createName, createAddress, creatPhone, createImage;
    private StudentDatabase studentDatabase;
    private Button btnCreate;
    private Button btnCancle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create_student2);
        createName = findViewById(R.id.create_name);
        createAddress = findViewById(R.id.create_address);
        creatPhone = findViewById(R.id.create_phone);
        btnCreate = findViewById(R.id.btn_create);
        btnCancle = findViewById(R.id.btn_cancle);
        createImage = findViewById(R.id.create_img);
        
        final Student student = new Student();
        if (student != null) {
            createName.setText(student.getName());
            createAddress.setText(student.getAddress());
            creatPhone.setText(student.getPhone());
        }
        btnCreate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String cname = createName.getText().toString();
                String caddress = createAddress.getText().toString();
                String cphone = creatPhone.getText().toString();
                String cimage = createImage.getText().toString();
                if (cname.trim().equals("") || caddress.trim().equals("") || cphone.trim().equals("")) {
                    btnCreate.setEnabled(false);
                } else {
                    student.setName(cname);
                    student.setAddress(caddress);
                    student.setPhone(cphone);
                    student.setImg(cimage);
                    studentDatabase = new StudentDatabase(CreateStudent.this);
                    studentDatabase.addStudent(student);
                    Intent intent = new Intent();
                    intent.putExtra("createData", student);
                    setResult(RESULT_OK, intent);
                    finish();
                }
            }
        });
        btnCancle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}
 

StudentDatabase.java:

 public class StudentDatabase extends SQLiteOpenHelper {

    public StudentDatabase(@Nullable Context context) {
        super(context, "STUDENT_DATABASE", null, 1);
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
        String query = "CREATE TABLE STUDENT(ID INTEGER PRIMARY KEY, NAME TEXT, ADDRESS TEXT, PHONE INTEGER)";
        db.execSQL(query);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS STUDENT");
        onCreate(db);
    }

    public void addStudent(Student student) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("NAME", student.getName());
        cv.put("ADDRESS", student.getAddress());
        cv.put("PHONE", student.getPhone());

        db.insert("STUDENT", null, cv);
        db.close();
    }

    public void delete(int id) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete("STUDENT", " ID = "   id, null);
        db.close();
    }

    public ArrayList<Student> getAll() {
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT * FROM STUDENT";
        Cursor cursor = db.rawQuery(query, null);
        ArrayList<Student> studentList = new ArrayList<>();
        if (cursor.moveToFirst()) {
            do {
                int id = cursor.getInt(0);
                String name = cursor.getString(1);
                String address = cursor.getString(2);
                String phone = cursor.getString(3);
                Student student = new Student();
                student.setName(name);
                student.setId(id);
                student.setAddress(address);
                student.setPhone(phone);
                studentList.add(student);
            } while (cursor.moveToNext());
        }
        db.close();
        return studentList;
    }

    public void update(Student student) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("NAME", student.getName());
        cv.put("ADDRESS", student.getAddress());
        cv.put("PHONE", student.getPhone());
        db.update("STUDENT", cv, "ID = "   student.getId(), null);

    }

}
 

StudentAdapter.java:

 public class StudentAdapter<extend> extends RecyclerView.Adapter<StudentAdapter.MyViewHolder> {
    private ArrayList<Student> studentList;
    private OnClickEvent onClickEvent;

    public void setOnClickEvent(OnClickEvent onClickEvent) {
        this.onClickEvent = onClickEvent;
    }

    public StudentAdapter() {
    }

    public void setData(ArrayList<Student> listData) {
        if (studentList == null) {
            studentList = new ArrayList<>();
        }
        studentList.clear();
        studentList.addAll(listData);
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public StudentAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull StudentAdapter.MyViewHolder holder, final int position) {
        Student student = studentList.get(position);
        Glide.with(holder.imageView.getContext()).load(studentList.get(position).getImg()).into(holder.imageView);
        holder.name.setText(student.getName());
        holder.address.setText(student.getAddress());
        holder.phone.setText(student.getPhone());

        holder.btn_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onClickEvent != null) {
                    onClickEvent.OnDelete(position);
                }
            }
        });
        holder.btn_edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onClickEvent != null) {
                    onClickEvent.OnItemClick(position);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return studentList.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView name, address, phone;
        private Button btn_delete, btn_edit;
        private ImageView imageView;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.img);
            name = itemView.findViewById(R.id.name);
            address = itemView.findViewById(R.id.address);
            phone = itemView.findViewById(R.id.phone);
            btn_delete = itemView.findViewById(R.id.btn_delete);
            btn_edit = itemView.findViewById(R.id.btn_edit);
        }
    }

    public interface OnClickEvent {
        void OnItemClick(int position);

        void OnDelete(int position);
    }
}
 

Комментарии:

1. Можете ли вы также опубликовать свой StudentAdapter класс? Там вы определяете, что должно отображаться в вашем элементе RecyclerView.

2. извините, что я виноват: (

Ответ №1:

Хотя вы правильно определили свой RecyclerView с помощью библиотеки Glide для отображения изображения, но вы не сохраняете (сохраняете) информацию об изображении в своей базе данных.

 public void addStudent(Student student) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("NAME", student.getName());
        cv.put("ADDRESS", student.getAddress());
        cv.put("PHONE", student.getPhone());

        db.insert("STUDENT", null, cv);
        db.close();
    }
 

у вас должно быть что-то вроде

 cv.put("PICTURE", student.getImg());
 

вы также должны сделать то же самое для вашего public void update(Student student) метода хранения (сохранения) изображения пользователя. А также с вашим public void addStudent(Student student) определением метода. А также вы должны получить информацию о вашем изображении внутри вашего `

 public ArrayList<Student> getAll() {
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT * FROM STUDENT";
        Cursor cursor = db.rawQuery(query, null);
        ArrayList<Student> studentList = new ArrayList<>();
        if (cursor.moveToFirst()) {
            do {
                int id = cursor.getInt(0);
                String name = cursor.getString(1);
                String address = cursor.getString(2);
                String phone = cursor.getString(3);
                Student student = new Student();
                student.setName(name);
                student.setId(id);
                student.setAddress(address);
                student.setPhone(phone);
                studentList.add(student);
            } while (cursor.moveToNext());
        }
        db.close();
        return studentList;
    }
 

что-то вроде этого:

 String picture = cursor.getString(4);

student.setImg(picture);
 

Информация об изображении должна представлять собой путь к местоположению изображения, который может быть URL-адресом или расположением файла на диске вашего телефона.

…………… обновления:

 String query = "CREATE TABLE STUDENT(ID INTEGER PRIMARY KEY, NAME TEXT, ADDRESS TEXT, PHONE INTEGER, PICTURE TEXT)";
 

Комментарии:

1. нужно ли мне создавать ИЗОБРАЖЕНИЕ столбца sqlite и вводить ТЕКСТ или большой двоичный объект?

2. ТЕКСТА @HaMinhDuong достаточно, так как вы собираетесь сохранить строку пути. Вы не сохраняете само изображение. Так что используйте ТЕКСТ.

3. теперь у меня ошибка: не удалось прочитать строку 0, col 4 из CursorWindow. Убедитесь, что курсор правильно инициализирован, прежде чем обращаться к данным из него. В «Строковое изображение = cursor.getString(4)»

4. Лол, это так просто, ха-ха, большое тебе спасибо, мой друг: D

5. да, его работа слишком гладкая, и я добавлю больше возможностей в свою книгу, надеюсь увидеть вас