2015-12-09 1 views
0

У меня есть список с именами и мобильными номерами в виде двух текстовых изображений. OnItemClickListener возвращает другой элемент onclick. Это происходит непоследовательно - иногда он выбирает правильный элемент, но иногда это не так.OnClick неправильный выбор получателя

private void showCustomers(String json) { 
     ParseCustomer parseCustomer = new ParseCustomer(json); 
     parseCustomer.parseJSON(); 
lv = (ListView) findViewById(R.id.list_customerInfo); 
     inputSearch = (EditText) findViewById(R.id.inputSearch); 
adapter = new ArrayAdapter<String>(this,R.layout.list_customerinfo, R.id.customer_name,ParseCustomer.name); 


     final List<Map<String, String>> cust = new ArrayList<Map<String, String>>(); 
     Map<String,String> map; 
     int counter = ParseCustomer.name.length; 
     for (int i=0;i<counter; i++){ 
      map = new HashMap<>(); 
      map.put("name",ParseCustomer.name[i]); 
      map.put("mobile",ParseCustomer.mobile_no[i]); 
      cust.add(map); 
     } 

     newAdapter = new SimpleAdapter(this,cust,R.layout.list_customerinfo,new String[]{"name","mobile"},new int[]{R.id.customer_name,R.id.customer_mobile}); 
     lv.setAdapter(newAdapter); 

     inputSearch.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       lv.setVisibility(View.INVISIBLE); 

      } 

      @Override 
      public void onTextChanged(CharSequence charSequence, int start, int before, int count) { 
      lv.setVisibility(View.VISIBLE); 

      } 

      @Override 
      public void afterTextChanged(Editable s) { 

       AddInvEst.this.newAdapter.getFilter().filter(s); 
       lv.setVisibility(View.VISIBLE); 
      } 
     }); 

     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Map custSel = cust.get(position); 
       custSelected = (String) custSel.get("name")+" "+ custSel.get("mobile"); 
       inputSearch.setText(custSelected); 
       lv.setVisibility(View.GONE); 
       Toast.makeText(AddInvEst.this, "Your selected customer is "+custSelected, Toast.LENGTH_LONG).show(); 
      } 
     }); 
} 

У меня есть текстовое поле редактирования, которое я использую для поиска или фильтрации списка. Может ли кто-нибудь указать мою ошибку или направить меня к лучшему решению? Спасибо :)

+0

проблема с фильтром поиска, попробуйте 'Map custSel = newAdapter.getItem (положение);' вместо 'Map custSel = cust.get (положение) ; ' –

+0

Укажите класс адаптера – Jas

+0

, почему' lv.setVisibility (View.GONE); '? – Amy

ответ

0

SimpleAdapter класса управление два списка, One to store your original List и second to store filter data. So whenever you apply filter на SimpleAdapter класса, Список фильтра имеет меньшее количество товара тогда оригинал.

Так что в текущем сценарии всякий раз, когда вы нажимаете на определенный элемент, вы получаете позицию щелчка отфильтрованного списка, но получаете предмет из нефильтрованного (оригинального) списка, следовательно, неправильного элемента.

Таким образом, чтобы получить нажмите элемент из SimpleAdapter использования:

Map custSel = (Map) newAdapter.getItem(position); 
+0

Спасибо Dhaval :) –