Android studio 使用 onItemClickListener (Firestore id)

问题描述

(click for image)I think it will be better if I contain an image,all of these data are in firestore. I want to display the correct doc id when I click each of them,right now it can only display the last doc id which is the earlyiest data since I orderBy in time

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

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

抱歉英语和新手编码不好(我知道它真的很乱)

问题可能出在 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,idlv));
                }else{

                    ar.add(new itemAnnounce(R.drawable.teatime,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();
            }
        });