OnitemClick返回错误的字符串值

时间:2019-07-08 21:50:04

标签: java android firebase listview

使用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);
}

这是我的数据库

 "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",
},

****编辑****

这是我的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;
}

****编辑****

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

****编辑****

将日志添加到我的onitem单击方法

 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方法添加了一个日志,以查看实际模型是否首先给出了正确的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

并提供正确的ID。  所以一定要和数组AVATAR_ID有关吗?

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

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

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

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

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

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

第二页所有ID从第一页循环返回,例如马里奥(Mario)项目返回蝙蝠侠(Batman)的ID,蜘蛛侠(Spiderman)项目返回DJ Lama的ID

3 个答案:

答案 0 :(得分:6)

尝试固定Imageview的高度和宽度。

imageView = v.findViewById(R.id.image);
imageView.height:150;
imageView.width:150;

答案 1 :(得分:0)

作为临时工,我在customlistviewitem.xml中添加了一个额外的文本视图以供ID输入,然后填充该视图,然后在onclick中,我从文本视图中捕获了化身,而不是AVATARID Array和有用。我总是可以使textview看不见

在我添加的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();

我肯定有比这家伙更好的方法,请帮忙(:

答案 2 :(得分:0)

原因

除非所有列表都适合屏幕,否则无法预测populateView()的职位调用顺序。在这种情况下,不会按位置顺序立即全部调用它们。因此,如果列表AVATAR_ID较大,则该列表无效。


解决方案

替换avatar_id = AVATAR_ID.get(position);

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