0

我有一個SearchActivity,我根據http://developer.android.com/guide/topics/search/search-dialog.html構建。從本地內容提供者獲取數據後,我使用基本的CursorAdapter將其顯示在ListView中。到目前爲止一切正常。然後在listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {});我設置將結果返回給主叫活動,然後致電finish()在SearchActivity調用完成不起作用

但是,發生的事情是,finish()繼續清除適配器,而不是完成活動。我嘗試不同的口味和onBackPressed,但沒有區別:它清除ListView,但仍然在活動中。任何人都可以看到我做錯了什麼?

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"); 
    } 
} 
+0

如果它是你的片段只使用getActivity()。finish() – Masum

+0

我已經更新顯示整個活動,而不是列表視圖/適配器部分。 –

+0

嗨,我面臨同樣的問題。你是如何解決它的?非常感謝 – FVod

回答

-1

嘗試 SearchActivity.this.finish();

+0

我已經嘗試過,但沒有奏效。我再試一次:)。它仍然不起作用。 –

+0

提供更好的描述和添加內容/鏈接以支持您的回答。否則,您的答案可能會被刪除。 –

0

如果這個代碼是一個對話框內,完成活動電話:

getActivity().finish(); 
+0

不,它是在一個活動中 –

+0

你沒有重寫這個活動的finish()或onDestroy()方法嗎? –

0

我面對相同的問題。 write return();完成後();解決了我的問題。

但是,爲什麼?: 根據this答案

調用完成(該法)將運行至完成。完成()操作甚至不會開始,直到您將控制權返回給Android。