使用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
答案 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();