2017-06-22 60 views
0

你好,並感謝您的幫助 我在這裏問如何從Firebase調動列表視圖,謝天謝地克里希納Kishan解決了我的問題,但現在我喜歡做的是什麼時候我點擊listview項目,該項目將被刪除,這是可以的我做了這部分,但我的問題是我想刪除或刪除列表視圖中的特定項目從Firebase數據相關的數據這裏是我的代碼當點擊列表視圖,刪除它並刪除相關的數據,它在firebase

listi.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      items.remove(position); 
      adapt.notifyDataSetChanged(); 
      myRef.getRoot().child("message").removeValue(); 
     } 
    }); 

但是這行代碼刪除了firebase的所有內容,但我只想使用listview項刪除關聯的數據。

myRef.getRoot().child("message").removeValue(); 

我舉例說明。讓ssay每次點擊我添加一個值到firebase讓說1,然後我加2然後3,所以我的列表視圖項目將1,2和3現在當我點擊2列表視圖我想從列表視圖中刪除2並從firebase以及離開1和2,但我不想叫它的名字,因爲如果我有大的listview讓我說20個項目,我想用戶點擊任何項目,然後將它們從列表和firebase刪除,所以下次他們重新啓動,列出視圖不會出現,因爲它已經從火力

這裏是我的火力點的數據庫結構中除去的程序: firebase database structure

+0

你的firebase數據庫是怎樣的? – AppPhil

+0

這可能是因爲您正在刪除包含您擁有的所有消息的頂級子「消息」。你應該找到你想要刪除的「消息」節點的子節點,以及:「myRef.getRoot()。child(」message「)。child(messageSelectedKey).removeValue();'。 – Pado

+0

thanksTommaso帕多和ApplePhil,我添加圖像的ListView和firebase,請看看它,我只有1場只有加1項,謝謝 – SeekingKnowleges

回答

0

您必須修改您發佈的代碼段之外的某些代碼。

我猜你的items是從數據庫中讀取的。當你閱讀你的「消息」節點時,你必須保存密鑰和值。 您可以通過多種方式實現此目的。例如

final ArrayList<String> keyList = new ArrayList<>(); 
final ArrayList<String> items = new ArrayList<>(); 
myRef.getRoot().child("messages") 
     .addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot messages : dataSnapshot.getChildren()) { 
      keyList.add(messages.getKey()); 
      items.add(messages.getValue(String.class)); 
     } 
    } 
    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     /*handle errors*/ 
    } 
}); 

現在你有兩個鍵和值。修改你的OnClickListener是這樣的:

listi.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     items.remove(position); 
     adapt.notifyDataSetChanged(); 
     //new code below 
     myRef.getRoot().child("message").child(keyList.get(position)).removeValue(); 
     keyList.remove(position); 
    } 
}); 

顯然listi.setOnItemClickListener(...)應該當兩個keyListitems正確填寫被調用。請注意,ValueEventListener是異步的。

+0

您已經保存了我Sir Tommaso Pado很多很多謝謝,您的代碼是workinf完美的,但我必須從myRef中刪除getRoot()。child(「messages」)。 getRoot()。child(「messages」)。addListnerFor ....所以它變得像myRef.addListnerFor ...請推薦我一本書來學習機器人我知道小java,但我喜歡學習android細節,我做nopt理解Android開發人員網站,在大學真的只是從Android開發人員複製粘貼他們永遠不會解釋,我喜歡codding,我笏專門研究Android和Java無論如何,我的應用程序將brbriant想法會發送給你一個鏈接完成後 – SeekingKnowleges

0

我假設你正在使用推()這些消息添加到數據庫中。由於push()生成基於時間的id,因此列表中元素的順序是按時間順序排列的,這意味着之後添加的內容是後來添加的內容。所以,當你推送()時,得到密鑰並保持一個id列表。然後,在onClick中,使用position參數來獲取點擊項目的ID並在數據庫中將其刪除。這裏有一個例子:

List<String> ids; //update this list with ids as you push 
.. 
//then in your onItemClick 
@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
{ 
    rootReference.child("messages").child(ids.get(position)).removeValue(); 
    //update any offline lists 
} 

請注意,這裏假設你也在你的ListView中顯示消息的順序與數據庫中的順序相同。

+0

非常感謝,但你的代碼無法正常工作,但我可能做錯了什麼Tommaso Pado已經回答了我的問題,並再次正確工作manythankls請推薦我一本書學習android我知道小java,但我喜歡學習android細節,我做nopt瞭解android開發人員網站 – SeekingKnowleges

+0

你應該嘗試大書呆子牧場指南作爲初學者的但最終該文檔是您的最佳信息來源 –

+0

感謝Kishna Keshan – SeekingKnowleges

相關問題