Как привязать switchButton в ItemView к соответствующему объекту в RecyclerView?

#java #android #android-recyclerview #android-room #android-viewholder

#java #Android #android-recyclerview #android-комната #android-viewholder

Вопрос:

Я новичок, я пытаюсь разобраться.

У меня есть объекты Word (String шведский, String русский, int status). Статус определяет, на каком игровом уровне должно появиться слово (на данный момент оно может быть 200 или 300).

Как я могу сделать так, чтобы кнопка switchButton «switchStatus» в каждом элементе RecyclerView изменяла word.status между 200 (для true) и 300 (для false)? И, конечно, обновите слово в базе данных.

 public class WordAdapter extends RecyclerView.Adapter<WordAdapter.WordHolder> {

    private List<Word> words = new ArrayList<>();
    private OnItemClickListener listener;

    @NonNull
    @Override
    public WordHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.word_item, parent, false);
        return new WordHolder(itemView);
    }

    @Override
        public void onBindViewHolder(@NonNull WordHolder holder, int position) {
            Word currentWord = words.get(position);
            holder.textViewSwedish.setText(currentWord.getSwedish());
            holder.textViewRussian.setText(currentWord.getRussian());     
            holder.switchStatus.set//??????????;
        }

        class WordHolder extends RecyclerView.ViewHolder {
    private TextView textViewSwedish;
    private TextView textViewRussian;
    private Switch switchStatus;

    public WordHolder(@NonNull View itemView) {
        super(itemView);
        textViewSwedish = itemView.findViewById(R.id.text_view_swedish);
        textViewRussian = itemView.findViewById(R.id.text_view_russian);
        switchStatus = itemView.findViewById(R.id.btn_switch);
        }
    }
}
  

Это WordList.activity:

 public class WordList extends AppCompatActivity {

    private WordViewModel wordViewModel;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true);

        final WordAdapter adapter = new WordAdapter();
        recyclerView.setAdapter(adapter);

        wordViewModel = new ViewModelProvider(this,
                ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(WordViewModel.class);
        wordViewModel.getAllWords().observe(this, new Observer<List<Word>>() {
            @Override
            public void onChanged(List<Word> words) {
                adapter.setWords(words);
            }
        });
    }
  

Это слово object:

 @Entity(tableName = "word_table")
public class Word {

    @PrimaryKey(autoGenerate = true)
    private int id;

    private String russian;

    private String swedish;

    private int status;

    public Word(String russian, String swedish, String sound, int status) {
        this.russian = russian;
        this.swedish = swedish;
        this.status = status;
    }
  

WordViewModel.class (при необходимости):

 public class WordViewModel extends AndroidViewModel {
    private WordRepository repository;
    private LiveData<List<Word>> allWords;
    private LiveData<List<Word>> practiceWords;
    private LiveData<List<Word>> archivedWords;



    public WordViewModel(@NonNull Application application) {
        super(application);
        repository = new WordRepository(application);
        allWords = repository.getAllWords();
        practiceWords = repository.getPracticeWords();
        archivedWords = repository.getArchivedWords();
    }

    public void insert(Word word) {
        repository.insert(word);
    }

    public void update(Word word) {
        repository.update(word);
    }

    public void delete(Word word) {
        repository.delete(word);
    }

    public void deleteAllWords() {
        repository.deleteAllWords();
    }

    public LiveData<List<Word>> getAllWords() {
        return allWords;
    }

    public LiveData<List<Word>> getPracticeWords() {
        return practiceWords;
    }

    public LiveData<List<Word>> getArchivedWords() {
        return archivedWords;
    }
  

Ответ №1:

Чтобы установить значение для switch, вы должны установить true или false, поэтому в вашем случае, если значение равно 200, это true, а в противном случае false. Вы можете установить значение переключателя, как показано в приведенном ниже коде:

 holder.switchStatus.setChecked(currentWord.getStatus()==200)
  

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

1. Пожалуйста, добавьте объяснение, чтобы улучшить понимание и предоставить OP дополнительную информацию