0

onListItemClick()을 구현 한 목록보기가 있습니다. 그것은 잘 작동하지만 검색을 사용하여 목록을 필터링 할 때 잘못된 목록 항목 (때로는 필터링 된 목록에도 표시되지 않는 항목)이 열립니다. 아래는 제 코드입니다. 내가 무엇을 놓치고 잘못했는지 확실하지 않습니다. 코드가하는 것을 얻으려면 인라인 주석을보십시오. 어떤 도움을 많이 주시면 감사하겠습니다. 대신 mDataList.get(position)onListItemClick()이 ArrayAdapter (Android)의 필터링 된 검색 목록에서 작동하지 않습니다.

private static final int EDITOR_ACTIVITY_REQUEST = 2001; 
private DataSource mSource; 
private ArrayAdapter<SampleData> mAdapter; 
private EditText mSearchField; 
private List<SampleData> mDataList; 
private SampleData mData; 
private Intent mIntent; 

// done in onCreate() 
mSource = new DataSource(this); 
updateDisplay(); 

// set up in onCreateOptionsMenu() 
mSearchField = (EditText) menu.findItem(R.id.action_search).getActionView(); 
mSearchField.addTextChangedListener(searchTextWatcher); 

// method to refresh display 
private void updateDisplay() { 
     // fetch data from the database and display in list view 
     mDataList = mSource.retrieveAllData(); 
     mAdapter = new ArrayAdapter<>(this, R.layout.list_item_layout, mDataList); 
     setListAdapter(mAdapter); 

    } 


    // respond to list item clicks 
    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     // view data of an item pressed on 
     editData(position); 
    } 

    // edit the data 
    protected void editData(int position) { 
     mData = mDataList.get(position); 
     mIntent = new Intent(this, DataEditor.class); 
     mIntent.putExtra(Constants.KEY, mData.getKey()); 
     mIntent.putExtra(Constants.TEXT, mData.getText()); 
     startActivityForResult(mIntent, EDITOR_ACTIVITY_REQUEST); 
    } 

// Search TextWatcher 
    private TextWatcher searchTextWatcher = new TextWatcher() { 

     @Override 
     public void afterTextChanged(Editable s) { 
      String searchText = mSearchField.getText().toString() 
        .toLowerCase(Locale.getDefault()); 
      mAdapter.getFilter().filter(searchText); 

      // tried these but never worked 
      /** 
      * mAdapter.notifyDataSetInvalidated(); 
      * mAdapter.notifyDataSetChanged(); 
      * getListView().setAdapter(mAdapter); 
      */ 
     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
       int arg3) { 

     } 

     @Override 
     public void onTextChanged(CharSequence arg0, int arg1, int arg2, 
       int arg3) { 

     } 

    }; 

답변

0

, mAdapter.getItem(position)를 사용합니다. position은 현재 목록 내용을 기반으로하며 mDataList은 필터링되지 않은 원시 목록 내용입니다.

+0

@CommonsWare 매우 감사합니다. 그것은 완벽하게 작동합니다. 너는 내 하루를 구했다. – Dut

관련 문제