Reputation: 279
I am using a fragment to display all my peers I discover, it sucessfully reaches the fragment but crashes when trying to display the peers.
fragment
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();
}
the issue atm is when I call it using the following code when called from 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();
having looked into and running it step by step I found out that it is having issues with the following line?
((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
really strange as this is all taken from a google sample, not sure why it crashes..
Please also note that the fragment has a listView named list as suggested by google (no issue there).
finding it very hard to see where it has gone wrong? could it be that the adapter is not there?
EDIT ----------------------------------------------------------------------
call to fragment from 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);
}
Fragment after EDIT
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;
}
}
Upvotes: 1
Views: 509
Reputation: 157487
The problem with your code is that when you call addPears
, onActivityCreated
has not probably been called yet (transaction are not executed in a synchronous way), causing getListAdapter
to return null
. To fix it, you can add your peerList
, in a bundle
, (WifiP2pDevice
are parcelable
), and set this one as arguments
for your Fragment
Bundle bundle = new Bundle();
ArrayList<WifiP2pDevice> list = new ArrayList<>(mService.peerList.getDeviceList());
bundle.putParcelableArrayList("list", list);
peerFragmet.setArguments(bundle);
and get rid of
peerFragment.addPeers(mService.peerList);
when onActivityCreated
is called, you can read the bundle back, with getArguments
, retrieve your peerList object and instantiate your adpater
Upvotes: 1
Reputation: 1440
Your catlog says:
at com.haswell.phoneduplicator.peerItemFragment.addPeers(peerItemFragment.java:137)
What's at that line?
Upvotes: 0