Мне нужно получить объекты из базы данных SQLite и показать их в ListView. Кроме того, каждый объект должен иметь 2 кнопки для просмотра: Редактировать и Удалить. Вот код адаптера:

public class ReminderListAdapter extends ArrayAdapter<Reminder> {
private Context mContext;
private int mResource;


public ReminderListAdapter(@NonNull Context context, int resource, @NonNull ArrayList<Reminder> objects) {
    super(context, resource, objects);
    mContext = context;
    mResource = resource;

}

@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    final int id = getItem(position).getId();
    final String name = getItem(position).getName();
    String hour = getItem(position).getHour();
    String date = getItem(position).getDate();

    LayoutInflater inflater = LayoutInflater.from(mContext);
    convertView = inflater.inflate(mResource, parent, false);

    final TextView resId = convertView.findViewById(R.id.textId);
    final TextView resName = convertView.findViewById(R.id.textName);
    final TextView resHour = convertView.findViewById(R.id.textHour);
    final TextView resDate = convertView.findViewById(R.id.textDate);

    resId.setText(String.valueOf(id));
    resName.setText(name);
    resHour.setText(hour);
    resDate.setText(date);

    Button delbtn = (Button) convertView.findViewById(R.id.button4);
    Button editbtn = (Button) convertView.findViewById(R.id.button5); 


   delbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });


   editbtn.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {

       }
   });
    return convertView;
}

/*public boolean delete_Reminder(String name2){
    return database.delete(TABLE_REMINDERS, KEY_NAME + "=" + name2, null) > 0;
}*/}

Вот код активности, где мне нужно разместить объекты:

public class EditActivity extends AppCompatActivity {

DBHelper dbHelper;
SQLiteDatabase database;
private ListView listView;
ArrayList<Reminder> ReminderList = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_edit);
    dbHelper = new DBHelper(this);
    database = dbHelper.getWritableDatabase();
    listView =(ListView) findViewById(R.id.ListOfReminders);


    Cursor cursor = database.query(TABLE_REMINDERS, null, null,null,null,null,null);
    if(cursor.moveToFirst())
    {

        do{
            int idIndex = cursor.getInt(cursor.getColumnIndex(DBHelper.KEY_ID));
            String nameIndex = cursor.getString(cursor.getColumnIndex(DBHelper.KEY_NAME));
            String hourIndex = cursor.getString(cursor.getColumnIndex(DBHelper.KEY_HOUR));
            String dateIndex = cursor.getString(cursor.getColumnIndex(DBHelper.KEY_DATE));
            String name = nameIndex;
            String hour = hourIndex;
            String date = dateIndex;

            ReminderList.add(new Reminder(idIndex, name, hour, date));
            ReminderListAdapter adapter = new ReminderListAdapter(this, R.layout.reminder_view, ReminderList);
            listView.setAdapter(adapter);

        } while(cursor.moveToNext());
    } else
        Log.d("mLog", "0 rows in db");


    dbHelper.close();

}

public boolean delete_Reminder(String name2){
    return database.delete(TABLE_REMINDERS, KEY_NAME + "=" + name2, null) > 0;
}}

В remder_layout у меня есть эти кнопки.

Я думаю, что мне нужно реализовать в моем адаптере эти 2 кнопки. В коде вы можете увидеть onClickListener delbtn и editbtn. Но моя проблема в том, что я не знаю, как вызвать метод delete_Reminder (который также есть в Adapter), потому что я не могу здесь создать DBHelper и не могу подключиться к БД. Извините, если это глупый вопрос, это первое приложение.

0
Ion Crismaru 14 Окт 2019 в 14:29

2 ответа

Лучший ответ

Используйте interface для обратных вызовов. Мост интерфейс между Activity и адаптером; как только пользователь выполнит действие в представлении адаптера - обратный вызов для Activity.

Интерфейс

interface OnItemClickListener {
  void onItemClick(View view, int position, String name)
}

Деятельность

public class EditActivity extends AppCompatActivity implements
    OnItemClickListener {
 ...

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 ...
 ReminderListAdapter adapter = new ReminderListAdapter(this, R.layout.reminder_view, ReminderList);
 adapter.setListener(this);
 listView.setAdapter(adapter);
 ...
 }


 @Override
   public void onItemClick(final View view, final int position, final String name) {
    //Your callback
    delete_Reminder(name);
  }
}

Адаптер

public class ReminderListAdapter extends ArrayAdapter<Reminder> {
private Context mContext;
private int mResource;

  private final OnItemClickListener listener;

  public ReminderListAdapter(@NonNull Context context, int resource, 
  @NonNull ArrayList<Reminder> objects) {
  super(context, resource, objects);
  mContext = context;
  mResource = resource;
  }


 public setListener(final OnItemClickListener listener) {
   this.listener = listener;
 }
 ...

 @NonNull
 @Override
 public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
  ...

  delbtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      listener.onItemClick(convertView, position, name);
    }
  });
  }

}
0
Vikalp Patel 14 Окт 2019 в 12:34
  1. Вы устанавливаете адаптер на каждой итерации цикла, в то время как он должен быть установлен только один раз после завершения цикла.

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

    • ReminderList начинается с заглавной буквы - по соглашению переменные и имена методов начинаются со строчной буквы, имена констант - все заглавные, а имена классов начинаются с заглавной буквы
    • Я не уверен, куда вы направляетесь с приложением, но при загрузке данных из базы данных вы можете рассмотреть возможность их загрузки в CursorAdapter вместо ArrayAdapter
    • также ознакомьтесь с библиотекой привязки данных и MVC для получения более чистый код.
0
Jan Málek 14 Окт 2019 в 12:28