0

SQLiteデータベースからデータを取り出し、arrayListに格納してlistViewから連絡先に関する情報を表示しています。ユーザーはEditTextを入力し、TextWatcherはlistViewをフィルタリングします。しかし、これが起こると、リストビュー項目の位置は、私のonClickListenerで更新されません。TextWatcherでフィルタリングした後でListViewをクリック可能にする

私が自分のCRUD活動に送ったIDは、最初にリストされたときに自分の位置ではなくフィルタリングされた後の位置です。 ListViewアイテムをフィルタリングした後、元の位置に保持するにはどうすればよいですか?または、私のCRUD活動に正しい位置にない正しいIDを与えるより良い方法です。

public class Search extends AppCompatActivity { 

    // List view 
    private ListView lv; 


// Listview Adapter 
    ArrayAdapter<String> adapter; 

    // Search EditText 
    EditText inputSearch; 


    // ArrayList for Listview 
    ArrayList<String> arrayList = new ArrayList<>(); 

    DBHelper db; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_search); 

     db = new DBHelper(this); 

     arrayList = db.getAllContacts(); 

     lv = (ListView) findViewById(R.id.list_view); 
     inputSearch = (EditText) findViewById(R.id.inputSearch); 

     adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, arrayList); 
     lv.setAdapter(adapter); 


     inputSearch.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
       // When user changed the Text 
       Search.this.adapter.getFilter().filter(cs); 

     } 


      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
              int arg3) { 
       // TODO Auto-generated method stub 



      } 

      @Override 
      public void afterTextChanged(Editable arg0) { 
       // TODO Auto-generated method stub 
       adapter.notifyDataSetChanged(); 
      } 
     }); 

    lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
        @Override 
        public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 


         int id_To_Search = pos + 1; 

         Bundle dataBundle = new Bundle(); 
         dataBundle.putInt(EXTRA_FLAG, id_To_Search); 
         // The flag value > 0 is used to signal that the upcoming operation 
         // is not adding, but updating or deleting 

         Intent intent = new Intent(getApplicationContext(), CRUDActivity.class); 
         intent.putExtras(dataBundle); //Intent.putExtras(Bundle extras 
         startActivity(intent); 
        } 
       }); 

    } 
+0

onTextChange内のonItemClickListenerを設定することは意味がありません。位置はIDではありません。 "clicked"要素を取得する一般的な方法を使用してonItemClick内のArrayListからのみテキストを取得することができます(posListはarrayList.get(pos)ではないので、新しいフィルタされたリストをポイントします。一般的な方法はonItemClickのparentパラメータを使用することです - インターネット検索で簡単に見つかります) – Selvin

+0

@Slevinありがとう! – KingSneaky

+0

何のために?それはほんの少しのヒントでした... – Selvin

答えて

0

Iは、ちょうど二番目の配列を作成し、それを分割することになった選択された項目にそれを比較し、次にintに文字列からIDを解析されました。その後、私はIDに私のCrudアクティビティを送って、検索された連絡先を入力できるようにした。

lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 

      String split = (String) parent.getItemAtPosition(pos); 

      // Split this into sections then compare the name with arrayList2, then take the ID from arratList2 
      // parse it to an int and set it as the ID to search 
      int id_To_Search = 0; 
      String array[] = split.split(" "); 


      for (int i = 0; i < arrayList2.size(); i++) { 
       String split2[] = arrayList2.get(i).split(" "); 

       if (split2[1].equals(array[0])) { 
        //print item the same way as you did 
        id_To_Search = Integer.parseInt(split2[0]); 
       } 
      } 


      Bundle dataBundle = new Bundle(); 
      dataBundle.putInt(EXTRA_FLAG, id_To_Search); 
      // The flag value > 0 is used to signal that the upcoming operation 
      // is not adding, but updating or deleting 

      Intent intent = new Intent(getApplicationContext(), CRUDActivity.class); 
      intent.putExtras(dataBundle); //Intent.putExtras(Bundle extras 
      startActivity(intent); 
     } 
    }); 
    } 
関連する問題