2017-07-17 3 views
0

J'ai un listview filtré par un texte d'édition sur le dessus.Cependant, quand je clique sur l'élément recherché, je reçois le résultat d'un autre élément en cours de sélection. il y a aussi des données stockées dans mon tableau qui ne sont pas visibles sur listview, qui retournent aussi des données erronées. Lors de la recherche C, vous obtenez le résultat filtré en tant que C. Mais en cliquant dessus, les résultats sont comme si la position ne changeait pas pour les autres données mais utilisait la position originale de l'adaptateur ArrayList.filtre de recherche dans listview renvoie la valeur erronée sur l'article cliquez sur

Toute aide sera appréciée.

Mes produits

public class Leave_master_items { 
    public String leave_id; 
    public String leave_Name; 
    public String is_hourly; 
    public Leave_master_items(String leave_Name) { 
     this.leave_Name = leave_Name; 
    } 

    public String getLeave_id() { 
     return leave_id; 
    } 

    public void setLeave_id(String leave_id) { 
     this.leave_id = leave_id; 
    } 

    public String getLeave_Name() { 
     return leave_Name; 
    } 

    public void setLeave_Name(String leave_Name) { 
     this.leave_Name = leave_Name; 
    } 

    public String getIs_hourly() { 
     return is_hourly; 
    } 

    public void setIs_hourly(String is_hourly) { 
     this.is_hourly = is_hourly; 
    } 

    } 

Mon Adaptateur:

public class Leave_name_adapter extends BaseAdapter implements Filterable{ 

    ArrayList<Leave_master_items> cm = new ArrayList<>(); 
    Context context; 
    ArrayList<Leave_master_items> mStringFilterList; 
    ValueFilter valueFilter; 

    @Override 
    public Filter getFilter() { 
     if (valueFilter == null) { 
      valueFilter = new ValueFilter(); 
     } 
     return valueFilter; 
     // return null; 
    } 

    static class ListViewHolder { 
     TextView leaveType; 
    } 

    public Leave_name_adapter(ArrayList<Leave_master_items> cm, Context context) { 
     this.cm = cm; 
     this.context = context; 
     mStringFilterList = cm; 
    } 

    @Override 
    public int getCount() { 
     return cm.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return cm.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     ListViewHolder viewHolder; 
     if (row == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 
      row = inflater.inflate(R.layout.leaves_listview, parent, false); 
      viewHolder = new ListViewHolder(); 
      viewHolder.leaveType = (TextView) row.findViewById(R.id.leavestype); 
      row.setTag(viewHolder); 
     } else { 
      viewHolder = (ListViewHolder) row.getTag(); 
     } 
     Leave_master_items l = (Leave_master_items) getItem(position); 
     viewHolder.leaveType.setText(l.getLeave_Name()); 
     return row; 
    } 

    private class ValueFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      // cm.clear(); 
      if (constraint != null && constraint.length() > 0) { 
       ArrayList<Leave_master_items> filterList = new ArrayList<Leave_master_items>(); 
       for (int i = 0; i < mStringFilterList.size(); i++) { 
        if ((mStringFilterList.get(i).getLeave_Name().toUpperCase()) 
          .contains(constraint.toString().toUpperCase())) { 



         Leave_master_items country = new Leave_master_items(mStringFilterList.get(i).getLeave_Name()); 

         filterList.add(country); 
        } 
       } 
       results.count = filterList.size(); 
       results.values = filterList; 
      } else { 
       results.count = mStringFilterList.size(); 
       results.values = mStringFilterList; 
      } 
      return results; 

     } 

     @Override 
     protected void publishResults(CharSequence constraint, 
             FilterResults results) { 
      cm = (ArrayList<Leave_master_items>) results.values; 
      notifyDataSetChanged(); 
     } 
    } 
} 

Mon activité:

leave_btn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      new Leave_list().execute(); 
      a.setVisibility(View.INVISIBLE); 
      b.setVisibility(View.VISIBLE); 
      v.setBackgroundResource(R.drawable.date_button_bg); 
      date.setBackgroundResource(R.drawable.leave_button_bg); 
      leave_btn.setTextColor(Color.parseColor("#293038")); 
      date.setTextColor(Color.parseColor("#F8F8F8")); 


      search_leave.addTextChangedListener(new TextWatcher() { 

       @Override 
       public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
        // TODO Auto-generated method stub 
        Leave_application.this.leave_name_adapter.getFilter().filter(arg0); 
       } 

       @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 

       } 
      }); 

     } 
    }); 

private class Leave_list extends AsyncTask<String, Void, Boolean> { 

    protected void onPreExecute() { 
     leave_master_itemses.clear(); 

    } 

    @Override 
    protected void onPostExecute(final Boolean success) { 

     leave_name_adapter=new Leave_name_adapter(leave_master_itemses,getApplicationContext()); 
     listview_leave.setAdapter(leave_name_adapter); 


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

       Object a = parent.getAdapter().getItem(position); 

       String b = (String) parent.getItemAtPosition(position); 



       Leave_master_items leave_master_items=leave_master_itemses.get(position); 
       selectedFromList=leave_master_items.getLeave_id(); 
       Log.d("Yourtag", selectedFromList); 


       // Log.d("Clicked item field", " "+ item.getColum(your colum index)); 
      } 

     }); 



    } 

    protected Boolean doInBackground(final String... args) { 
     try { 
      Login_json_parser jParser = new Login_json_parser(); 

      String s = session.isWEBURL()+"?Function=" + session.isKEY_USERNAME() + "&Emp=" + session.iskey_emp_id(); 
      Log.d("s", s); 

      JSONObject json1 = jParser.getJSONFromUrl(s); 

      Log.d("Inputfdfdtsale Stream", "json1"); 


       try { 
        JSONObject object = (JSONObject) new JSONTokener(json1.toString()).nextValue(); 
        Leave = object.getString("Leave"); 
        Log.d("ew", Leave); 

        JSONArray jsonArray = new JSONArray(Leave); 
        for (int i = 0; i < jsonArray.length(); i++) { 

         JSONObject jsonObject = new JSONObject(); 
         jsonObject=jsonArray.getJSONObject(i); 

         Leave_master_items leave_master_items = new Leave_master_items(null); 
         leave_master_items.setIs_hourly(jsonObject.getString("is_hourly")); 
         leave_master_items.setLeave_id(jsonObject.getString("leave_id")); 
         leave_master_items.setLeave_Name(jsonObject.getString("leave_Name")); 

         leave_master_itemses.add(leave_master_items); 

        } 

        } 
        catch(JSONException e){ 
         e.printStackTrace(); 

        } 


     } 
     catch (Exception e1) { 
       e1.printStackTrace(); 
      } 
     return null; 

    } 
    } 
+0

son bec ause vous faites notifydatasetchanged() ainsi la liste est changée – Avinash

Répondre

0

Le problème est ici dès que vous commencez à chercher quelque chose dans edittext, votre liste changements de contenu et vous pourriez utiliser l'ancienne liste pour obtenir l'élément.

Créez un setter dans votre classe d'adaptateur pour la liste que vous venez d'obtenir après le filtrage et utilisez cette liste dans votre onItemClick pour récupérer la position que vous voulez récupérer.

0

Vous devez demander l'adaptateur pour obtenir le bon objet.

Au lieu de

Leave_master_items leave_master_items = leave_master_itemses.get(position); 

essayer

Leave_master_items leave_master_items = listview_leave.getAdapter().getItem(position); 

MISE À JOUR

Quand vous avez filtrer ne pas créer un nouvel objet avec le même contenu. Utilisez simplement l'objet qui existe déjà.

Au lieu de

Leave_master_items country = new Leave_master_items(mStringFilterList.get(i).getLeave_Name()); 

filterList.add(country); 

Do

filterList.add(mStringFilterList.get(i)); 

MAJ2

Ne pas retourner 0 dans getItemId()

@Override 
public long getItemId(int position) { 
    return position; 
} 
+0

il ne montre pas la méthode get après getadapter(). Est-ce autrement? –

+0

ne fonctionne toujours pas –

+0

Quel est le problème exact après avoir utilisé ma solution? – beeb