Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 事件后加载ViewBinder_Java_Android - Fatal编程技术网

Java 事件后加载ViewBinder

Java 事件后加载ViewBinder,java,android,Java,Android,我正在尝试使用从Firebase(联系人同步的地方)读取数据获得的信息更新我的listview(联系人列表)。基本上,我正在尝试更改Firebase中备份的联系人的颜色 final SimpleCursorAdapter.ViewBinder binder = new SimpleCursorAdapter.ViewBinder() { @Override public boolean setViewValue(View view, Cursor cursor,

我正在尝试使用从Firebase(联系人同步的地方)读取数据获得的信息更新我的listview(联系人列表)。基本上,我正在尝试更改Firebase中备份的联系人的颜色

final SimpleCursorAdapter.ViewBinder binder = new SimpleCursorAdapter.ViewBinder() {
        @Override
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
            TextView tv = (TextView) view.findViewById(android.R.id.text1);

            // IF USERID MATCHES
            // DO STUFF, EG. tv.setBackgroundColor(......);

            return false;
        }
    };
    mAdapter.setViewBinder(binder);

    final Cursor c = mAdapter.getCursor();
    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        final String userID = c.getString(c.getColumnIndex(Phone._ID));
        userRoot.child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
            /* CALLS THE BINDER ON THIS USERID */
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {
            }
        });
    }

当我进入onDataChange功能时,我很难理解要传递什么以及如何更新ViewBinder。

您正在向后使用
光标或适配器。您不需要获取光标并从中读取数据;
ListView
就是这样做的。您的工作是提供一个游标。拥有光标后,您可以调用
CursorAdapter.changeCursor()
,而
列表视图将看到您更改了光标并进行了更新

因此,如果我正确理解您正在做的事情,那么您的设备上有一个带有联系人的
光标
,我假设它来自联系人
内容提供商
。现在,您要将该数据与Firebase数据合并,Firebase数据基本上是JSON

以下是配方:

首先创建一些类为Firebase数据提供数据模型,并使用一些方法从JSON加载数据

接下来,创建一个子类
SimpleCursorAdapter.ViewBinder
,您将在适配器方法
setViewBinder()
中设置该子类。您的子类将需要某种方法来接受来自Firebase的JSON数据。例如,假设您有一个类似于
setFirebaseData()
的方法

在这个过程中的某个地方,您可以从系统中获得一个联系人数据的游标,并在适配器上调用
changecoursor()
,将这些数据连接起来

现在,当触发
onDataChange
时,您可以将
DataSnapshot
中的JSON数据读取到您的模型中,并在您的模型中调用
setFirebaseData()
方法

加载Firebase数据后,必须告诉适配器其数据已更改。我从来没有用
光标或适配器
这样做过,说它真的没有改变过。您可以调用
notifyDataSetChanged()
,也可以只调用
changeCursor()
并为其提供与现有光标相同的光标。但无论如何,您必须说服适配器,是时候更新了

一旦
列表视图
看到适配器已更改并开始更新,您的
ViewBinder.setViewValue()
将被调用。光标已经为您定位,因此您只需为光标中的列调用
getString()
getInt()
,等等。在光标中的联系人数据或光标位置之间,存在与已设置的Firebase数据相关的内容。因此,如果您需要根据Firebase数据更改颜色,请在此处查找联系人。您实际上是将光标数据与Firebase数据连接起来


如果它仍然令人困惑,请对模型/视图/控制器设计模式进行一些研究,并了解
ListView
ListAdapter
如何在MVC中工作。

ViewBinder
应该由
mAdapter
调用,而不是由您调用