通过构造函数传递ArrayAdapter | 列表视图

huangapple go评论120阅读模式
英文:

Passing Array Adapter via Constructor | ListView

问题

我试图将来自LocationsFragment.class的适配器用于我的DeviceAdmin.class,以将两个字符串mylatitudemylongitude添加到我的ListView中。
我正在使用构造函数方法。
但是每当我在我的DeviceAdmin.class中调用adapter.add(mylatitude + " " + mylongitude);时,它似乎返回null。

  1. at com.ayush.trixter.ui.captures.DeviceAdmin$1.onLocationChanged(DeviceAdmin.java:103)

第103行是:adapter.add("Latitude: " + mylat + "Longitude: " + mylon);

DeviceAdmin.class

  1. package com.ayush.trixter.ui.captures;
  2. import android.Manifest;
  3. import android.annotation.SuppressLint;
  4. import android.app.admin.DeviceAdminReceiver;
  5. import android.app.admin.DevicePolicyManager;
  6. import android.content.Context;
  7. import android.content.Intent;
  8. import android.content.pm.PackageManager;
  9. import android.graphics.Paint;
  10. import android.graphics.SurfaceTexture;
  11. import android.hardware.Camera;
  12. import android.hardware.camera2.CameraAccessException;
  13. import android.hardware.camera2.CameraCaptureSession;
  14. import android.hardware.camera2.CameraCharacteristics;
  15. import android.hardware.camera2.CameraManager;
  16. import android.location.Criteria;
  17. import android.location.Location;
  18. import android.location.LocationListener;
  19. import android.location.LocationManager;
  20. import android.os.Build;
  21. import android.os.Looper;
  22. import android.os.UserHandle;
  23. import android.util.Log;
  24. import android.util.SparseIntArray;
  25. import android.view.ContextThemeWrapper;
  26. import android.view.Surface;
  27. import android.view.View;
  28. import android.widget.Adapter;
  29. import android.widget.ArrayAdapter;
  30. import android.widget.ListView;
  31. import android.widget.Toast;
  32. import androidx.annotation.NonNull;
  33. import androidx.core.content.PermissionChecker;
  34. import com.ayush.trixter.R;
  35. import com.ayush.trixter.ui.locations.LocationFragment;
  36. import com.google.android.gms.location.LocationCallback;
  37. import com.google.android.gms.location.LocationRequest;
  38. import com.google.android.gms.location.LocationServices;
  39. import com.google.android.material.snackbar.Snackbar;
  40. import com.google.firebase.database.FirebaseDatabase;
  41. import java.util.ArrayList;
  42. public class DeviceAdmin extends DeviceAdminReceiver
  43. {
  44. private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
  45. public CameraManager cam;
  46. LocationManager locationManager;
  47. final String TAG = "[Trixter]";
  48. DevicePolicyManager mgr;
  49. FirebaseDatabase db;
  50. public boolean mTracking = false;
  51. public ArrayList<String> listItems=new ArrayList<>();
  52. LocationFragment lf = new LocationFragment();
  53. ArrayAdapter<String> adapter = lf.adapter;
  54. @Override
  55. public void onPasswordFailed(@NonNull Context ctx, @NonNull Intent intent, @NonNull UserHandle user) {
  56. super.onPasswordFailed(ctx, intent, user);
  57. cam = (CameraManager) ctx.getSystemService(Context.CAMERA_SERVICE);
  58. mgr = (DevicePolicyManager) ctx.getSystemService(Context.DEVICE_POLICY_SERVICE);
  59. Log.d(TAG,"PasswordFailed");
  60. int pwdfailcount = mgr.getCurrentFailedPasswordAttempts();
  61. if(pwdfailcount==3)
  62. {
  63. takeSnapShots();
  64. getloc(ctx);
  65. }
  66. }
  67. public void getloc(Context ctx)
  68. {
  69. locationManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);
  70. Criteria criteria = new Criteria();
  71. String provider = locationManager.getBestProvider(criteria,true);
  72. boolean gps_enabled = false;
  73. boolean network_enabled = false;
  74. try
  75. { gps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); }
  76. catch (Exception e) {}
  77. try { network_enabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);} catch (Exception e) {}
  78. if(PermissionChecker.checkSelfPermission(ctx, Manifest.permission.ACCESS_COARSE_LOCATION) == PermissionChecker.PERMISSION_GRANTED &&
  79. PermissionChecker.checkSelfPermission(ctx,Manifest.permission.ACCESS_FINE_LOCATION) == PermissionChecker.PERMISSION_GRANTED) {
  80. if(gps_enabled == true && network_enabled ==true) {
  81. locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() {
  82. @Override
  83. public void onLocationChanged(@NonNull Location loc) {
  84. double mylat = loc.getLatitude();
  85. double mylon = loc.getLongitude();
  86. double myacc = loc.getAccuracy();
  87. double time = loc.getTime();
  88. double myalt = loc.getAltitude();
  89. Log.d("[TrixterLocation]", "The Latitude:- " + mylat + "\nThe Longitude:- " + mylon +
  90. "\nThe Altitude:- " + myalt + "\n The Accuracy" + myacc + "\nThe Time:- " + time);
  91. adapter.add("Latitude: " + mylat + "Longitude: " + mylon);
  92. }
  93. });
  94. }
  95. else
  96. {
  97. Toast.makeText(ctx, "Location is not enabled", Toast.LENGTH_SHORT).show();
  98. Log.d("[Trixter] ","Error: Location or Internet Not Enabled");
  99. }
  100. }
  101. }
  102. private void takeSnapShots()
  103. {
  104. }
  105. }

LocationsFragment.class

  1. package com.ayush.trixter.ui.locations;
  2. import android.content.Context;
  3. import android.location.LocationManager;
  4. import android.os.Bundle;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.AdapterView;
  9. import android.widget.ArrayAdapter;
  10. import android.widget.ListView;
  11. import android.widget.TextView;
  12. import android.widget.Toast;
  13. import androidx.annotation.NonNull;
  14. import androidx.annotation.Nullable;
  15. import androidx.fragment.app.Fragment;
  16. import androidx.fragment.app.ListFragment;
  17. import androidx.lifecycle.Observer;
  18. import androidx.lifecycle.ViewModelProviders;
  19. import com.ayush.trixter.R;
  20. import com.ayush.trixter.ui.captures.DeviceAdmin;
  21. import java.util.ArrayList;
  22. public class LocationFragment extends ListFragment {
  23. ListView loclst;
  24. LocationManager locationManager;
  25. public ArrayList<String> listItems=new ArrayList<>();
  26. public ArrayAdapter<String> adapter = (ArrayAdapter<String>) getListAdapter();
  27. public LocationFragment()
  28. {
  29. }
  30. public View onCreateView(@NonNull LayoutInflater inflater,
  31. ViewGroup container, Bundle savedInstanceState) {
  32. View root = inflater.inflate(R.layout.fragment_locations, container, false);
  33. loclst = root.findViewById(android.R.id.list);
  34. Context context = getActivity();
  35. locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
  36. adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_2 , listItems);
  37. loclst.setAdapter(adapter);
  38. return root;
  39. }
  40. }

根据我的观察:
它会返回null,因为ArrayAdapter未初始化,并且只有在Fragment打开时才会初始化,即在onCreateView()方法中。

但是我无法找到使其工作的解决方案。
如果有人有更好的方法来更轻松地完成这个任务,请告诉我。

英文:

I am trying to use adapter from my LocationsFragment.class into my DeviceAdmin.class to add two Strings say mylatitude and mylongitude to my ListView.
I am going through Constructor Method.
But it seems to return null, whenever I call adapter.add(mylatitude + &quot; &quot; + mylongitude); in my DeviceAdmin.class

  1. java.lang.NullPointerException: Attempt to invoke virtual method &#39;void android.widget.ArrayAdapter.add(java.lang.Object)&#39; on a null object reference
  2. at com.ayush.trixter.ui.captures.DeviceAdmin$1.onLocationChanged(DeviceAdmin.java:103)

Line 103 is : adapter.add(&quot;Latitude: &quot; + mylat + &quot;Longitude: &quot; + mylon);

DeviceAdmin.class

  1. import android.Manifest;
  2. import android.annotation.SuppressLint;
  3. import android.app.admin.DeviceAdminReceiver;
  4. import android.app.admin.DevicePolicyManager;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.pm.PackageManager;
  8. import android.graphics.Paint;
  9. import android.graphics.SurfaceTexture;
  10. import android.hardware.Camera;
  11. import android.hardware.camera2.CameraAccessException;
  12. import android.hardware.camera2.CameraCaptureSession;
  13. import android.hardware.camera2.CameraCharacteristics;
  14. import android.hardware.camera2.CameraManager;
  15. import android.location.Criteria;
  16. import android.location.Location;
  17. import android.location.LocationListener;
  18. import android.location.LocationManager;
  19. import android.os.Build;
  20. import android.os.Looper;
  21. import android.os.UserHandle;
  22. import android.util.Log;
  23. import android.util.SparseIntArray;
  24. import android.view.ContextThemeWrapper;
  25. import android.view.Surface;
  26. import android.view.View;
  27. import android.widget.Adapter;
  28. import android.widget.ArrayAdapter;
  29. import android.widget.ListView;
  30. import android.widget.Toast;
  31. import androidx.annotation.NonNull;
  32. import androidx.core.content.PermissionChecker;
  33. import com.ayush.trixter.R;
  34. import com.ayush.trixter.ui.locations.LocationFragment;
  35. import com.google.android.gms.location.LocationCallback;
  36. import com.google.android.gms.location.LocationRequest;
  37. import com.google.android.gms.location.LocationServices;
  38. import com.google.android.material.snackbar.Snackbar;
  39. import com.google.firebase.database.FirebaseDatabase;
  40. import java.util.ArrayList;
  41. public class DeviceAdmin extends DeviceAdminReceiver
  42. {
  43. private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
  44. public CameraManager cam;
  45. LocationManager locationManager;
  46. final String TAG = &quot;[Trixter]&quot;;
  47. DevicePolicyManager mgr;
  48. FirebaseDatabase db;
  49. public boolean mTracking = false;
  50. public ArrayList&lt;String&gt; listItems=new ArrayList&lt;&gt;();
  51. LocationFragment lf = new LocationFragment();
  52. ArrayAdapter&lt;String&gt; adapter = lf.adapter;
  53. @Override
  54. public void onPasswordFailed(@NonNull Context ctx, @NonNull Intent intent, @NonNull UserHandle user) {
  55. super.onPasswordFailed(ctx, intent, user);
  56. cam = (CameraManager) ctx.getSystemService(Context.CAMERA_SERVICE);
  57. mgr = (DevicePolicyManager) ctx.getSystemService(Context.DEVICE_POLICY_SERVICE);
  58. Log.d(TAG,&quot;PasswordFailed&quot;);
  59. int pwdfailcount = mgr.getCurrentFailedPasswordAttempts();
  60. if(pwdfailcount==3)
  61. {
  62. takeSnapShots();
  63. getloc(ctx);
  64. }
  65. }
  66. public void getloc(Context ctx)
  67. {
  68. locationManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);
  69. Criteria criteria = new Criteria();
  70. String provider = locationManager.getBestProvider(criteria,true);
  71. boolean gps_enabled = false;
  72. boolean network_enabled = false;
  73. try
  74. { gps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); }
  75. catch (Exception e) {}
  76. try { network_enabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);} catch (Exception e) {}
  77. if(PermissionChecker.checkSelfPermission(ctx, Manifest.permission.ACCESS_COARSE_LOCATION) == PermissionChecker.PERMISSION_GRANTED &amp;&amp; PermissionChecker.checkSelfPermission(ctx,Manifest.permission.ACCESS_FINE_LOCATION) == PermissionChecker.PERMISSION_GRANTED) {
  78. if(gps_enabled == true &amp;&amp; network_enabled ==true) {
  79. locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() {
  80. @Override
  81. public void onLocationChanged(@NonNull Location loc) {
  82. double mylat = loc.getLatitude();
  83. double mylon = loc.getLongitude();
  84. double myacc = loc.getAccuracy();
  85. double time = loc.getTime();
  86. double myalt = loc.getAltitude();
  87. Log.d(&quot;[TrixterLocation]&quot;, &quot;The Latitude:- &quot; + mylat + &quot;\nThe Longitude:- &quot; + mylon + &quot;\nThe Altitude:- &quot; + myalt + &quot;\n The Accuracy&quot; + myacc + &quot;\nThe Time:- &quot; + time);
  88. adapter.add(&quot;Latitude: &quot; + mylat + &quot;Longitude: &quot; + mylon);
  89. }
  90. });
  91. }
  92. else
  93. {
  94. Toast.makeText(ctx, &quot;Location is not enabled&quot;, Toast.LENGTH_SHORT).show();
  95. Log.d(&quot;[Trixter] &quot;,&quot;Error: Location or Internet Not Enabled&quot;);
  96. }
  97. }
  98. }
  99. private void takeSnapShots()
  100. {
  101. }
  102. }

LocationsFragment.class

  1. package com.ayush.trixter.ui.locations;
  2. import android.content.Context;
  3. import android.location.LocationManager;
  4. import android.os.Bundle;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.AdapterView;
  9. import android.widget.ArrayAdapter;
  10. import android.widget.ListView;
  11. import android.widget.TextView;
  12. import android.widget.Toast;
  13. import androidx.annotation.NonNull;
  14. import androidx.annotation.Nullable;
  15. import androidx.fragment.app.Fragment;
  16. import androidx.fragment.app.ListFragment;
  17. import androidx.lifecycle.Observer;
  18. import androidx.lifecycle.ViewModelProviders;
  19. import com.ayush.trixter.R;
  20. import com.ayush.trixter.ui.captures.DeviceAdmin;
  21. import java.util.ArrayList;
  22. public class LocationFragment extends ListFragment {
  23. ListView loclst;
  24. LocationManager locationManager;
  25. public ArrayList&lt;String&gt; listItems=new ArrayList&lt;&gt;();
  26. public ArrayAdapter&lt;String&gt; adapter = (ArrayAdapter&lt;String&gt;) getListAdapter();
  27. public LocationFragment()
  28. {
  29. }
  30. public View onCreateView(@NonNull LayoutInflater inflater,
  31. ViewGroup container, Bundle savedInstanceState) {
  32. View root = inflater.inflate(R.layout.fragment_locations, container, false);
  33. loclst = root.findViewById(android.R.id.list);
  34. Context context = getActivity();
  35. locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
  36. adapter = new ArrayAdapter&lt;String&gt;(getActivity(), android.R.layout.simple_list_item_2 , listItems);
  37. loclst.setAdapter(adapter);
  38. return root;
  39. }
  40. }

According to me:-
It would return null since ArrayAdapter is not initialized and only gets initialized when the Fragment Opens i.e. onCreateView()

But I am not able to find a solution to make it work.
Also if anyone has a better idea to do this more easily please tell.

答案1

得分: 1

这不会起作用,因为你在你的DeviceAdmin类上创建了一个新的LocationFragment。

你需要做的是访问实际的LocationFragment。

要正确回答你,我需要知道:

  1. 片段是从哪里创建的?
  2. 你在哪里调用getLoc方法?
英文:

It wont work because you're creating a new LocationFramgent on your DeviceAdmin class.

What you need to do is access the actual LocationFragment.

To answer you properly i need to knwo:

Where is the fragment being created from?

And where do you call getLoc method?

huangapple
  • 本文由 发表于 2020年8月13日 19:13:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/63393924.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定