Keine setter/Feld zur Warnung der FB-Datenbank, Abrufen von Daten Auffüllen, Listview
Ich bin einfach nur versuchen, füllen die Daten aus der FB-Datenbank in meine listview. Die Protokolle zeigen die Daten abgerufen werden, aber der adapter wird nicht gesetzt, werden die Werte der text in ein einziges Listenelement in der Liste? Alle es sagt, ist "Keine setter/Feld für LEGEN WERT". Das macht mich denken, dass ich nicht meine setter richtig gemacht, aber es wurden automatisch generiert von Android Studio. Ich weiß nicht, was ich hier vermisst. Jede Hilfe ist willkommen.
NODE-OBJEKT
package com.megliosolutions.ipd.Objects;
import android.graphics.Bitmap;
/**
* Created by Meglio on 6/13/16.
*/
public class NodeObject {
public String mStaticAddress;
public String mLat;
public String mLong;
public NodeObject(){
//needed for firebase
}
public NodeObject(String address, String lat, String Long){
this.mStaticAddress = address;
this.mLat = lat;
this.mLong = Long;
}
public String getmStaticAddress() {
return mStaticAddress;
}
public void setmStaticAddress(String mStaticAddress) {
this.mStaticAddress = mStaticAddress;
}
public String getmLat() {
return mLat;
}
public void setmLat(String mLat) {
this.mLat = mLat;
}
public String getmLong() {
return mLong;
}
public void setmLong(String mLong) {
this.mLong = mLong;
}
}
STATISCHE LISTADAPTER
/**
* Created by Meglio on 6/14/16.
*/
public class StaticListAdapter extends ArrayAdapter<NodeObject> {
public static String TAG = StaticListAdapter.class.getSimpleName();
public Context mContext;
public List<NodeObject> mNodes;
public class ViewHolder {
TextView mStaticAddress;
TextView mLAT;
TextView mLONG;
}
@Override
public int getCount() {
return mNodes.size();
}
public StaticListAdapter(Context context, List<NodeObject> objects) {
super(context, R.layout.activity_main, objects);
this.mContext = context;
this.mNodes = objects;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
NodeObject node = mNodes.get(position);
if (convertView == null) {
convertView = LayoutInflater.from(this.mContext).inflate(R.layout.node_item, null);
holder.mLONG = (TextView) convertView.findViewById(R.id.node_item_LONG);
holder.mStaticAddress = (TextView) convertView.findViewById(R.id.node_item_IP);
holder.mLAT = (TextView) convertView.findViewById(R.id.node_item_LAT);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.mStaticAddress.setText(node.getStaticAddress());
holder.mLONG.setText(node.getLongitude());
holder.mLAT.setText(node.getLatitude());
return convertView;
}
}
MAINACTIVITY
public class MainActivity extends AppCompatActivity {
public static String TAG = MainActivity.class.getSimpleName();
public ListView main_ListView;
public FirebaseAuth mAuth;
public FirebaseUser mUser;
public DatabaseReference mDatabase;
//Strings
public String static_ip;
public String lat = "5.0";
public String mLong = "4.0";
public String currentUser;
//Adapters
public StaticListAdapter listAdapter;
//Node Object
NodeObject node;
public List<NodeObject> nodesList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Instances
mAuth = FirebaseAuth.getInstance();
mUser = mAuth.getCurrentUser();
mDatabase = FirebaseDatabase.getInstance().getReference();
currentUser = mUser.getUid();
main_ListView = (ListView)findViewById(R.id.Main_listview);
//Toolbar
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//[End of Toolbar]
nodesList = new ArrayList<>();
retrieveData();
listAdapter = new StaticListAdapter(getApplicationContext(),nodesList);
main_ListView.setAdapter(listAdapter);
Log.i(TAG, "USER: " + currentUser);
}
private void retrieveData() {
mDatabase.child("nodes").child(mUser.getUid())
.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey());
NodeObject nodeObject = dataSnapshot.getValue(NodeObject.class);
listAdapter.add(nodeObject);
listAdapter.setNotifyOnChange(true);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Handle item selection
switch (item.getItemId()) {
case R.id.getGPS:
//nothing
return true;
case R.id.addNode:
addNode();
return true;
case R.id.logout:
signOut();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void signOut() {
mAuth.signOut();
Intent intent = new Intent(MainActivity.this, Login.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Toast.makeText(getApplicationContext(), "Logging Out.", Toast.LENGTH_SHORT).show();
startActivity(intent);
}
private void addNode() {
//AlertDialog
final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
dialogBuilder.setTitle("Dude, assign something...");
LayoutInflater inflater = this.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.main_add_node_dialog, null);
dialogBuilder.setView(dialogView);
final EditText editText = (EditText)
dialogView.findViewById(R.id.static_et);
dialogBuilder.setPositiveButton("Assign", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
static_ip = editText.getText().toString();
String ip = static_ip;
node = new NodeObject(ip, lat, mLong);
mDatabase.child("nodes").child(currentUser).push().setValue(node);
Toast.makeText(getApplicationContext(), "Static IP: " + static_ip + " assigned!"
, Toast.LENGTH_SHORT).show();
}
}).
setNegativeButton("Or Not...", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(), "Fine, nvm then..."
, Toast.LENGTH_SHORT).show();
}
});
dialogBuilder.create().show();
}
}
Debuggen zeigt, dass ich in der Lage bin, alles zu erreichen, was client-Seite. Logs zeigen dies auch.
06-18 18:25:42.981 12962-12962/com.megliosolutions.ipd D/MainActivity: zHF4TGnRvkeXEbKiLegiUNLGHX12:{ -KKLeBAe9pV1Umm3qQMo={mStaticAddress=26161910494949, mLong=3.0, mLat=2.0}, -KKG_ACFvdX7aJOR98-o={mStaticAddress=10.223.22.250, mLong=3.0, mLat=2.0}, -KKWKMZS7WkE_xWbL3rC={mStaticAddress=, mLong=4, mLat=5}, -KKQQLITf9-7iMFlqEWR={mStaticAddress=123123123123, mLong=3.0, mLat=2.0}, -KKG_J6PKwogjBFdk52Z={mStaticAddress=10.333.555.888, mLong=3.0, mLat=2.0}}
UPDATE
Den Teil, der nicht für mich Sinn machen, aber ich bin mir sicher, dass macht Sinn für jene, die wissen es sehr gut. Ist das Verständnis, was bin ich beim Lesen der FB-Dokumentation. Ich Lesen Sie über es ein paar mal, aber ich denke, es war einfach nicht "Klick". Ich fand heraus, dass die Strukturierung der Daten in FB ist SCHLÜSSEL. Ohne, dass Sie können nicht code richtig, denn alles beruht auf diesem. FB macht es einfach zu bedienen, nun, ich sehe es. Ich werde einen blog-post zu erklären, meine Probleme und wie um Sie zu übertreffen, so dass niemand anderes läuft in diesen Schlamassel. Der folgende code erstellt eine funktionale listview mit FB backend!
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey());
NodeObject nodeObject = dataSnapshot.getValue(NodeObject.class);
listAdapter.add(nodeObject);
listAdapter.setNotifyOnChange(true);
}
ich konnte nicht sehen, listAdapter.setNotifyOnChange(true); wie gehen Sie Benachrichtigen, listadapter ohne diese.
Danke @UğurB deine Antwort hat mir geholfen!
InformationsquelleAutor wesley franks | 2016-06-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
In
retrieveData()
Sie sollte mit einer ChildEventListener, nicht einValueEventListener
. Sie sind das hinzufügenNode
Objekte als Kindernode/$uid
mit den keys generiertpush()
. DieValueEventListener
ist wieder einMap<String,Object>
mit allenNodes
. Dargestellt ist in derlogcat
Ausgabe, die du gepostet. Sie können dieonChildAdded()
Rückruf vonChildEventListener
zu bekommen jedeNode
wie es erstellt wird und dann fügen Sie es zu Ihrem adapter.Welche Verhalten sind Sie jetzt sehen? Nicht zu sehen, die Fehlermeldung nicht mehr? Sie haben eine log-Anweisung in
onChildAdded()
zu bestätigen, dass es brennen?Ich bin immer diese... com.google.FB.Datenbank.DatabaseException: Failed to convert Wert vom Typ java.lang.Lange String
sagt, es ist verursacht durch die Zeile mit dem code für NodeObject nodeObject = datasnapshot.getValue(NodeObject.class);
Verwenden Sie die FB-Konsole zu prüfen, den Wert und die
nodes/$uid
zu bestätigen, dass es Kinder sind, dieNodes
. Gibt es vielleicht ein paar alte Daten übrig von vorherigen Durchläufen? Wenn dem so ist, können Sie mithilfe der Konsole zu löschen die überflüssigen Werte.InformationsquelleAutor Bob Snyder
Die Warnung ist, weil das Gehäuse Missverhältnis zwischen Ihrem Feld und Sie setter.
Folgenden die Beispiele, die in der FB-Dokumentation, das scheint der bessere Weg, um Modell die Java-Klasse:
Als zusätzlichen bonus dies führt zu mehr sinnvolle JSON Namen der Eigenschaft zu.
long
ist reserviertes Wort, es ist eine primitive Art, undLong
für die wrapper-Klasse.InformationsquelleAutor Frank van Puffelen
Ich hatte das gleiche Problem nur jetzt & die Antwort war ziemlich frustrierend.
Ich denke, dass das Problem mit der Namenskonvention. Zum Beispiel, es sieht aus wie Sie mit dem Namen einer Variablen
mLat
, und dann Ihre Accessor/Mutator sindgetmLat()
undsetmLat()
. Ich denke, wenn die FB ist dabei die Deserialisierung, verlassen Sie sich auf bestimmte Namensgebung. Zum Beispiel, wenn Sie eine Membervariable mit dem Namenlat
Sie müssengetLat()
undsetLat()
.Für Ihren Fall, Sie könnten nur in der Lage, ändern Sie Ihre Methoden, um sein
getMLat()
undsetMLat()
. Obwohl ich würde vorschlagen, ändern Sie Ihre Konventionen ein bisschen im Allgemeinen.Als seitliche Anmerkung, die wissen, dass Ihre Namensgebung ist in der Regel gegen die Konvention. In der Regel werden die Variablen mit dem Präfix
m
sind private member-Variablen, auf die Sie zugreifen & mutierte durch öffentliche Mittel (wie bei Euch).InformationsquelleAutor poisondminds