OnitemClick возвращает неверное строковое значение - PullRequest
7 голосов
/ 09 июля 2019

Работа с Firebase.Я пытаюсь заполнить представление изображения, Textview, используя 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<Image_Selector>(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" : ""
}

Я пытаюсь сохранитьid в виде строки при нажатии элемента в списке.Затем сохраните его в пользовательском разделе моей базы данных.Пример ниже.

"Users" : {
"F3vHZSClnPhE9cDjPeY5x0PuTmz1" : {
  "Username" : "Username Appears here.",
  "avatarID" : "here is where the id should be saved",
},

**** РЕДАКТИРОВАТЬ ****

это мой класс модели пожарной базы

 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;
}

**** РЕДАКТИРОВАТЬ ****

Пример того, что происходит, если я выбираю Бэтмена, возвращаемый идентификатор - Бэтмен1.но если я выбираю пункт «Тест», он по-прежнему возвращает идентификатор Batman 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 в моем списке просмотра - это Batman и возвращает

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

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

 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/7/2019 ******

Хорошо, поэтому, используя ответ ниже, казалосьБыть исправленным.но так как я добавил больше элементов в базу данных.кажется, все еще делает это.Поэтому из дальнейшего тестирования я могу сказать вам, когда это произойдет ..

все идентификаторы записываются правильно, пока вы не прокрутите.это означает, что, пока все элементы списка помещаются на экране, они возвращают правильный идентификатор.следовательно, почему я думал, что это было исправлено с помощью приведенного ниже ответа.

Сначала я установил размер изображения в квадрате 300dp, поэтому это был большой элемент списка, поэтому только 2 элемента работали правильно.изменив размер до 90dp в квадрате, сделаем так, чтобы 5 элементов подходили.

идентификаторы элементов списка возвращаются в цикле из первых 5. Например, нажатие элемента 6 возвращает идентификатор элемента 0, элемент 7 возвращает идентификатор элемента 1и так далее.Тем не менее, позиция элемента представления списка и всех данных внутри списка правильная

На первой странице все работает правильно.Я удалил вид изображения, чтобы попытаться определить, было ли оно слишком большим

На второй странице все идентификаторы возвращаются в цикле с первой страницы, например, элемент Mario возвращает идентификатор для Бэтмена иЧеловек-паук возвращает идентификатор для DJ Lama

Ответы [ 3 ]

6 голосов
/ 11 июля 2019

попробуйте исправить высоту и ширину ImageView.

imageView = v.findViewById(R.id.image);
imageView.height:150;
imageView.width:150;
1 голос
/ 23 июля 2019

Причина

Порядок, в котором populateView() вызывается для позиций, не может быть предсказан, если весь список не помещается на экране.В противном случае они не будут вызваны сразу в порядке расположения.Поэтому список AVATAR_ID недопустим, если список больше.

Решение

Заменить avatar_id = AVATAR_ID.get(position);

на avatar_id = ((Image_Selector)parent.getItemAtPosition(position)).getID();

0 голосов
/ 22 июля 2019

В качестве временного секретаря я добавил дополнительное текстовое представление в файл customlistviewitem.xml, чтобы идентификатор мог войти в него, затем я заполнил представление, и на щелчке я захватил аватарид из текстового представления вместо массива AVATARID ионо работает.я всегда могу сделать текстовое представление невидимым

внутри моего populateView. Я добавил

tv1 = v.findViewByID(R.id.tv_avatar_id);
tv1.setText(model.getID);

, а затем внутри OnItemClick

tv1 = view.findViewByID(R.id.tv_avatar_id);
avatarid = tv1.getText().toString();

Я уверен, что есть лучший способ сделать это, чем этотребята помогите пожалуйста (:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...