添加新项目时不调用 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 很有帮助
我正在 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>
TextView 已正确填充相关数据。
如果你仔细检查你的适配器(数据层)是否正常工作,很可能你有表现层问题,例如你可能在白色背景上有白色文本,在这种情况下Hierarchy Viewer 很有帮助