I've doing search for my app, but now I have a strange problem. By typing letters into search view all works, but when I submit search, it brings to relaunching MainActivity.class and then, when I choose some film, project stops to working. I don't know, what happens. I'm begier and it's my first android app. My code:
AndroidManifeest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="pl.rzeszow.wsiz.project">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:largeHeap="true">
<activity android:name=".LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SignupActivity" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<activity android:name=".FilmActivity" />
<activity android:name=".UserRatesActivity"></activity>
</application>
</manifest>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="pl.rzeszow.wsiz.project.MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Logout"
android:id="@+id/button_logout"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="My Rates"
android:id="@+id/button_rates"
android:layout_alignBottom="@+id/button_logout"
android:layout_toLeftOf="@+id/button_logout"/>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:layout_below="@+id/button_logout"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
/>
</RelativeLayout>
options_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/search"
android:title="@string/app_name"
android:hint="Search"
android:icon="@drawable/search"
app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>
in DatabaseAdapter.java
public List<Film> getAllFilms() {
List<Film> films = new ArrayList<Film>();
String selectQuery = "SELECT * FROM " + TABLE_FILMS;
Log.e("myLog", selectQuery);
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor c = db.rawQuery(selectQuery, null);
if (c.moveToFirst()) {
do {
Film film = new Film();
film.setId(c.getInt((c.getColumnIndex(KEY_FILMS_ID))));
film.setName((c.getString(c.getColumnIndex(KEY_FILMS_NAME))));
film.setYear(c.getInt(c.getColumnIndex(KEY_FILMS_YEAR)));
film.setCountries((c.getString(c.getColumnIndex(KEY_FILMS_COUNTRIES))));
film.setDescription((c.getString(c.getColumnIndex(KEY_FILMS_DESCRIPTION))));
film.setImage(c.getBlob(c.getColumnIndex(KEY_FILMS_IMAGE)));
films.add(film);
} while (c.moveToNext());
}
retu films;
}
public List<Film> getFilmsByKeyword(String search) {
List<Film> films = new ArrayList<Film>();
SQLiteDatabase db = dbHelper.getReadableDatabase();
String selectQuery = "SELECT * FROM " + TABLE_FILMS
+ " WHERE " + KEY_FILMS_NAME
+ " LIKE '%" + search + "%' ";
Cursor c = db.rawQuery(selectQuery, null);
if (c.moveToFirst()) {
do {
Film film = new Film();
film.setId(c.getInt((c.getColumnIndex(KEY_FILMS_ID))));
film.setName((c.getString(c.getColumnIndex(KEY_FILMS_NAME))));
film.setYear(c.getInt(c.getColumnIndex(KEY_FILMS_YEAR)));
film.setCountries((c.getString(c.getColumnIndex(KEY_FILMS_COUNTRIES))));
film.setDescription((c.getString(c.getColumnIndex(KEY_FILMS_DESCRIPTION))));
film.setImage(c.getBlob(c.getColumnIndex(KEY_FILMS_IMAGE)));
films.add(film);
} while (c.moveToNext());
}
retu films;
}
MainActivity.java
public class MainActivity extends AppCompatActivity{
Button buttonLogout;
Button buttonRates;
DatabaseAdapter databaseAdapter;
private List<Film> FilmsList;
private ListView filmsList;
private ListViewAdapter adapter = null;
private SearchView search;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
databaseAdapter = new DatabaseAdapter(this);
databaseAdapter = databaseAdapter.open();
buttonLogout = (Button) findViewById(R.id.button_logout);
buttonRates = (Button) findViewById(R.id.button_rates);
filmsList = (ListView) findViewById(R.id.listView);
Bitmap bmp1 = BitmapFactory.decodeResource(getResources(), R.drawable.hp);
Bitmap bmp2 = BitmapFactory.decodeResource(getResources(), R.drawable.inc);
Bitmap bmp3 = BitmapFactory.decodeResource(getResources(), R.drawable.faf);
byte[] image1 = DbBitmapUtility.getBytes(bmp1);
byte[] image2 = DbBitmapUtility.getBytes(bmp2);
byte[] image3 = DbBitmapUtility.getBytes(bmp3);
Film film1 = new Film("Inception", 2010, "USA, Great Britain", "Inception film", image2);
Film film2 = new Film("Harry Potter", 2001, "Great Britain, USA", "Harry Potter film", image1);
Film film3 = new Film("The Fast and the Furious", 2001, "USA, Germany", "The Fast and the Furious film", image3);
databaseAdapter.deleteAllFilms();
databaseAdapter.deleteAllRates();
databaseAdapter.createFilm(film1);
databaseAdapter.createFilm(film2);
databaseAdapter.createFilm(film3);
Intent intent = getIntent();
final User user = (User)intent.getSerializableExtra("User");
FilmsList = databaseAdapter.getAllFilms();
for (Film film : FilmsList) {
Log.d("Film", film.getName());
Log.d("Film", String.valueOf(film.getYear()));
}
adapter = new ListViewAdapter();
filmsList.setAdapter(adapter);
filmsList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Film film = FilmsList.get(position);
Intent intent = new Intent(getApplicationContext(),FilmActivity.class);
intent.putExtra("Film", film);
intent.putExtra("User", user);
startActivity(intent);
}
});
buttonLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(),LoginActivity.class);
startActivity(intent);
}
});
buttonRates.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(),UserRatesActivity.class);
intent.putExtra("User", user);
startActivity(intent);
}
});
}
private class ListViewAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public ListViewAdapter() {
mInflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
retu FilmsList.size();
}
@Override
public Film getItem(int position) {
retu FilmsList.get(position);
}
@Override
public long getItemId(int position) {
retu position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
final Film film = getItem(position);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.film_item, parent, false);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.film_name);
holder.year = (TextView) convertView.findViewById(R.id.film_year);
holder.image = (ImageView) convertView.findViewById(R.id.imageView);
convertView.setTag(holder);
}
byte[] image = film.getImage();
Bitmap bitmap = DbBitmapUtility.getImage(image);
holder = (ViewHolder) convertView.getTag();
holder.name.setText(film.getName());
holder.year.setText(String.valueOf(film.getYear()));
holder.image.setImageBitmap(bitmap);
retu convertView;
}
private class ViewHolder {
TextView name;
TextView year;
ImageView image;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.options_menu, menu);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
final SearchView search = (SearchView) menu.findItem(R.id.search).getActionView();
search.setSearchableInfo(manager.getSearchableInfo(getComponentName()));
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
search.clearFocus();
Log.d("myLog", "onQueryTextSubmit ");
FilmsList.clear();
FilmsList = databaseAdapter.getFilmsByKeyword(s);
filmsList.setAdapter(adapter);
for (Film film : FilmsList) {
Log.d("Film", film.getName());
Log.d("Film", String.valueOf(film.getYear()));
}
retu false;
}
@Override
public boolean onQueryTextChange(String s) {
Log.d("myLog", "onQueryTextChange ");
FilmsList.clear();
FilmsList = databaseAdapter.getFilmsByKeyword(s);
filmsList.setAdapter(adapter);
for (Film film : FilmsList) {
Log.d("Film", film.getName());
Log.d("Film", String.valueOf(film.getYear()));
}
retu false;
}
});
}
retu true;
}
@Override
protected void onDestroy() {
super.onDestroy();
// Close The Database
databaseAdapter.close();
}
}
Thank you for help!
