0

I have a SearchActivity that I build in accordance to http://developer.android.com/guide/topics/search/search-dialog.html. After getting my data from a local content provider, I am using a basic CursorAdapter to display it in a ListView. So far everything works fine. Then in the listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {}); I setup to return a result to the calling activity and then call finish().

But what is happening is that finish() keeps clearing the adapter instead of finishing the Activity. I try different flavors of finish and onBackPressed but no difference: it clears the ListView but remains in the activity. Can anyone see what I am doing wrong?

public class SearchableActivity extends AppCompatActivity {
    private static final String TAG = SearchableActivity.class.getSimpleName();
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

        SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
        SearchView searchView = (SearchView) toolbar.findViewById(R.id.search_view);
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default

        searchView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onSearchRequested();
            }
        });
        toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);

        listView = (ListView) findViewById(R.id.search_result_list);
        Intent intent = getIntent();
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            PLog.d(TAG, "ACTION_SEARCH intent");
            String query = intent.getStringExtra(SearchManager.QUERY);
            searchContentProvider(query);
        }
    }

    private void searchContentProvider(String query) {
        PLog.d(TAG, "start searchContentProvider");
        Uri uri = PContract.SearchableEntry.buildUri(query);
        Cursor cursor = getContentResolver().query(uri, DataProjection.Searchable.PROJ, null, null, null);
        if (null == cursor || 0 == cursor.getCount()) {
            PLog.d(TAG, "end searchContentProvider without result");
            return;
        }
        cursor.moveToFirst();
        searchableResultsList(cursor);
        PLog.d(TAG, "end searchContentProvider");
    }

    private void searchableResultsList(Cursor data) {
        PLog.d(TAG, "end searchableResultsList");
        CursorAdapter cursorAdapter = (CursorAdapter) listView.getAdapter();
        if (null == cursorAdapter) {
            cursorAdapter = new CursorAdapter(this, data, true) {
                @Override
                public View newView(Context context, Cursor cursor, ViewGroup parent) {
                    return getLayoutInflater().inflate(R.layout.searchable_row,parent,false);
                }

                @Override
                public void bindView(View view, Context context, Cursor cursor) {
                    TextView pName = (TextView) view.findViewById(R.id.p_name);
                    TextView catlang = (TextView) view.findViewById(R.id.catlang);
                    pName.setText(cursor.getString(DataProjection.Searchable.COL_NAME));
                    String lang = cursor.getString(DataProjection.Searchable.COL_LANG);
                    String cat = cursor.getString(DataProjection.Searchable.COL_CAT);
                    catlang.setText(cat + ", " + lang);

                }
            };
            listView.setAdapter(cursorAdapter);
        } else {
            cursorAdapter.swapCursor(data);
        }
        PLog.d(TAG, "searchable: cursor count is?  " + data.getCount());

        final CursorAdapter cursorAdapterFinal = cursorAdapter;
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Cursor cursor = cursorAdapterFinal.getCursor();
                cursor.moveToPosition(position);

                Intent data = new Intent();
                data.putExtra(Constants.ARGS_P_DB_ID, cursor.getString(DataProjection.Searchable.COL_P_ID));
                if (getParent() == null) {
                    setResult(RESULT_OK, data);
                } else {
                    getParent().setResult(RESULT_OK, data);
                }
                PLog.d(TAG, "onItemClick POSITION %s", position);
                finish();//I try different things here
            }
        });
        PLog.d(TAG, "end searchableResultsList");
    }
}
Katedral Pillon
  • 14,534
  • 25
  • 99
  • 199

3 Answers3

0

if this code is inside a dialog, to finish the activity call:

getActivity().finish();
Oleg Khalidov
  • 5,108
  • 1
  • 28
  • 29
0

I facing a same problem. write return(); after finish(); solved my problem.

But why?: According to this answer

The method that called finish() will run to completion. The finish() operation will not even begin until you return control to Android.

Community
  • 1
  • 1
mazinani
  • 21
  • 5
-1

try SearchActivity.this.finish();

Pratik
  • 456
  • 4
  • 18