我正在使用融合位置 API 在回收视图适配器中查找当前位置,适配器由片段类使用

Posted

技术标签:

【中文标题】我正在使用融合位置 API 在回收视图适配器中查找当前位置,适配器由片段类使用【英文标题】:I am using fused location API to find current location in recycle view adapter, adapter is used by a fragment class 【发布时间】:2016-05-23 05:27:58 【问题描述】:

我正在那里制作一个项目,我正在使用融合位置 API 在回收视图适配器中查找当前位置。 适配器由片段类使用,我想知道如何在适配器卡视图中访问我的融合位置活动类 lang 和 lat。 我搜索了很多,但我没有找到任何合适的答案,我是 android 新手,请帮忙 这是我的tasklistadapter 类或回收视图适配器

public class TaskListAdapter extends RecyclerView.Adapter<TaskListAdapter.ViewHolder> 
    String setdata;

LocationActivity mlocationAct;
    Context mContext;

    private class User 
        public String name;
        public String party;
        public String city;
        public String country;
        public String identity;
        public int image;
        public int imagePrty;

        public User(int image, int imageParty, String name, String city, String party, String country,String identity) 
            this.image = image;
            this.imagePrty = imageParty;
            this.identity = identity;
            this.name = name;
            this.city = city;
            this.party = party;
            this.country = country;
        
    
    private ArrayList<User> mRecyclerData;
    public TaskListAdapter(Context mContext) 
        mRecyclerData = new ArrayList<>();
        mContext = mContext.getApplicationContext();
       mlocationAct = new LocationActivity(mContext);

// 虚拟数据

    mRecyclerData.add(new User(R.drawable.mp,R.drawable.bjplogo,"D. V. Sadananda Gowda", "MP", "Bjp", "India","MP"));
    mRecyclerData.add(new User(R.drawable.mla,R.drawable.congresslogo,"Akhanda Srinivas Murthy R", "MLA", "Congres", "India","MLA"));

@Override
public void onBindViewHolder(final ViewHolder holder, final int i) 
    final Context context = holder.titleView.getContext();
    User user = mRecyclerData.get(i);
    holder.titleView.setText(user.name);

//这里我想显示一个来自我的融合位置活动类的数据。

holder.tvState.setText(mlocationAct.getStateName(context));
        @Override
        public int getItemCount() 
            return (mRecyclerData != null) ? mRecyclerData.size() : 0;
        

    static class ViewHolder extends RecyclerView.ViewHolder 
        RadioGroup radioGroup;
        CardView cardView;
        String setdata;
        TextView titleView, tvConnect, cityView, countryView, partyView, tvResult,tvAdd,tvState,idProfsn;

        ImageView imageView,imagelgo ;

        public ViewHolder(CardView card) 
            super(card);
            cardView = card;
            titleView = (TextView) card.findViewById(R.id.tvName);
            imageView = (ImageView) card.findViewById(R.id.image);
            cityView = (TextView) card.findViewById(R.id.tvCity);
            countryView = (TextView) card.findViewById(R.id.tvCountry);
            partyView = (TextView) card.findViewById(R.id.tvParty);
            tvConnect = (TextView) card.findViewById(R.id.tvConnect);
            radioGroup = (RadioGroup) card.findViewById(R.id.radioG);
            tvResult = (TextView) card.findViewById(R.id.tvResult);
            tvAdd=(TextView)card.findViewById(R.id.tvAdd);
            tvState=(TextView)card.findViewById(R.id.tvState);
            idProfsn=(TextView)card.findViewById(R.id.tvId);
            imagelgo=(ImageView)card.findViewById(R.id.imageLogo);
        
    
 

这是我使用这个适配器的片段类

public class FragmentA extends Fragment  

    private static final String TAG = "LocationActivity";
    private static final long INTERVAL = 1000 * 10;
    private static final long FASTEST_INTERVAL = 1000 * 5;
    Button btnFusedLocation;
    TextView tvLocation;

    GoogleApiClient mGoogleApiClient;

    String mLastUpdateTime;
    RecyclerView recyclerView;
    TaskListAdapter taskListAdapter;
    Context mContext;
    private List<Data> mData = new ArrayList<>();

    public FragmentA() 
        // Required empty public constructor
    
    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        mContext = getActivity();
        taskListAdapter = new TaskListAdapter(mContext);
 LocationActivity locationActivity = new LocationActivity(mContext);
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
        // Inflate the layout for this fragment
        final View v = inflater.inflate(R.layout.fragment_a, container, false);
        recyclerView = (RecyclerView) v.findViewById(R.id.recycler);
        recyclerView.setAdapter(taskListAdapter);
        recyclerView.setHasFixedSize(true);
        final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(linearLayoutManager);

        return v;
    
  

最后这是我的融合定位活动类

public class LocationActivity extends Activity implements LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener

    double latitude;
    double longitude;
    private static final String TAG = "LocationActivity";
    private static final long INTERVAL = 1000 * 10;
    private static final long FASTEST_INTERVAL = 1000 * 5;
    Button btnFusedLocation;
    TextView tvLocation;
    LocationRequest mLocationRequest;
    GoogleApiClient mGoogleApiClient;
    Location mCurrentLocation;
    String mLastUpdateTime;
    String lat;
    Context mContext;
    public LocationActivity(Context mContext) 
        this.mContext = mContext;
        updateUI();
    

    protected void createLocationRequest() 
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(INTERVAL);
        mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate ...............................");
        //show error dialog if GoolglePlayServices not available
        if (!isGooglePlayServicesAvailable()) 
            finish();
        
        createLocationRequest();
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        setContentView(R.layout.activity_main);
       // tvLocation = (TextView) findViewById(R.id.tvLocation);

      //  btnFusedLocation = (Button) findViewById(R.id.btnShowLocation);
        btnFusedLocation.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View arg0) 
                updateUI();
            
        );
    
    @Override
    public void onStart() 
        super.onStart();
        Log.d(TAG, "onStart fired ..............");
        mGoogleApiClient.connect();
    
    @Override
    public void onStop() 
        super.onStop();
        Log.d(TAG, "onStop fired ..............");
        mGoogleApiClient.disconnect();
        Log.d(TAG, "isConnected ...............: " + mGoogleApiClient.isConnected());
    
    private boolean isGooglePlayServicesAvailable() 
        int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (ConnectionResult.SUCCESS == status) 
            return true;
         else 
            GooglePlayServicesUtil.getErrorDialog(status, this, 0).show();
            return false;
        
    
    @Override
    public void onConnected(Bundle bundle) 
        Log.d(TAG, "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected());
        startLocationUpdates();
    
    protected void startLocationUpdates() 
        PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(
                mGoogleApiClient, mLocationRequest, this);
        Log.d(TAG, "Location update started ..............: ");
    
    @Override
    public void onConnectionSuspended(int i) 

    

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) 
        Log.d(TAG, "Connection failed: " + connectionResult.toString());
    
    @Override
    public void onLocationChanged(Location location) 
        Log.d(TAG, "Firing onLocationChanged..............................................");
        mCurrentLocation = location;
        mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
        updateUI();
    
    private void updateUI() 
        Log.d(TAG, "UI update initiated .............");
        if (null != mCurrentLocation) 
            latitude = mCurrentLocation.getLatitude();
            longitude = mCurrentLocation.getLongitude();
            tvLocation.setText("At Time: " + mLastUpdateTime + "\n" +
                    "Latitude: " + latitude + "\n" +
                    "Longitude: " + longitude+ "\n" +
                    "Accuracy: " + mCurrentLocation.getAccuracy() + "\n" +
                    "Provider: " + mCurrentLocation.getProvider());
         else 
            Log.d(TAG, "location is null ...............");
        
    
    public List<Address> getGeocoderAddress(Context context)
    
        if (mCurrentLocation != null)
        
            Geocoder geocoder = new Geocoder(context, Locale.ENGLISH);
            try
            
                List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
                return addresses;
            
            catch (IOException e)
            
                //e.printStackTrace();
                Log.e("Error : Geocoder", "Impossible to connect to Geocoder", e);
            
        
        return null;
    
    public String getStateName(Context context) 

        List<Address> addresses = getGeocoderAddress(context);
        if (addresses != null && addresses.size() > 0) 

            Address address = addresses.get(0);
            String state = address.getAdminArea();

            return state;
         else 
            return null;

        
    
    public double getLatitude() 
        if(mCurrentLocation != null) 
            latitude = mCurrentLocation.getLatitude();
        
        return latitude;
    
    public  double getLongitude()
        if(mCurrentLocation !=null)
            longitude = mCurrentLocation.getLongitude();
        
            return longitude;
    
    @Override
    protected void onPause() 
        super.onPause();
        stopLocationUpdates();
    
    protected void stopLocationUpdates() 
        LocationServices.FusedLocationApi.removeLocationUpdates(
                mGoogleApiClient, this);
        Log.d(TAG, "Location update stopped .......................");
    
    @Override
    public void onResume() 
        super.onResume();
        if (mGoogleApiClient.isConnected()) 
            startLocationUpdates();
            Log.d(TAG, "Location update resumed .....................");
        
    

【问题讨论】:

【参考方案1】:

如果您需要 ViewHolder 中的 Activity 实例,请在此处执行: 在片段中: TaskListAdapter(Fragment fragment)上的TaskListAdapter(mContext)变化

在任务列表适配器中: public void TaskListAdapter(Fragment fragment) mActivity = (LocationActivity) fragment.getActivity();

重写方法onCreate ViewHolder,像这样 @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.your_layout, viewGroup, false); rerurn new ViewHolder(view, mActivity);

查看 ViewHolder 更改: 公共 ViewHolder(CardView 卡) on public ViewHolder(CardView 卡片,LocationActivity 活动)

【讨论】:

以上是关于我正在使用融合位置 API 在回收视图适配器中查找当前位置,适配器由片段类使用的主要内容,如果未能解决你的问题,请参考以下文章

如何从其适配器中更改回收视图的项目位置?

如何通过匹配来自两个 API 的 id 来查看来自两个 JSON API 的响应到单个回收器视图适配器中?

如何在回收器视图适配器中获取上下文

计算融合表中点之间的距离

水平回收视图中的图像会绕过

如何从融合位置 api 中获取卫星数量?