簡體   English   中英

Firebase 獲取要刪除/更新的特定節點的 ID

[英]Firebase getting ID for specific node to delete/update

第一次使用 Firebase 並且是 android 工作室的新手,我正在嘗試制作一個時間表應用程序,用戶可以在其中創建許多時間表並將其關聯到他們的帳戶。

目前,用戶可以創建一個帳戶,創建一個時間表(我只有 2 個字段,一旦我解決了問題,就會添加 rest)並且還有多個時間表。

我希望能夠更新/刪除用戶的時間表,但我正在努力獲取我需要刪除的特定時間表節點的 ID。


這是我在 Firebase 中擁有的一個用戶和 2 個時間表

火力地堡模型

從這里編輯

  • 當我長按顯示該計划相應 scheduleId 的列表項時,我添加了祝酒詞。 請記住,這是有幫助的,所以我可以長按並顯示該項目是否顯示正確的 scheduleId。

ScheduleActivity.java 的一部分

問題是什么

  • 我有一個 listView,其中包含所有具有偵聽器的時間表

    • 在偵聽器中,我有這一行獲取 ID,但問題在於它在偵聽器上,在我單擊列表項並查看詳細信息之前,我不會獲得計划的 ID,然后我只能查看 scheduleId,否則我得到一個 NULL 值。

    scheduleId = scheduleList.get(position).getScheduleId();


public class ScheduleActivity extends AppCompatActivity implements View.OnClickListener {

    private List<Schedule> scheduleList;
    private List<String> scheduleIdList;
    private DatabaseReference scheduleReference;
    private String userId;
    public static final String SCHEDULE_TITLE = "title";
    public static final String SCHEDULE_DESCRIPTION = "description";
    private String scheduleId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_schedule);

        getSupportActionBar().hide();

        scheduleList = new ArrayList<>();
        scheduleIdList = new ArrayList<>();

        userId = FirebaseAuth.getInstance().getCurrentUser().getUid();


        scheduleReference = FirebaseDatabase.getInstance().getReference(DBStrings.DB_SCHEDULES);

        registerForContextMenu(scheduleListView);

       // when a user clicks any of list items
        scheduleListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                Schedule schedule = scheduleList.get(position);

                // this gets the id but the issue is i need to first click the list item then ill get the correct id, otherwise i get a NPE because i haven't accessed the list item yet
                // need to figure out how to implement this in the onStart() method so i can get the scheduleId beforehand
                scheduleId = scheduleList.get(position).getScheduleId();

                // intent that takes me to the activity to view the schdule details
               Intent viewSchedule = new Intent(ScheduleActivity.this, ViewSchedule.class);
                viewSchedule.putExtra(SCHEDULE_TITLE, schedule.getTitle());
                viewSchedule.putExtra(SCHEDULE_DESCRIPTION, schedule.getDescription());

                startActivity(viewSchedule);
            }

            }
        });
    }

    // when a user long clicks a list item, brings up menu with option to edit/delete
// Also display a toast with scheduleID so i can see if the proper id is being retrieved
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);

        Toast.makeText(ScheduleActivity.this, "id: " + scheduleId, Toast.LENGTH_SHORT).show();
        getMenuInflater().inflate(R.menu.schedule_menu, menu);
    }


    // switch statement for delete/ redirect to edit activity that i left out


    // load schedule data into list view
    @Override
    protected void onStart() {
        super.onStart();

        scheduleReference.child(userId).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {

                scheduleList.clear();
                scheduleIdList.clear();

                for(DataSnapshot dataSnapshot : snapshot.getChildren()) {
                    Schedule schedule = dataSnapshot.getValue(Schedule.class);

                    // add schedules to list to show in list view
                    scheduleList.add(schedule);

                    // Add all the ids of schedules in a list, i used this in my scheduleListView.setOnItemListener to grab the scheduleId.
                    scheduleIdList.add(schedule.getScheduleId());
                }

                System.out.println("id list: " + scheduleIdList);

                ScheduleListAdapter adapter = new ScheduleListAdapter(ScheduleActivity.this, scheduleList);
                scheduleListView.setAdapter(adapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                System.out.println("ERROR: " + error.toException());
            }
        });
    }

    private void deleteSchedule(String scheduleId) {

// At the moment i can only delete a item if i first view it by clicking, then i need to go back and it allows me to delete it, this is obviously because my listview listener issue (It does not let me delete without first clicking the item to view/access it)        scheduleReference.child(userId).child(scheduleId).removeValue();

        Toast.makeText(ScheduleActivity.this, "Schedule " + scheduleId + " was deleted!", Toast.LENGTH_LONG).show();


    }

}


時間表的列表視圖

列表顯示


問題出在scheduleListView.setOnItemClickListener中,我需要找到一種方法來獲取 id,可能是在 onStart 方法中,也可能是在監聽器以外的其他地方,但由於我無法像在這里那樣訪問 position,所以我正在努力實施這個。

public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
        Schedule schedule = scheduleList.get(position);

        // Talking about this <position>
        scheduleId = scheduleList.get(position).getScheduleId();
}


圖片可以更好地解釋它當我嘗試長按而不訪問實際列表項時為空字符串

我在這里訪問列表項,然后返回到上一個屏幕

然后我得到 scheduleId 很好

我希望這是有道理的,我需要訪問每個列表項,然后返回 go 才能刪除特定的列表項。

private void deleteSchedule(String scheduleId) {
    String userId = FirebaseAuth.getInstance().getCurrentUser().getUid();
    scheduleReference.child(userId).child(scheduleId).removeValue();
    Toast.makeText(ScheduleActivity.this, "Schedule " + scheduleId + " was deleted!", Toast.LENGTH_LONG).show();
}

當用戶單擊刪除計划時,您必須獲取您的 scheduleId 然后您可以獲得計划的原始路徑並可以刪除該計划

如果您不知道如何獲取特定的日程表 ID,那么我也可以幫助您。 但你需要 recyclerview。 你可以簡單地通過 recyclerview 和界面來實現

更新問題的更新答案也許這可以幫助你。 我在此處添加了 LongClick Listner,您也可以這樣做。 我沒有帶有 listview 的 exp,但我的邏輯說它適用於你的情況。 另外,嘗試學習recyclerview。 因為每個 android 開發者都需要 recyclerview。

scheduleListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) {
        PopupMenu popup = new PopupMenu(Test.this, view);
        popup.getMenuInflater().inflate(R.menu.schedule_menu, popup.getMenu());
        popup.setOnMenuItemClickListener(item -> {
// You can compare here your menu id and perform action as id  like item.getItemId() == R.id.delete 
// also get Item by position like scheduleListView.getAdapter().getItem(position);
            Toast.makeText(Test.this,"You Clicked : " + item.getTitle(), Toast.LENGTH_SHORT).show();
            return true;
        });
        popup.show();//showing popup menu
        return false;
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM