Android工作室正在获取带有onItemClickListener(Firestore id)的ListView数组



(点击获取图像(我认为如果我包含一个图像会更好,所有这些数据都在firestore中。我想在点击它们时显示正确的文档id,现在它只能显示最后一个文档id,这是自我订购以来最早的数据

在这种情况下,我想获得每次运行Document快照时添加到数组中的firestore id。例如:单击ListView的第一项,并Toast firestore中数据的正确文档id。

在我的代码中,当我点击那里时,它只能获得文档id的最后一个。顺便说一句,如果我把idlv放在快照中,它运行得很好。getString并显示它,但我只想将id和intent获取到下一页,这样我就可以加载文档的数据。

对不起糟糕的英语和新手编码(我知道它真的很乱(

问题可能出现在itemOnclick函数("id is"+idlv(中

public class announce_main extends AppCompatActivity {
Button button7;
ListView lv1;
ArrayList<itemAnnounce> ar = new ArrayList<>();
String userID,idlv;
FirebaseAuth firebaseAuth;
FirebaseFirestore firebaseFirestore;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.announce_listview);
button7 = findViewById(R.id.button7);
//  item = (item) getIntent().getSerializableExtra("item");

firebaseAuth = FirebaseAuth.getInstance();
firebaseFirestore = FirebaseFirestore.getInstance();
userID = firebaseAuth.getCurrentUser().getUid();
firebaseFirestore.collection("announcement").orderBy("createdAt", Query.Direction.DESCENDING).addSnapshotListener((documentSnapshots, error) -> {
ar.clear();
for (DocumentSnapshot snapshot : documentSnapshots){
idlv = snapshot.getId();
Timestamp timestamp = (Timestamp) snapshot.getData().get("createdAt");
Date date = timestamp.toDate();
String date2 = date.toString();
String artLv = snapshot.getString("artLevel");
Log.d("TAG", " artLevel is" + artLv);

if(artLv.equals("緊急公告")){
ar.add(new itemAnnounce(R.drawable.alarm, snapshot.getString("title"),"by "+snapshot.getString("createdBy")+ " 類型:"+snapshot.getString("artLevel"),date2,snapshot.getString("content"),idlv));
}else if(artLv.equals("議題公告")){
ar.add(new itemAnnounce(R.drawable.newspaper, snapshot.getString("title"),"by "+snapshot.getString("createdBy")+ " 類型:"+snapshot.getString("artLevel"),date2,snapshot.getString("content"),idlv));
}else{
ar.add(new itemAnnounce(R.drawable.teatime, snapshot.getString("title"),"by "+snapshot.getString("createdBy")+ " 類型:"+snapshot.getString("artLevel"),date2,snapshot.getString("content"),idlv));
}
}
adapterAnnounce adapterAnnounce = new adapterAnnounce(getApplicationContext(), R.layout.list_row_announce, ar);
adapterAnnounce.notifyDataSetChanged();
lv1.setAdapter(adapterAnnounce);
lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(announce_main.this, "id is"+ idlv, Toast.LENGTH_SHORT).show();
}
});
});
lv1 = findViewById(R.id.lv2);
button7.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(announce_main.this, HomePageActivity.class));
}
});


}

你不应该访问idlv,因为它总是会给你最后一个项目id。理想情况下,你应该做的是如下

lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String selectedObj = ar.get(postion) // this will get you selected obj of itemAnnounce
String selectedId = selectedObj.get("<property name of itemAnnounce where you are assigning idlv>")  
Toast.makeText(announce_main.this, "id is"+ selectedId, Toast.LENGTH_SHORT).show();
}
});

最新更新