没有用于警告Firebase数据库检索数据的setter /字段填充Listview

wes*_*nks 6 android firebase firebase-realtime-database

我只是尝试将Firebase数据库中的数据填充到我的列表视图中.日志显示正在检索数据,但适配器不会将值设置为列表中单个列表项中的文本?它只是说" INSERT VALUE没有setter/field ".这让我觉得我没有正确设置我的二传手,但Android Studio自动生成了.我不知道我在这里失踪了什么.任何帮助表示赞赏.

NODE OBJECT

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;
}
}
Run Code Online (Sandbox Code Playgroud)

静态的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;
}
}
Run Code Online (Sandbox Code Playgroud)

主要活动

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




}
Run Code Online (Sandbox Code Playgroud)

调试显示我能够获得客户端的所有内容.日志也显示了这一点.

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}}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

UPDATE

对我来说没有意义的部分,但我肯定对那些非常了解它的人有意义.正在理解我正在阅读的firebase文档.我读了几遍,但我猜它只是没有点击.我发现在firebase中构造数据是KEY.没有它你就无法正确编码,因为一切都依赖于它.Firebase现在让我很容易使用,因为我看到它正常工作.我将在此发表一篇博文来解释我的麻烦以及如何超越它们,以免其他人遇到这个烂摊子.下面的代码将构建一个带有firebase后端的功能列表视图!

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);
                }
Run Code Online (Sandbox Code Playgroud)

Bob*_*der 6

在retrieveData(),您应该使用ChildEventListener,而不是ValueEventListener.您正在使用生成的键添加Node对象作为子对象.该函数返回一个包含所有的.这会显示在您发布的输出中.您可以使用回调来获取每个回调,然后将其添加到适配器.node/$uidpush()ValueEventListenerMap<String,Object>NodeslogcatonChildAdded()ChildEventListenerNode


Fra*_*len 6

警告是因为您的字段和您的setter之间的外壳不匹配.

按照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;
    }
}
Run Code Online (Sandbox Code Playgroud)

作为额外的奖励,这将导致更合理的JSON属性名称.


poi*_*nds 5

我刚才遇到了同样的问题,答案非常令人沮丧。

我认为问题在于您的命名约定。例如,看起来你命名了一个变量mLat,然后你的访问器/修改器是getmLat()and setmLat()。我认为当 Firebase 进行反序列化时,它们依赖于某些命名。例如,如果您有一个名为 的成员变量lat,则需要有getLat()和setLat()。

对于您的情况,您可能只能将方法更改为getMLat()和setMLat()。尽管我建议总体上稍微改变一下您的约定。

作为旁注,要知道您的命名通常违反约定。通常,以 为前缀的变量m是私有成员变量,由公共方法(如您的)访问和变异。