OnitemClick возвращает неправильное строковое значениеJAVA

Программисты JAVA общаются здесь
Anonymous
OnitemClick возвращает неправильное строковое значение

Сообщение Anonymous »

Я работаю с Firebase. Я пытаюсь заполнить представление изображения, текстовое представление с помощью Firebase и настраиваемое представление списка. Когда пользователь выбирает элемент из списка, он должен сохранить идентификатор элемента Firebase в пользовательском разделе моей базы данных.
Все элементы заполняются правильно в представлении списка, но когда я выбираю элемент, на самом деле работают только позиции 0 и 5, остальные элементы всегда возвращают позиции 1-5, возвращаясь назад. Что я сделал не так?

Код: Выделить всё

private void Display_Images() {

ListView listOfImages = findViewById(R.id.avatar_list);
listOfImages.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {

FirebaseAuth mAuth  =FirebaseAuth.getInstance();
String userid = mAuth.getUid();
avatar_id = AVATAR_ID.get(position);
DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("Users").child(userid);
db.child("avatarID").setValue(avatar_id);
finish();
}
});

adapter = new FirebaseListAdapter(this, Image_Selector.class,
R.layout.avatars, FirebaseDatabase.getInstance().getReference().child("Avatars")) {
@Override
protected void populateView(View v, Image_Selector model, int position) {
imageView = v.findViewById(R.id.image);
tv = v.findViewById(R.id.tvavatar);
AVATAR_ID.add(model.getID());
tv.setText(model.getName());
Glide.with(getBaseContext()).load(model.getUrl()).into(imageView);

}

};
listOfImages.setAdapter(adapter);
}
Это моя база данных

Код: Выделить всё

 "Avatars" : {
"Batman1" : {
"id" : "Batman1",
"name" : "Batman Logo",
"url" : "url to image"
},
"Default" : {
"id" : "Default",
"name" : "Default",
"url" : "url to image"
},
"Test" : {
"id" : "Test",
"name" : "TEST",
"url" : ""
}
Я пытаюсь сохранить идентификатор в виде строки при нажатии элемента в списке. Затем сохраните его в пользовательском разделе моей базы данных. Пример ниже.

Код: Выделить всё

"Users" : {
"F3vHZSClnPhE9cDjPeY5x0PuTmz1" : {
"Username" : "Username Appears here.",
"avatarID" : "here is where the id should be saved",
},
Изменить
Это мой класс модели Firebase

Код: Выделить всё

 public class Image_Selector {
String name;
String url;
String id;
public Image_Selector(String name,String url,String id){
this.name = name;
this.url = url;
this.id = id;

}
public Image_Selector(){

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

public void setUrl(String url) {
this.url = url;
}

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

public String getName() {
return name;
}

public String getUrl() {
return url;
}

public String getId() {
return id;
}
Изменить
Если я выберу Бэтмена, возвращаемый идентификатор будет batman1, но если я выберу «Тестовый элемент», он все равно вернет идентификатор Бэтмена 1. Если я выберу «По умолчанию», он вернет идентификатор по умолчанию. Я попытался добавить еще несколько элементов в базу данных, и в зависимости от высоты и ширины моего пользовательского файла listviewitem.xml получится своего рода цикл. Позволяет мне захватывать только идентификаторы из элемента представления списка, который я вижу. Любые элементы за пределами экрана будут возвращать неправильный идентификатор, возвращаясь к позициям 0,1,2,3 и т. д.
Изменить
Добавлены журналы в мой метод щелчка по элементу

Код: Выделить всё

 String pos =  String.valueOf(position);
Log.i("String_ID ",avatar_id);
Log.i("String_POSITION ",pos);
Log.i("String_USERID",userid);
Результаты для каждого из трех элементов были следующими.
Пункт 1 в моем списке — «Бэтмен», и он возвращается

Код: Выделить всё

2019-07-11 12:04:51.152 3685-3685/studios.p9p.chatomatic.chat_o_matic
I/String_ID: Batman1
2019-07-11 12:04:51.152 3685-3685/studios.p9p.chatomatic.chat_o_matic
I/String_POSITION: 0
2019-07-11 12:04:51.152 3685-3685/studios.p9p.chatomatic.chat_o_matic
I/String_USERID: F3vHZSClnPhE9cDjPeY5x0PuTmz1
Пункт 2 в моем списке используется по умолчанию и возвращает результат

Код: Выделить всё

2019-07-11 12:06:22.920 3685-3685/studios.p9p.chatomatic.chat_o_matic
I/String_ID: Default
2019-07-11 12:06:22.935 3685-3685/studios.p9p.chatomatic.chat_o_matic
I/String_POSITION: 1
2019-07-11 12:06:22.935 3685-3685/studios.p9p.chatomatic.chat_o_matic
I/String_USERID: F3vHZSClnPhE9cDjPeY5x0PuTmz1
Пункт 3 в моем списке является тестовым и возвращает результаты

Код: Выделить всё

2019-07-11 12:07:18.983 3685-3685/studios.p9p.chatomatic.chat_o_matic
I/String_ID: Batman1
2019-07-11 12:07:18.984 3685-3685/studios.p9p.chatomatic.chat_o_matic
I/String_POSITION: 2
2019-07-11 12:07:18.984 3685-3685/studios.p9p.chatomatic.chat_o_matic
I/String_USERID: F3vHZSClnPhE9cDjPeY5x0PuTmz1
Итак, я понял, что это как-то связано со строкой аватара. Я добавил журнал в метод populate, чтобы проверить, дает ли реальная модель правильный идентификатор:

Код: Выделить всё

 String modelid = model.getID();
Log.i("String_id_AtSource",modelid);

2019-07-11 12:20:34.504 3685-3685/studios.p9p.chatomatic.chat_o_matic
I/String_id_AtSource: Test
и он дает правильный идентификатор, значит, это должно быть как-то связано с массивом AVATAR_ID?
Изменить 21.07.2019
Используя ответ ниже, похоже, это исправлено. но поскольку я добавил в базу данных больше элементов, похоже, она все еще это делает. Итак, в результате дальнейшего тестирования я смогу сказать вам, когда это произойдет.
Все идентификаторы фиксируются правильно, пока вы не прокрутите страницу. Это означает, что, пока все элементы списка помещаются на экране, они возвращают правильный идентификатор, поэтому я подумал, что это исправлено с помощью ответа ниже.
Сначала я установил размер изображения в квадрате 300 dp, поэтому это был большой элемент представления списка, поэтому только 2 элемента щелкают правильно. Изменение размера на 90dp в квадрате позволило разместить 5 элементов.
Идентификаторы элементов списка возвращаются в цикле, начиная с первых 5. Например, щелчок по элементу 6 возвращает идентификатор элемента 0, элемент 7 возвращает идентификатор элемента 1 и так далее. Тем не менее, положение элемента представления списка и всех данных внутри списка правильное.
Все первые страницы работают правильно. Я удалил представление изображения, чтобы попытаться проверить, возможно, изображение слишком велико.
На второй странице все идентификаторы возвращаются в цикле с первой страницы, например. предмет «Марио» возвращает идентификатор Бэтмена, а предмет «Человек-паук» возвращает идентификатор DJ Lama.

Вернуться в «JAVA»