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
尝试修复Imageview的高度和宽度。
imageView = v.findViewById(R.id.image);
imageView.height:150;
imageView.width:150;
Run Code Online (Sandbox Code Playgroud)
populateView()除非所有列表都适合屏幕,否则无法预测调用位置的顺序。否则,它们不会按位置顺序同时被调用。因此,AVATAR_ID如果列表较大,则该列表无效。
代替avatar_id = AVATAR_ID.get(position);
和avatar_id = ((Image_Selector)parent.getItemAtPosition(position)).getID();