-1

I'm trying to implement search in my app, and activity crashes when I click on search icon. The error is: https://i.stack.imgur.com/wIZCO.png Here is the code of Activity:

public class SearchActivity extends AppCompatActivity implements OnItemClickListener, AdapterView.OnItemClickListener {
DBHelper dbHelper;
SQLiteDatabase database;
ArrayList<Reminder> ReminderList = new ArrayList<>();
ListView listView;
MaterialSearchView searchView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);
    Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setTitle("Material search");
    toolbar.setTitleTextColor(Color.parseColor("#FFFFFF"));


    dbHelper = new DBHelper(this);
    database = dbHelper.getWritableDatabase();
    //listView = (ListView) findViewById(R.id.ListOfReminders);
    listView = (ListView)findViewById(R.id.ListOfReminders);

    Cursor cursor = database.query(TABLE_REMINDERS, null, null, null, null, null, null);
    if (cursor.moveToFirst()) {

        do {
            int idIndex = cursor.getInt(cursor.getColumnIndex(DBHelper.KEY_ID));
            String nameIndex = cursor.getString(cursor.getColumnIndex(KEY_NAME));
            String hourIndex = cursor.getString(cursor.getColumnIndex(DBHelper.KEY_HOUR));
            String dateIndex = cursor.getString(cursor.getColumnIndex(DBHelper.KEY_DATE));
            String name = nameIndex;
            String hour = hourIndex;
            String date = dateIndex;

            ReminderList.add(new Reminder(idIndex, name, hour, date));
            ReminderListAdapter2 adapter = new ReminderListAdapter2(this, R.layout.reminder_view2, ReminderList);
            adapter.setListener(this);
            listView.setAdapter(adapter);

        } while (cursor.moveToNext());
    } else
        Log.d("mLog", "0 rows in db");


    searchView = (MaterialSearchView)findViewById(R.id.search_view);
    searchView.setOnSearchViewListener(new MaterialSearchView.SearchViewListener() {
        @Override
        public void onSearchViewShown() {

        }

        @Override
        public void onSearchViewClosed() {
            listView = (ListView)findViewById(R.id.ListOfReminders);
            ReminderListAdapter2 adapter = new ReminderListAdapter2(SearchActivity.this, android.R.layout.simple_list_item_1,ReminderList);
            listView.setAdapter(adapter);

        }
    }); searchView.setOnQueryTextListener(new MaterialSearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}

@Override
public boolean onQueryTextChange(String newText) {
    if(newText != null && !newText.isEmpty()){
        ArrayList<Reminder> lstFound = new ArrayList<>();
        for(Reminder item:ReminderList){
            if(item.getName().contains(newText))
                lstFound.add(new Reminder(item.getId(), item.getName(), item.getHour(), item.getDate()));
        }
        ReminderListAdapter2 adapter = new ReminderListAdapter2(SearchActivity.this,android.R.layout.simple_list_item_1,lstFound);
        listView.setAdapter(adapter);
    } else {
        ReminderListAdapter2 adapter = new ReminderListAdapter2(SearchActivity.this,android.R.layout.simple_list_item_1,ReminderList);
        listView.setAdapter(adapter);
    }
    return true;
}});


public boolean onCreateOptionsMenu(Menu menu){
    getMenuInflater().inflate(R.menu.menu_item,menu);
    MenuItem item = menu.findItem(R.id.action_search);
    searchView.setMenuItem(item);
    return true;
}



@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

}


@Override
public void OnItemClick(View view, int position, int id, String name, String date, String hour) {

}}

Code of adapter:

public class ReminderListAdapter2 extends ArrayAdapter<Reminder> {
private Context mContext;
private int mResource;
OnItemClickListener listener;

public ReminderListAdapter2(@NonNull Context context, int resource, @NonNull ArrayList<Reminder> objects) {
    super(context, resource, objects);
    mContext = context;
    mResource = resource;

}

public void setListener(OnItemClickListener listener) {
    this.listener = listener;
}

@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    final int id = getItem(position).getId();
    final String name = getItem(position).getName();
    final String hour = getItem(position).getHour();
    final String date = getItem(position).getDate();


    LayoutInflater inflater = LayoutInflater.from(mContext);
    convertView = inflater.inflate(mResource, parent, false);
    final TextView resId = convertView.findViewById(R.id.textId);
    final TextView resName = convertView.findViewById(R.id.textName);
    final TextView resHour = convertView.findViewById(R.id.textHour);
    final TextView resDate = convertView.findViewById(R.id.textDate);

    resId.setText(String.valueOf(id));
    resName.setText(name);
    resHour.setText(hour);
    resDate.setText(date);

    return convertView;
}}

Why object reference is null? Sorry if it is a stupid error, it's first app.

I tried to change lstFound.add(new Reminder(item.getId(), item.getName(), item.getHour(), item.getDate())); with lstFound.add(this);, but it is also null reference.

Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
Ion Crismaru
  • 31
  • 1
  • 6
  • Can you please update post with reminder_view2 layout xml? – Geo Oct 20 '19 at 12:10
  • Thanks a lot. The problem was in `ReminderListAdapter2 adapter = new ReminderListAdapter2(SearchActivity.this, android.R.layout.simple_list_item_1,ReminderList)` Instead of `android.R.layout.simple_list_item_1` , I need to put `R.layout.reminderview2` Very simple bug :/ – Ion Crismaru Oct 20 '19 at 12:13

2 Answers2

0

Closed.

The error was in ReminderListAdapter2 adapter = new ReminderListAdapter2(SearchActivity.this, android.R.layout.simple_list_item_1,ReminderList);

androidR.layout.simple_list_item_1 need to be changed to R.layout.reminderview2

Ion Crismaru
  • 31
  • 1
  • 6
0

According to documentation:

To display a more custom view for each item in your dataset, implement a ListAdapter. For example, extend BaseAdapter and create and configure the view for each data item in

If so the first argument of layout inflater method should be layout instead of int

e.g convertView = getLayoutInflater().inflate(R.layout.list_item, container, false);

In your case you are trying to inflate int instead of layout

convertView = inflater.inflate(mResource, parent, false);

eli
  • 8,571
  • 4
  • 30
  • 40