OnitemClick返回错误的字符串值

mar*_*rop 7 java android listview firebase

使用Firebase。我正在尝试使用Firebase和自定义列表视图填充图像视图,Textview。当用户从列表中选择一个项目时,应该将Firebase项目的ID保存到我的数据库的用户部分。

所有项目在列表视图中正确填充,但是当我选择一个项目时,只有位置0和5实际上在起作用,其余项目始终返回pos 1-5循环返回。能否请您看看我的代码n告诉我我做错了什么,谢谢:)

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);
}
Run Code Online (Sandbox Code Playgroud)

这是我的数据库

 "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" : ""
}
Run Code Online (Sandbox Code Playgroud)

单击列表视图中的项目时,我试图将ID保存为字符串。然后将其保存到数据库的用户部分。下面的例子。

"Users" : {
"F3vHZSClnPhE9cDjPeY5x0PuTmz1" : {
  "Username" : "Username Appears here.",
  "avatarID" : "here is where the id should be saved",
},
Run Code Online (Sandbox Code Playgroud)

****编辑****

这是我的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;
}
Run Code Online (Sandbox Code Playgroud)

****编辑****

例如,如果我选择batman,返回的ID是batman1。但是,如果我选择“测试项目”,它仍然会返回ID Batman1。如果我选​​择“默认”,它将返回ID默认值。我尝试将更多项目添加到数据库,然后根据我的自定义listviewitem.xml的高度和宽度进行某种循环。只允许我捕获我可以看到的列表视图项中的ID。屏幕上的所有项目都会返回错误的ID,并返回到pos 0、1、2、3,依此类推。

****编辑****

将日志添加到我的onitem click方法

 String pos =  String.valueOf(position);
            Log.i("String_ID ",avatar_id);
            Log.i("String_POSITION ",pos);
            Log.i("String_USERID",userid);
Run Code Online (Sandbox Code Playgroud)

对于这三个项目,结果分别返回如下

我的列表视图中的项目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
Run Code Online (Sandbox Code Playgroud)

我的列表视图中的项目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
Run Code Online (Sandbox Code Playgroud)

我的列表视图中的项目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
Run Code Online (Sandbox Code Playgroud)

因此,从中我已经弄清楚了它与化身字符串有关的问题,我已经向populate方法添加了一个日志,以查看实际模型是否首先给出了正确的ID

 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
Run Code Online (Sandbox Code Playgroud)

它给出了正确的ID。所以一定要和数组AVATAR_ID有关吗?

*****编辑21/7/2019 ******

好的,因此使用下面的答案似乎已解决。但由于香港专业教育学院向数据库添加了更多项目。似乎仍在这样做。因此,从进一步的测试中,我可以告诉您什么时候发生..

所有ID都会正确捕获,直到您滚动为止。这意味着只要所有列表项都适合屏幕,它们就会返回正确的ID。因此,为什么我认为它是固定的以下答案。

我首先将imageview的大小设置为300dp的平方,所以这是一个很大的列表视图项,因此只有2个项目可以正常工作。将大小更改为90dp平方使其适合5个项目。

列表项ID从第一个5开始循环返回。例如,单击项6返回项0的ID,项7返回项1 n的ID,依此类推。列表视图项和列表中所有数据的位置都是正确的

第一页都正常工作。我已删除图像视图以尝试查看图像是否太大

第二页所有ID从第一页开始循环返回,例如,项目Mario返回蝙蝠侠的ID,而蜘蛛人项目返回DJ Lama的ID

Jin*_*kur 6

尝试修复Imageview的高度和宽度。

imageView = v.findViewById(R.id.image);
imageView.height:150;
imageView.width:150;
Run Code Online (Sandbox Code Playgroud)


Ber*_*yle 1

原因

populateView()除非所有列表都适合屏幕,否则无法预测调用位置的顺序。否则,它们不会按位置顺序同时被调用。因此,AVATAR_ID如果列表较大,则该列表无效。


解决方案

代替avatar_id = AVATAR_ID.get(position);

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