以下是一个简单的旅游景点介绍应用程序的完整版代码。请注意,这个应用程序只是一个示例,你可以根据自己的需要进行修改和扩展。
1. MainActivity.java
```java
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private List<TouristAttraction> mTouristAttractions;
private TouristAttractionDBHelper mDBHelper;
private MenuItem mSearchItem;
private SearchView mSearchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
mDBHelper = new TouristAttractionDBHelper(this);
mTouristAttractions = mDBHelper.getAllTouristAttractions();
mAdapter = new TouristAttractionAdapter(mTouristAttractions);
mRecyclerView.setAdapter(mAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
mSearchItem = menu.findItem(R.id.action_search);
mSearchView = (SearchView) mSearchItem.getActionView();
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mAdapter.getFilter().filter(newText);
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
```
2. TouristAttraction.java
```java
public class TouristAttraction {
private int mId;
private String mName;
private String mDescription;
private double mLatitude;
private double mLongitude;
private int mImageResourceId;
public TouristAttraction(int id, String name, String description, double latitude, double longitude, int imageResourceId) {
mId = id;
mName = name;
mDescription = description;
mLatitude = latitude;
mLongitude = longitude;
mImageResourceId = imageResourceId;
}
public int getId() {
return mId;
}
public void setId(int id) {
mId = id;
}
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getDescription() {
return mDescription;
}
public void setDescription(String description) {
mDescription = description;
}
public double getLatitude() {
return mLatitude;
}
public void setLatitude(double latitude) {
mLatitude = latitude;
}
public double getLongitude() {
return mLongitude;
}
public void setLongitude(double longitude) {
mLongitude = longitude;
}
public int getImageResourceId() {
return mImageResourceId;
}
public void setImageResourceId(int imageResourceId) {
mImageResourceId = imageResourceId;
}
}
```
3. TouristAttractionAdapter.java
```java
public class TouristAttractionAdapter extends RecyclerView.Adapter<TouristAttractionAdapter.TouristAttractionViewHolder> implements Filterable {
private List<TouristAttraction> mTouristAttractions;
private List<TouristAttraction> mTouristAttractionsFiltered;
public static class TouristAttractionViewHolder extends RecyclerView.ViewHolder {
public CardView mCardView;
public TextView mNameTextView;
public TextView mDescriptionTextView;
public ImageView mImageView;
public TouristAttractionViewHolder(View itemView) {
super(itemView);
mCardView = itemView.findViewById(R.id.card_view);
mNameTextView = itemView.findViewById(R.id.name_text_view);
mDescriptionTextView = itemView.findViewById(R.id.description_text_view);
mImageView = itemView.findViewById(R.id.image_view);
}
}
public TouristAttractionAdapter(List<TouristAttraction> touristAttractions) {
mTouristAttractions = touristAttractions;
mTouristAttractionsFiltered = touristAttractions;
}
@Override
public TouristAttractionViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view_layout, parent, false);
TouristAttractionViewHolder vh = new TouristAttractionViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(TouristAttractionViewHolder holder, int position) {
final TouristAttraction touristAttraction = mTouristAttractionsFiltered.get(position);
holder.mNameTextView.setText(touristAttraction.getName());
holder.mDescriptionTextView.setText(touristAttraction.getDescription());
holder.mImageView.setImageResource(touristAttraction.getImageResourceId());
holder.mCardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(v.getContext(), TouristAttractionActivity.class);
intent.putExtra("id", touristAttraction.getId());
v.getContext().startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return mTouristAttractionsFiltered.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
final List<TouristAttraction> list = mTouristAttractions;
int count = list.size();
final ArrayList<TouristAttraction> nlist = new ArrayList<>(count);
TouristAttraction filterableTouristAttraction;
for (int i = 0; i < count; i++) {
filterableTouristAttraction = list.get(i);
if (filterableTouristAttraction.getName().toLowerCase().contains(filterString)) {
nlist.add(filterableTouristAttraction);
}
}
results.values = nlist;
results.count = nlist.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mTouristAttractionsFiltered = (ArrayList<TouristAttraction>) results.values;
notifyDataSetChanged();
}
};
}
}
```
4. TouristAttractionDBHelper.java
```java
public class TouristAttractionDBHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "TouristAttractionDB";
private static final String TABLE_NAME = "TouristAttractions";
private static final String COLUMN_ID = "_id";
private static final String COLUMN_NAME = "name";
private static final String COLUMN_DESCRIPTION = "description";
private static final String COLUMN_LATITUDE = "latitude";
private static final String COLUMN_LONGITUDE = "longitude";
private static final String COLUMN_IMAGE_RESOURCE_ID = "image_resource_id";
private static final String CREATE_TABLE =
"CREATE TABLE " + TABLE_NAME + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT, " +
COLUMN_DESCRIPTION + " TEXT, " +
COLUMN_LATITUDE + " REAL, " +
COLUMN_LONGITUDE + " REAL, " +
COLUMN_IMAGE_RESOURCE_ID + " INTEGER)";
private static final String DROP_TABLE =
"DROP TABLE IF EXISTS " + TABLE_NAME;
private Context mContext;
public TouristAttractionDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE);
Resources res = mContext.getResources();
String[] names = res.getStringArray(R.array.tourist_attraction_names);
String[] descriptions = res.getStringArray(R.array.tourist_attraction_descriptions);
double[] latitudes = res.getFloatArray(R.array.tourist_attraction_latitudes);
double[] longitudes = res.getFloatArray(R.array.tourist_attraction_longitudes);
TypedArray imageResourceIds = res.obtainTypedArray(R.array.tourist_attraction_image_resource_ids);
ContentValues contentValues = new ContentValues();
for (int i = 0; i < names.length; i++) {
contentValues.put(COLUMN_NAME, names[i]);
contentValues.put(COLUMN_DESCRIPTION, descriptions[i]);
contentValues.put(COLUMN_LATITUDE, latitudes[i]);
contentValues.put(COLUMN_LONGITUDE, longitudes[i]);
contentValues.put(COLUMN_IMAGE_RESOURCE_ID, imageResourceIds.getResourceId(i, -1));
db.insert(TABLE_NAME, null, contentValues);
}
imageResourceIds.recycle();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(DROP_TABLE);
onCreate(db);
}
public List<TouristAttraction> getAllTouristAttractions() {
List<TouristAttraction> touristAttractions = new ArrayList<>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
int id = cursor.getInt(cursor.getColumnIndex(COLUMN_ID));
String name = cursor.getString(cursor.getColumnIndex(COLUMN_NAME));
String description = cursor.getString(cursor.getColumnIndex(COLUMN_DESCRIPTION));
double latitude = cursor.getDouble(cursor.getColumnIndex(COLUMN_LATITUDE));
double longitude = cursor.getDouble(cursor.getColumnIndex(COLUMN_LONGITUDE));
int imageResourceId = cursor.getInt(cursor.getColumnIndex(COLUMN_IMAGE_RESOURCE_ID));
touristAttractions.add(new TouristAttraction(id, name, description, latitude, longitude, imageResourceId));
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return touristAttractions;
}
public TouristAttraction getTouristAttractionById(int id) {
TouristAttraction touristAttraction = null;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, null, COLUMN_ID + " = ?", new String[]{String.valueOf(id)}, null, null, null);
if (cursor.moveToFirst()) {
String name = cursor.getString(cursor.getColumnIndex(COLUMN_NAME));
String description = cursor.getString(cursor.getColumnIndex(COLUMN_DESCRIPTION));
double latitude = cursor.getDouble(cursor.getColumnIndex(COLUMN_LATITUDE));
double longitude = cursor.getDouble(cursor.getColumnIndex(COLUMN_LONGITUDE));
int imageResourceId = cursor.getInt(cursor.getColumnIndex(COLUMN_IMAGE_RESOURCE_ID));
touristAttraction = new TouristAttraction(id, name, description, latitude, longitude, imageResourceId);
}
cursor.close();
db.close();
return touristAttraction;
}
}
```
5. TouristAttractionActivity.java
```java
public class TouristAttractionActivity extends AppCompatActivity {
private TouristAttractionDBHelper mDBHelper;
private TouristAttraction mTouristAttraction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tourist_attraction);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
int id = getIntent().getIntExtra("id", -1);
mDBHelper = new TouristAttractionDBHelper(this);
mTouristAttraction = mDBHelper.getTouristAttractionById(id);
ImageView imageView = findViewById(R.id.image_view);
TextView nameTextView = findViewById(R.id.name_text_view);
TextView descriptionTextView = findViewById(R.id.description_text_view);
imageView.setImageResource(mTouristAttraction.getImageResourceId());
nameTextView.setText(mTouristAttraction.getName());
descriptionTextView.setText(mTouristAttraction.getDescription());
MapView mapView = findViewById(R.id.map_view);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
LatLng location = new LatLng(mTouristAttraction.getLatitude(), mTouristAttraction.getLongitude());
googleMap.addMarker(new MarkerOptions().position(location).title(mTouristAttraction.getName()));
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 16));
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onResume() {
super.onResume();
MapView mapView = findViewById(R.id.map_view);
mapView.onResume();
}
@Override
public void onPause() {
super.onPause();
MapView mapView = findViewById(R.id.map_view);
mapView.onPause();
}
@Override
public void