Reputation: 21
Ok, so I'm creating an application that will use current gps location (lat/long). The user will have to select a specified radius (.5-100 miles) from a Spinner
. Then, when clicked, there will be a Button
(onClickListener()
) that will populate the locations from a SQLite database, in that set radius, to a ListView
. From there, select an item from the ListView
that will call an Activity
(Intent
).
I have the ListView
populating data from the database, but I'm having issues with it populating from an onClick
event (Button
). Furthermore, if anyone can figure out how to get the current location to compare the locations listed in the database based on the set radius (from the Spinner
), and show the ones that match in the ListView
, I would REALLY appreciate that.
Thanks!
SN: I have it displaying the current location. Here's my code.
Java file
import android.content.Context;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.net.Uri;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class MetersActivity extends ActionBarActivity {
private Toolbar toolbar;
private DrawerLayout drawerLayout;
private static Button search;
private TextView myAddress;
GPSTracker gps;
//new instance of db from meter info database
MeterInfoDatabase myDb;
private Geocoder geocoder = new Geocoder(this, Locale.ENGLISH);
final MeterInfoDatabase db = new MeterInfoDatabase(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_meters);
//myDb = new MeterInfoDatabase(this);
final ListView listView = (ListView) findViewById(R.id.MeterList);
Log.d("LOG", "Before testing the database");
/*
Testing Database Part
*/
List<MeterInfoSQL> allMeters = db.getAllMeters();
ArrayList<String> ar = new ArrayList<String>();
for(MeterInfoSQL m : allMeters)
{
//Toast.makeText(getApplicationContext(), m.getMeterNumber() + " Saved", Toast.LENGTH_LONG).show();
String str = "Meter #: " + m.getMeterNumber();
ar.add(str);
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, ar);
listView.setAdapter(adapter);
toolbar= (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
myAddress = (TextView) findViewById(R.id.myaddress);
//search button click
onClickButtonListener();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_meters, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
//Used to get location via GPS when search button is tapped
public void onClickButtonListener() {
final Context context = this;
search = (Button) findViewById(R.id.MeterSearch_button);
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
gps = new GPSTracker(MetersActivity.this);
//gps coordinates
double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
if (gps.canGetLocation()) {
//Shows address
try {
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
if(addresses != null) {
Address returnedAddress = addresses.get(0);
StringBuilder strReturnedAddress = new StringBuilder("Your Current Address:\n");
for(int i=0; i<returnedAddress.getMaxAddressLineIndex(); i++) {
strReturnedAddress.append(returnedAddress.getAddressLine(i)).append("\n");
}
myAddress.setText(strReturnedAddress.toString());
} else{
myAddress.setText("No Address returned!");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
myAddress.setText("Canont get Address!");
}
}
else {
gps.showSettingsAlert();
}
//want the lisview to populate when this button is clicked
/*when i move it here I get an error at "this"
ArrayAdapter<String> adapter = new ArrayAdapter<String>
//---> here (this, android.R.layout.simple_list_item_1, ar);
listView.setAdapter(adapter); */
}
});
}
}
The XML Layout
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background"
tools:context="com.example.ataccofficial.MetersActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff8a8a90"
android:clickable="true"
tools:context="com.example.themetest.MetersActivity">
<include
android:id="@+id/app_bar"
layout="@layout/app_bar" />
<TextView
android:id="@+id/meterSelectRadiusText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@+id/app_bar"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:inputType="none"
android:text="Select Radius:"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#ffffffff"
android:textSize="25dp" />
<Spinner
android:id="@+id/meter_spinner"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/textView"
android:layout_below="@+id/meterSelectRadiusText"
android:layout_marginRight="10dp"
android:entries="@array/meter_array"
android:gravity="center"
android:spinnerMode="dialog"
android:textColor="#ffffffff" />
<TextView
android:id="@+id/textView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/meter_spinner"
android:layout_centerHorizontal="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="27dp"
android:background="#ff8a8a90"
android:text="Location:"
android:textColor="#ffffffff"
android:textSize="15sp" />
<TextView
android:id="@+id/myaddress"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:autoText="false"
android:editable="false"
android:enabled="false"
android:focusable="true"
android:textColor="@color/primaryColor"
android:textSize="15sp" />
<Button
android:id="@+id/MeterSearch_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:onClick="Search"
android:text="Search"
android:textSize="25dp"
android:typeface="normal"
android:textStyle="bold"
android:layout_below="@+id/myaddress"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Customer"
android:id="@+id/lablecrm"
android:layout_alignBottom="@+id/dailyReportDivider"
android:layout_alignParentStart="true"
android:textColor="#ffffffff" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Issue"
android:id="@+id/lableIssue"
android:layout_alignBottom="@+id/dailyReportDivider"
android:layout_centerHorizontal="true"
android:textColor="#ffffffff" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Distance"
android:id="@+id/lableDistance"
android:layout_alignBottom="@+id/dailyReportDivider"
android:layout_alignParentEnd="true"
android:textColor="#ffffffff" />
<View
android:id="@+id/dailyReportDivider"
android:layout_width="fill_parent"
android:layout_height="2dp"
android:background="@android:color/darker_gray"
android:layout_below="@+id/myaddress"
android:layout_alignParentStart="true"
android:layout_marginTop="84dp" />
<ListView
android:id="@+id/MeterList"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/dailyReportDivider"
android:layout_centerHorizontal="true"
android:choiceMode="singleChoice"
android:textColor="#ffffffff"/>
</RelativeLayout>
<fragment
android:id="@+id/fragment_navigation_drawer"
android:name="com.example.ataccofficial.NavigationDrawerFragment"
android:layout_width="250dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:layout="@layout/fragment_navigation_drawer"
tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>
String for Spinner
<string-array name="meter_array">
<item>.5 Miles</item>
<item>1 Miles</item>
<item>5 Miles</item>
<item>10 Miles</item>
<item>15 Miles</item>
<item>20 Miles</item>
<item>25 Miles</item>
<item>50 Miles</item>
<item>100 Miles</item>
</string-array>
Upvotes: 0
Views: 723
Reputation: 21
Created a method outside of the button listener for populating the listview and called it inside of the listener.
//Used to get location via GPS when search button is tapped
public void onClickButtonListener() {
final Context context = this;
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
gps = new GPSTracker(MetersActivity.this);
//gps coordinates
double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
if (gps.canGetLocation()) {
//Shows address
try {
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
if (addresses != null) {
Address returnedAddress = addresses.get(0);
StringBuilder strReturnedAddress = new StringBuilder("Your Current Address:\n");
for (int i = 0; i < returnedAddress.getMaxAddressLineIndex(); i++) {
strReturnedAddress.append(returnedAddress.getAddressLine(i)).append("\n");
}
myAddress.setText(strReturnedAddress.toString());
} else {
myAddress.setText("No Address returned!");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
myAddress.setText("Canont get Address!");
}
} else {
gps.showSettingsAlert();
}
process_data();
}
});
}
private void process_data(){
List<MeterInfoSQL> allMeters = db.getAllMeters();
ar = new ArrayList<String>();
for(MeterInfoSQL m : allMeters)
{
//Toast.makeText(getApplicationContext(), m.getMeterNumber() + " Saved", Toast.LENGTH_LONG).show();
String str = "Meter #: " + m.getMeterNumber() + " Contact " + m.getAccountNumber();
ar.add(str);
}
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, ar);
listView.setAdapter(adapter);
doPopulate();
}
private void doPopulate() {
adapter.notifyDataSetChanged();
}
Upvotes: 1
Reputation: 11497
Create another method to handle your task. Inside your onClick()
the this
statement doesn't refer to the Activity
, that's why it's throwing an error.
First of all, try to declare your ArrayAdapter
, your ListView
and your ArrayList<String>
as globals. That can make your work easier to do.
private ArrayAdapter <String> adapter;
private ListView listView;
private ArrayList<String> ar = new ArrayList<String>();
Then, on your onCreate()
method change the lines
final ListView listView = (ListView) findViewById(R.id.MeterList);
// ...
ArrayList<String> ar = new ArrayList<String>();
// ...
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, ar);
to
listView = (ListView) findViewById(R.id.MeterList);
// ...
ar = new ArrayList<String>();
// ...
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, ar);
Later on your onClickListener()
.
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// Your code.
// Change your "ar" Array here, and later call the following method.
doPopulate();
}});
private void doPopulate() {
adapter.notifyDataSetChanged();
}
I guess you could simply call the notifyDataSetChanged()
from within the onClick()
, but I coudn't test this code now. Tell me later if it worked.
You can read more about this here.
Upvotes: 0