Как исправить ошибку No setter/field for translation found on class com.nikita.mozhaev.vocabulary.Word
как исправить ошибку W/ClassMapper: No setter/field for translation found on class com.nikita.mozhaev.vocabulary.Word Пытаюсь парсить данные с realtime database. Вот код: FirebaseHelper.java
import androidx.annotation.NonNull;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
public class FirebaseDatabaseHelper {
private FirebaseDatabase mDatabase;
private DatabaseReference mRefenceWords;
private List<Word> words = new ArrayList<>();
public interface DataStatus{
void DataIsLoaded(List<Word> words, List<String> keys);
void DataIsInserted();
void DataIsUpdated();
void DataIsDeleted();
}
public FirebaseDatabaseHelper(){
mDatabase = FirebaseDatabase.getInstance();
mRefenceWords = mDatabase.getReference("Words");
}
public void readWords(final DataStatus dataStatus){
mRefenceWords.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
words.clear();
List<String> keys = new ArrayList<>();
for (DataSnapshot keyNode : snapshot.getChildren()){
keys.add(keyNode.getKey());
Word word = keyNode.getValue(Word.class);
words.add(word);
}
dataStatus.DataIsLoaded(words, keys);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
RecyclerView_config.java
import android.content.Context;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class RecyclerView_config {
private Context mContext;
private WordAdapter mWordAdapter;
public void setConfig(RecyclerView recyclerView, Context context, List<Word> words, List<String> keys){
mContext = context;
mWordAdapter = new WordAdapter(words, keys);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
recyclerView.setAdapter(mWordAdapter);
}
class WordItemView extends RecyclerView.ViewHolder{
private TextView mWord;
private TextView mTranslate;
private String key;
public WordItemView(ViewGroup parent){
super(LayoutInflater.from(mContext).inflate(R.layout.word_item, parent, false));
}
public void bind(Word word, String key){
mWord.setText(word.getWord());
mTranslate.setText(word.getTranslate());
this.key = key;
}
}
class WordAdapter extends RecyclerView.Adapter<WordItemView>{
private List<Word> mWordList;
private List<String> mKeys;
public WordAdapter(List<Word> mWordList, List<String> mKeys){
this.mWordList = mWordList;
this.mKeys = mKeys;
}
@NonNull
@Override
public WordItemView onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new WordItemView(parent);
}
@Override
public void onBindViewHolder(@NonNull WordItemView holder, int position) {
holder.bind(mWordList.get(position), mKeys.get(position));
}
@Override
public int getItemCount() {
return 0;
}
}
}
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.util.ArrayList;
import java.util.List;
import static android.R.layout.simple_list_item_1;
public class MainActivity extends AppCompatActivity {
RecyclerView mRecyclerView;
FirebaseDatabase firebaseDatabase;
DatabaseReference databaseReference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firebaseDatabase = FirebaseDatabase.getInstance();
databaseReference = firebaseDatabase.getReference("Words");
mRecyclerView = findViewById(R.id.recyclerview_words);
Toast.makeText(this, "ok", Toast.LENGTH_SHORT).show();
new FirebaseDatabaseHelper().readWords(new FirebaseDatabaseHelper.DataStatus() {
@Override
public void DataIsLoaded(List<Word> words, List<String> keys) {
new RecyclerView_config().setConfig(mRecyclerView, MainActivity.this, words, keys);
}
@Override
public void DataIsInserted() {
}
@Override
public void DataIsUpdated() {
}
@Override
public void DataIsDeleted() {
}
});
}
}
```
**activity_main.xml**
```
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/linear"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview_words"
android:layout_width="411dp"
android:layout_height="730dp"
android:layout_marginStart="1dp"
android:layout_marginLeft="1dp"
android:layout_marginEnd="1dp"
android:layout_marginRight="1dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Word.java
public class Word {
private String word;
private String translate;
public Word(){}
public void setWord(String name)
{
this.word = name;
}
public String getWord()
{
return word;
}
public String getTranslate() {
return translate;
}
public void setTranslate(String translate) {
this.translate = translate;
}
word_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/main_trans"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_marginStart="184dp"
android:layout_marginLeft="184dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="77dp"
android:layout_marginRight="77dp"
android:layout_marginBottom="684dp"
android:layout_toEndOf="@+id/main_word"
android:layout_toRightOf="@+id/main_word"
android:text="Translate"
android:textSize="20dp" />
<TextView
android:id="@+id/main_word"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="0dp"
android:layout_marginLeft="0dp"
android:layout_marginTop="20dp"
android:text="Word"
android:textSize="20dp" />
</RelativeLayout>
Ответы (1 шт):
Автор решения: woesss
→ Ссылка
Ошибка говорит о том, что для поля "translation" из базы не найдено соответствие в дата-классе - библиотека будет искать public поле translation, либо public методы getTranslation и setTranslation либо любые public поля и подходящие по сигнатуре методы, помеченные аннотацией @PropertyName("translation").
Чтобы исправить ошибку нужно выполнить любое из перечисленных условий
public class Word {
private String word;
private String translation;
public Word(){}
public void setWord(String name)
{
this.word = name;
}
public String getWord()
{
return word;
}
@PropertyName("translation")
public String getTranslation() {
return translate;
}
@PropertyName("translation")
public void setTranslation(String translation) {
this.translation = translation;
}