2016-06-18 5 views
4

Firebaseデータベースのデータをリストビューに取り込もうとしています。ログにはデータが取得されていることが示されていますが、アダプタはリスト内の単一リスト項目のテキストに値を設定しません。 「INSERT VALUEのセッター/フィールドなし」と表示されています。私のセッターは正しく作ったわけではないが、Android Studioで自動生成されたと思う。私はここで何が欠けているのか分からない。どんな助けもありがとうございます。警告のためのセッター/フィールドがありませんFirebaseデータベースの取得データの取得リストビューへの入力

ノードオブジェクト

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; 
} 
} 

STATIC 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(); 
} 




} 

デバッグ秒私はすべてのクライアント側を得ることができることを知っています。ログにもこれが表示されます。

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}} 

enter image description here

UPDATE

私には意味をなさないが、私は確信していなかった部分が非常によくそれを知っている人には意味があります。私がfirebaseのドキュメントを読んでいることを理解しています。私はそれをいくつかの時間を読んだが、私はちょうどクリックしていないと思う。私はfirebaseのデータを構造化することはKEYだと分かりました。それがなければ、すべてがそれに依存しているため、適切にコーディングすることはできません。 Firebaseは、私がそれが動作しているのを今すぐ使いやすくしています。私はこの問題を説明するために、このブログのポストを作成し、それを超えて誰もこの混乱に遭遇することはありません。以下のコードは、firebaseバックエンドで機能的なリストビューを構築します! retrieveData()

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); 
       } 
+0

解決方法[こちら](http://stackoverflow.com/questions/37547399/how-to-deserialise-a-subclass-in-firebase-using-getvaluesubclass-class)を見ましたか? –

+1

私はlistAdapter.setNotifyOnChange(true)を見ることができませんでした。あなたはこれなしでlistadapterにどうやって通知しますか? – uguboz

+0

ありがとうございました@あなたの答えは私を助けました! –

答えて

5

、あなたはChildEventListener、ないValueEventListenerを使用する必要があります。 Nodeオブジェクトをnode/$uidの子として追加し、push()によって生成されたキーを追加しています。 ValueEventListenerは、Nodesのすべてを含むMap<String,Object>を返しています。これは投稿されたlogcatの出力に表示されます。 ChildEventListeneronChildAdded()コールバックを使用して、Nodeを作成してから、アダプタに追加することができます。

+0

収集したデータをアダプタ経由でリストビューに追加する際に問題が残っています。ほかに何が足りないのですか?私はあなたが提案したものにコードを調整しました。アップデートを確認してください。 –

+0

あなたは今どのような行動をしていますか?もうエラーメッセージが表示されませんか?あなたが 'onChildAdded()'にログステートメントを持っていて、それが起動していることを確認していますか? –

+0

私はこれを得ています... com.google.firebase.database.DatabaseException:型java.lang.Longの値を文字列に変換できませんでした –

3

あなたのフィールドとあなたのセッターとの間にケーシングの不一致があるため警告が表示されます。

Firebaseドキュメントの例に続いて、これは、Javaクラスをモデル化するためのより良い方法のように思える:追加ボーナスとして

public class NodeObject { 
    public String staticAddress; 
    public String lat; 
    public String lon; 

    public NodeObject(){ 
     //needed for firebase 
    } 

    public NodeObject(String address, String lat, String lon){ 
     this.staticAddress = address; 
     this.lat = lat; 
     this.lon = lon; 
    } 
} 

、これはあまりにも多くの賢明なJSONのプロパティ名につながります。

+0

私はあなたのアドバイスを取って、オブジェクトをredidします。ヘッドアップをありがとう! –

+0

'long'は予約語であり、プリミティブ型であり、ラッパークラスでは' Long'です。 –

2

今私は同じ問題があった&答えはかなりイライラしていました。

私はこの問題があなたの命名規則にあると思います。たとえば、変数mLatという名前が付けられていて、アクセサー/ミューテータがgetmLat()setmLat()のように見えます。私は、Firebaseが非直列化を行っているとき、特定の命名に頼っていると思います。たとえば、latというメンバー変数がある場合は、getLat()setLat()が必要です。

あなたのケースでは、方法をgetMLat()setMLat()に変更することができます。私はあなたの慣習を少し変更することをお勧めしますが。

名前を付けることは、一般に慣習に反することに注意してください。一般に、mという接頭辞が付いている変数は、ののであり、公開された方法(あなたのようなもの)によって変更されています。

関連する問題