android 自定义列表适配器不显示项目
android custom List Adapter not displaying items
我正在使用片段来显示我发现的所有对等点,它成功到达片段但在尝试显示对等点时崩溃。
片段
public class peerItemFragment extends ListFragment {
private List<WifiP2pDevice> peers = new ArrayList<>();
ProgressDialog progressDialog = null;
View mContentView = null;
private WifiP2pDevice device;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
this.setListAdapter(new WiFiPeerListAdapter(getActivity(), R.layout.row_devices, peers));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mContentView = inflater.inflate(R.layout.fragment_item_grid, null);
return mContentView;
}
/**
* @return this device
*/
public WifiP2pDevice getDevice() {
return device;
}
private static String getDeviceStatus(int deviceStatus) {
Log.d(sendActivity.TAG, "Peer status :" + deviceStatus);
switch (deviceStatus) {
case WifiP2pDevice.AVAILABLE:
return "Available";
case WifiP2pDevice.INVITED:
return "Invited";
case WifiP2pDevice.CONNECTED:
return "Connected";
case WifiP2pDevice.FAILED:
return "Failed";
case WifiP2pDevice.UNAVAILABLE:
return "Unavailable";
default:
return "Unknown";
}
}
/**
* Initiate a connection with the peer.
*/
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
WifiP2pDevice device = (WifiP2pDevice) getListAdapter().getItem(position);
((DeviceActionListener) getActivity()).showDetails(device);
}
/**
* Array adapter for ListFragment that maintains WifiP2pDevice list.
*/
private class WiFiPeerListAdapter extends ArrayAdapter<WifiP2pDevice> {
private List<WifiP2pDevice> items;
/**
* @param context
* @param textViewResourceId
* @param objects
*/
public WiFiPeerListAdapter(Context context, int textViewResourceId,
List<WifiP2pDevice> objects) {
super(context, textViewResourceId, objects);
items = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getActivity().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row_devices, parent, false);
}
WifiP2pDevice device = items.get(position);
if (device != null) {
TextView top = (TextView) v.findViewById(R.id.device_name);
TextView bottom = (TextView) v.findViewById(R.id.device_details);
if (top != null) {
top.setText(device.deviceName);
}
if (bottom != null) {
bottom.setText(getDeviceStatus(device.status));
}
}
return v;
}
}
/**
* Update UI for this device.
*
* @param device WifiP2pDevice object
*/
public void updateThisDevice(WifiP2pDevice device) {
this.device = device;
TextView view = (TextView) mContentView.findViewById(R.id.tvMyName);
view.setText(device.deviceName);
view = (TextView) mContentView.findViewById(R.id.tvMyStatus);
view.setText(getDeviceStatus(device.status));
}
public void addPeers(WifiP2pDeviceList peerList) {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
peers.clear();
peers.addAll(peerList.getDeviceList());
((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
if (peers.size() == 0) {
Log.d(sendActivity.TAG, "No devices found");
return;
}
}
public void clearPeers() {
peers.clear();
((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
}
问题 atm 是当我从 main class...
调用时使用以下代码调用它时
peerItemFragment peerFragment = new peerItemFragment();
FragmentManager managerAuthenticate = getFragmentManager();
FragmentTransaction transactionAuthen = managerAuthenticate.beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transactionAuthen.replace(R.id.fragment_container, peerFragment);
transactionAuthen.addToBackStack(null);
//***************************************************
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("list", mService.peerList);
peerFragment.setArguments(bundle);
// Commit the transaction
transactionAuthen.commit();
一步步调查并 运行 我发现它在以下行中有问题?
((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
真的很奇怪,因为这都是从 google 样本中提取的,不知道为什么会崩溃..
另请注意,该片段有一个 listView 命名列表,如 google 所建议(没有问题)。
很难找出哪里出了问题?会不会是适配器不在?
编辑------------------------------------ ------------------------------
从 activity
调用片段
peerItemFragment peerFragment = new peerItemFragment();
FragmentManager managerAuthenticate = getFragmentManager();
Bundle bundle = new Bundle();
ArrayList<WifiP2pDevice> list = new ArrayList<>(mService.peerList.getDeviceList());
bundle.putParcelableArrayList("list", list);
peerFragment.setArguments(bundle);
FragmentTransaction transactionAuthen = managerAuthenticate.beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transactionAuthen.replace(R.id.fragment_container, peerFragment);
transactionAuthen.addToBackStack(null);
// Commit the transaction
transactionAuthen.commit();
//pass peer list to fragment to display
//peerFragment.addPeers(mService.peerList);
}
编辑后的片段
public class peerItemFragment extends ListFragment {
private List<WifiP2pDevice> peers = new ArrayList<>();
ProgressDialog progressDialog = null;
View mContentView = null;
private WifiP2pDevice device;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
this.setListAdapter(new WiFiPeerListAdapter(getActivity(), R.layout.row_devices, peers));
Bundle bundle = getArguments();
peers = bundle.getParcelableArrayList("list");
((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mContentView = inflater.inflate(R.layout.fragment_item_grid, null);
return mContentView;
}
/**
* @return this device
*/
public WifiP2pDevice getDevice() {
return device;
}
private static String getDeviceStatus(int deviceStatus) {
Log.d(sendActivity.TAG, "Peer status :" + deviceStatus);
switch (deviceStatus) {
case WifiP2pDevice.AVAILABLE:
return "Available";
case WifiP2pDevice.INVITED:
return "Invited";
case WifiP2pDevice.CONNECTED:
return "Connected";
case WifiP2pDevice.FAILED:
return "Failed";
case WifiP2pDevice.UNAVAILABLE:
return "Unavailable";
default:
return "Unknown";
}
}
/**
* Initiate a connection with the peer.
*/
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
WifiP2pDevice device = (WifiP2pDevice) getListAdapter().getItem(position);
((DeviceActionListener) getActivity()).showDetails(device);
}
/**
* Array adapter for ListFragment that maintains WifiP2pDevice list.
*/
private class WiFiPeerListAdapter extends ArrayAdapter<WifiP2pDevice> {
private List<WifiP2pDevice> items;
/**
* @param context
* @param textViewResourceId
* @param objects
*/
public WiFiPeerListAdapter(Context context, int textViewResourceId,
List<WifiP2pDevice> objects) {
super(context, textViewResourceId, objects);
items = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getActivity().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row_devices, parent, false);
}
WifiP2pDevice device = items.get(position);
if (device != null) {
TextView top = (TextView) v.findViewById(R.id.device_name);
TextView bottom = (TextView) v.findViewById(R.id.device_details);
if (top != null) {
top.setText(device.deviceName);
}
if (bottom != null) {
bottom.setText(getDeviceStatus(device.status));
}
}
return v;
}
}
你的目录说:
at com.haswell.phoneduplicator.peerItemFragment.addPeers(peerItemFragment.java:137)
那一行是什么?
您的代码的问题在于,当您调用 addPears
时,onActivityCreated
可能尚未被调用(交易未以同步方式执行),导致 getListAdapter
return null
。要修复它,您可以在 bundle
中添加您的 peerList
,(WifiP2pDevice
是 parcelable
),并将此设置为 arguments
作为您的 Fragment
Bundle bundle = new Bundle();
ArrayList<WifiP2pDevice> list = new ArrayList<>(mService.peerList.getDeviceList());
bundle.putParcelableArrayList("list", list);
peerFragmet.setArguments(bundle);
并摆脱
peerFragment.addPeers(mService.peerList);
当 onActivityCreated
被调用时,您可以使用 getArguments
读取捆绑包,检索您的 peerList 对象并实例化您的 adpater
我正在使用片段来显示我发现的所有对等点,它成功到达片段但在尝试显示对等点时崩溃。
片段
public class peerItemFragment extends ListFragment {
private List<WifiP2pDevice> peers = new ArrayList<>();
ProgressDialog progressDialog = null;
View mContentView = null;
private WifiP2pDevice device;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
this.setListAdapter(new WiFiPeerListAdapter(getActivity(), R.layout.row_devices, peers));
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mContentView = inflater.inflate(R.layout.fragment_item_grid, null);
return mContentView;
}
/**
* @return this device
*/
public WifiP2pDevice getDevice() {
return device;
}
private static String getDeviceStatus(int deviceStatus) {
Log.d(sendActivity.TAG, "Peer status :" + deviceStatus);
switch (deviceStatus) {
case WifiP2pDevice.AVAILABLE:
return "Available";
case WifiP2pDevice.INVITED:
return "Invited";
case WifiP2pDevice.CONNECTED:
return "Connected";
case WifiP2pDevice.FAILED:
return "Failed";
case WifiP2pDevice.UNAVAILABLE:
return "Unavailable";
default:
return "Unknown";
}
}
/**
* Initiate a connection with the peer.
*/
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
WifiP2pDevice device = (WifiP2pDevice) getListAdapter().getItem(position);
((DeviceActionListener) getActivity()).showDetails(device);
}
/**
* Array adapter for ListFragment that maintains WifiP2pDevice list.
*/
private class WiFiPeerListAdapter extends ArrayAdapter<WifiP2pDevice> {
private List<WifiP2pDevice> items;
/**
* @param context
* @param textViewResourceId
* @param objects
*/
public WiFiPeerListAdapter(Context context, int textViewResourceId,
List<WifiP2pDevice> objects) {
super(context, textViewResourceId, objects);
items = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getActivity().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row_devices, parent, false);
}
WifiP2pDevice device = items.get(position);
if (device != null) {
TextView top = (TextView) v.findViewById(R.id.device_name);
TextView bottom = (TextView) v.findViewById(R.id.device_details);
if (top != null) {
top.setText(device.deviceName);
}
if (bottom != null) {
bottom.setText(getDeviceStatus(device.status));
}
}
return v;
}
}
/**
* Update UI for this device.
*
* @param device WifiP2pDevice object
*/
public void updateThisDevice(WifiP2pDevice device) {
this.device = device;
TextView view = (TextView) mContentView.findViewById(R.id.tvMyName);
view.setText(device.deviceName);
view = (TextView) mContentView.findViewById(R.id.tvMyStatus);
view.setText(getDeviceStatus(device.status));
}
public void addPeers(WifiP2pDeviceList peerList) {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
peers.clear();
peers.addAll(peerList.getDeviceList());
((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
if (peers.size() == 0) {
Log.d(sendActivity.TAG, "No devices found");
return;
}
}
public void clearPeers() {
peers.clear();
((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
}
问题 atm 是当我从 main class...
调用时使用以下代码调用它时 peerItemFragment peerFragment = new peerItemFragment();
FragmentManager managerAuthenticate = getFragmentManager();
FragmentTransaction transactionAuthen = managerAuthenticate.beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transactionAuthen.replace(R.id.fragment_container, peerFragment);
transactionAuthen.addToBackStack(null);
//***************************************************
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("list", mService.peerList);
peerFragment.setArguments(bundle);
// Commit the transaction
transactionAuthen.commit();
一步步调查并 运行 我发现它在以下行中有问题?
((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
真的很奇怪,因为这都是从 google 样本中提取的,不知道为什么会崩溃..
另请注意,该片段有一个 listView 命名列表,如 google 所建议(没有问题)。
很难找出哪里出了问题?会不会是适配器不在?
编辑------------------------------------ ------------------------------
从 activity
调用片段 peerItemFragment peerFragment = new peerItemFragment();
FragmentManager managerAuthenticate = getFragmentManager();
Bundle bundle = new Bundle();
ArrayList<WifiP2pDevice> list = new ArrayList<>(mService.peerList.getDeviceList());
bundle.putParcelableArrayList("list", list);
peerFragment.setArguments(bundle);
FragmentTransaction transactionAuthen = managerAuthenticate.beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transactionAuthen.replace(R.id.fragment_container, peerFragment);
transactionAuthen.addToBackStack(null);
// Commit the transaction
transactionAuthen.commit();
//pass peer list to fragment to display
//peerFragment.addPeers(mService.peerList);
}
编辑后的片段
public class peerItemFragment extends ListFragment {
private List<WifiP2pDevice> peers = new ArrayList<>();
ProgressDialog progressDialog = null;
View mContentView = null;
private WifiP2pDevice device;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
this.setListAdapter(new WiFiPeerListAdapter(getActivity(), R.layout.row_devices, peers));
Bundle bundle = getArguments();
peers = bundle.getParcelableArrayList("list");
((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mContentView = inflater.inflate(R.layout.fragment_item_grid, null);
return mContentView;
}
/**
* @return this device
*/
public WifiP2pDevice getDevice() {
return device;
}
private static String getDeviceStatus(int deviceStatus) {
Log.d(sendActivity.TAG, "Peer status :" + deviceStatus);
switch (deviceStatus) {
case WifiP2pDevice.AVAILABLE:
return "Available";
case WifiP2pDevice.INVITED:
return "Invited";
case WifiP2pDevice.CONNECTED:
return "Connected";
case WifiP2pDevice.FAILED:
return "Failed";
case WifiP2pDevice.UNAVAILABLE:
return "Unavailable";
default:
return "Unknown";
}
}
/**
* Initiate a connection with the peer.
*/
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
WifiP2pDevice device = (WifiP2pDevice) getListAdapter().getItem(position);
((DeviceActionListener) getActivity()).showDetails(device);
}
/**
* Array adapter for ListFragment that maintains WifiP2pDevice list.
*/
private class WiFiPeerListAdapter extends ArrayAdapter<WifiP2pDevice> {
private List<WifiP2pDevice> items;
/**
* @param context
* @param textViewResourceId
* @param objects
*/
public WiFiPeerListAdapter(Context context, int textViewResourceId,
List<WifiP2pDevice> objects) {
super(context, textViewResourceId, objects);
items = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getActivity().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row_devices, parent, false);
}
WifiP2pDevice device = items.get(position);
if (device != null) {
TextView top = (TextView) v.findViewById(R.id.device_name);
TextView bottom = (TextView) v.findViewById(R.id.device_details);
if (top != null) {
top.setText(device.deviceName);
}
if (bottom != null) {
bottom.setText(getDeviceStatus(device.status));
}
}
return v;
}
}
你的目录说:
at com.haswell.phoneduplicator.peerItemFragment.addPeers(peerItemFragment.java:137)
那一行是什么?
您的代码的问题在于,当您调用 addPears
时,onActivityCreated
可能尚未被调用(交易未以同步方式执行),导致 getListAdapter
return null
。要修复它,您可以在 bundle
中添加您的 peerList
,(WifiP2pDevice
是 parcelable
),并将此设置为 arguments
作为您的 Fragment
Bundle bundle = new Bundle();
ArrayList<WifiP2pDevice> list = new ArrayList<>(mService.peerList.getDeviceList());
bundle.putParcelableArrayList("list", list);
peerFragmet.setArguments(bundle);
并摆脱
peerFragment.addPeers(mService.peerList);
当 onActivityCreated
被调用时,您可以使用 getArguments
读取捆绑包,检索您的 peerList 对象并实例化您的 adpater