添加新项目时不调用 onCreateViewHolder

onCreateViewHolder not called when a new item is added

我正在 Android Wear 上开发我的第一个应用程序。

phone发送数据感谢Wearable.DataApi.putDataItem()。手表在 WearableListenerService.

中检索数据

主要 WearableActivity 启动此 Service 并向其注册一个 Receiver 以便动态获取每个新数据。

然后,我想在 WearableListView.Adapter.

中添加每个新数据

一切正常。 MainActivity 获取所有需要的数据并将其添加到适配器。

问题是显示了我添加的项目的 none。

这是我的 MainActivity 的代码,因为问题可能来自适配器。

public class MainActivity extends WearableActivity {
private WearableListView mListView;
private DataReceiver mDataReceiver;
private MyAdapter myAdapter;

@Override
protected void onStart() {
    mDataReceiver = new DataReceiver();
    mDataReceiver.setListener(new DataReceiver.DataReceivedListener() {
        @Override
        public void onDataReceived(JSONObject jsonObject) {
            myAdapter.addItem(jsonObject);
            myAdapter.notifyDataSetChanged();
        }
    });
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(ListenerService.GET_PHONE_DATA_ACTION);
    LocalBroadcastManager.getInstance(this).registerReceiver(mDataReceiver, intentFilter);
    Intent intent = new Intent(MainActivity.this, ListenerService.class);
    startService(intent);
    super.onStart();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
        mListView = (WearableListView) findViewById(R.id.wearable_list);
        MyAdapter = new MyAdapter(getApplicationContext());
        mListView.setAdapter(myAdapter);
    } catch (JSONException e) {
        e.printStackTrace();
    }

}

public class MyAdapter extends WearableListView.Adapter {
    private List<JSONObject> mList;
    private final Context mContext;
    private final LayoutInflater mInflater;

    public MyAdapter (Context context) {
        mList= ArrayList<>();
        mContext = context;
        mInflater = LayoutInflater.from(context);
    }

    public void addItem(JSONObject item) {
        mList.add(item);
        notifyDataSetChanged();
    }

    public class ItemViewHolder extends WearableListView.ViewHolder {
        private TextView textView1;
        private TextView textView2;
        public ItemViewHolder(View itemView) {
            super(itemView);
            textView1= (TextView) itemView.findViewById(R.id.tv1);
            textView2= (TextView) itemView.findViewById(R.id.tv2);
        }
    }

    @Override
    public WearableListView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new ItemViewHolder(mInflater.inflate(R.layout.custom_view, null));
    }

    @Override
    public void onBindViewHolder(WearableListView.ViewHolder holder, int position) {
        ItemViewHolder itemHolder = (ItemViewHolder) holder;
        TextView textView1 = itemHolder.textView1;
        TextView textView2 = itemHolder.textView2;
        JSONObject item;
        try {
            item = mList.get(position);
            textView1.setText(item.getString("title"));
            textView2.setText(item.getString("name"));
        } catch (JSONException e) {
            Log.e("MyAdapter", e.getMessage());
        }
        holder.itemView.setTag(position);
    }

    @Override
    public int getItemCount() {
        Log.d("Test", "SIZE ==" + mList.size());
        return mList.size();
    }
}

@Override
protected void onStop() {
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mDataReceiver);
    super.onStop();
}

public static class DataReceiver extends BroadcastReceiver {
    public interface DataReceivedListener {
        void onDataReceived(JSONObject jsonObject);
    }
    private DataReceivedListener mDataReceivedListener;

    public void setListener(DataReceivedListener dataReceivedListener) {
        mDataReceivedListener = dataReceivedListener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && intent.getStringExtra("data") != null) {
            if (mDataReceivedListener != null) {
                try {
                    mDataReceivedListener.onDataReceived(new JSONObject(intent.getStringExtra("data")));
                } catch (JSONException e) {
                    Log.e("DataReceiver", "Could not read JSON data");
                }
            }
        }
    }
}

如果我将 Log 放在 onBindViewHolder 上以获取当前位置的 JSONObject,结果似乎是合法的。即使 getItemCount 是连贯的。

问题是 onCreateViewHolder 只被调用了两次,ListView 上什么也没有显示。

我做错了什么?我尝试了很多东西、补丁等,但只会让一切变得更糟。

编辑:这是布局

<android.support.wearable.view.BoxInsetLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" android:id="@+id/container"

    tools:deviceIds="wear">

    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        app:layout_box="all">

        <android.support.wearable.view.WearableListView
            android:id="@+id/album_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </android.support.wearable.view.WearableListView>

    </FrameLayout>

</android.support.wearable.view.BoxInsetLayout>

这是 HierarchyViewer 结果。变量名称(文本视图)不同,但代码相同。

TextView 已正确填充相关数据。

如果你仔细检查你的适配器(数据层)是否正常工作,很可能你有表现层问题,例如你可能在白色背景上有白色文本,在这种情况下Hierarchy Viewer 很有帮助