2017-08-17 2 views
1

Anfänglich werden nach dem Einrichten von benutzerdefinierter Listenansicht keine Elemente mehr hinzugefügt, d. H. Angezeigt in der Listenansicht, obwohl Objekt von FirebaseMessagingService hinzugefügt wurde. Ich habe listView static deklariert, so dass das Objekt aus anderen Klassen oder Diensten zur Liste hinzugefügt werden kann. Hier ist mein Code:Das Hinzufügen von Objekten zur benutzerdefinierten Listenansicht von FirebaseMessagingService

FirebaseMessagingService:

@Override 
public void onMessageReceived(final RemoteMessage remoteMessage) { 

    //Toast.makeText(getApplicationContext(), remoteMessage.getData().get("transaction"),Toast.LENGTH_SHORT).show(); 
    Handler handler = new Handler(Looper.getMainLooper()); 
    handler.post(new Runnable() { 

     @Override 
     public void run() { 

      Gson gson = new Gson(); 
      Block b = gson.fromJson(remoteMessage.getData().get("transaction"), Block.class); 
      OpenChain.arrayList.add(b); 
     } 
    }); 
} 

Listview-Aktivitätscode:

public static ArrayList<Block> arrayList; 

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

    arrayList = new ArrayList<>(); 

    getSupportActionBar().setTitle("Vote Ledger"); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    ListView listView = (ListView) findViewById(R.id.listView); 

    BlockchainAdap adap = new BlockchainAdap(this, arrayList); 

    listView.setAdapter(adap); 
    adap.notifyDataSetChanged(); 

} 

** I Objekt von Wolke im JSON-Format ** Auch können empfangen Objekte hinzufügen von innen Listview-Aktivität, aber nicht von FirebaseMessagingSerivce

Antwort

1

I listView static deklariert haben, so dass das Objekt aus anderen Klassen oder Services zur Liste hinzugefügt werden kann.

nicht, eine gute Lösung, sind Sie Arraylist hier undicht, so wird es nicht Müll gesammelt werden, wenn die Aktivität zerstört wird.

Ein besserer Ansatz wäre die Verwendung LocalBroadCast in diesem Szenario.

Kasse der Link zur Info

https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

Nun, was Sie falsch machen. Sie modifizieren die Arraylist, aber Sie teilen dies dem Adapter nicht mit.

die Sie interessieren ..

private ArrayList<Block> arrayList = new ArrayList<>(); 
private BlockchainAdap adap; 

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

    getSupportActionBar().setTitle("Vote Ledger"); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    ListView listView = (ListView) findViewById(R.id.listView); 

    adap = new BlockchainAdap(this, arrayList); 

    listView.setAdapter(adap); 
} 

public static void updateList(Block b){ 
    arrayList.add(b); 
    adap.swap(arrayList); 
} 

In FirebaseMessagingService

@Override 
public void onMessageReceived(final RemoteMessage remoteMessage) { 
      Gson gson = new Gson(); 
      Block b = gson.fromJson(remoteMessage.getData().get("transaction"), Block.class); 
      OpenChain.updateList(b); 
} 

Auch eine Methode in Ihrer ** BlockchainAdap ** für Swap aussetzen.

class BlockchainAdap { 
    ArrayList<Block> arrayList; 
    BlockchainAdap(ArrayList<Block> arrayList){ 
    this.arrayList = arrayList; 
    } 

    public void swap(ArrayList<Block> arrayList){ 
    this.arrayList = arrayList; 
    notifydatasetChanged(); 
    } 

    // other methods 

} 

Das wird funktionieren, aber

  • LocalBroadcastReceiver von Messaging-Dienst verwenden Aktivität offenkettigen.
  • Verwenden Sie RecyclerView anstelle von ListView.
Verwandte Themen