2017-07-17 28 views
0

我有一個列表視圖獲取過濾頂部的編輯文本。但是當我點擊搜索項目時,我得到的另一個項目被選中的結果。還有一些存儲在我的數組中的數據,這些數據在列表視圖中不可見,也會返回錯誤的數據。 在搜索C時,您將得到的結果過濾爲C.But點擊它的結果就像位置不會改變其他數據,但使用原始的ArrayList適配器位置。在列表視圖中的搜索過濾器返回錯誤的值上的項目點擊

任何幫助將不勝感激。

我的項目:

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; 
    } 

    } 

我的適配器:

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(); 
     } 
    } 
} 

我的活動:

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

其BEC返回0 ause你正在做notifydatasetchanged(),所以列表被改變 – Avinash

回答

0

這裏的問題是,一旦你開始搜索的EditText上的東西,你的列表內容發生變化,您可能正在使用舊列表來獲取該項目。

在您的適配器類中創建一個setter,用於過濾後您剛剛獲得的列表,並在onItemCLick中使用該列表來獲取您想要獲取的位置。

0

您必須要求適配器才能獲得正確的對象。

而不是

Leave_master_items leave_master_items = leave_master_itemses.get(position); 

嘗試

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

UPDATE

當篩選您不必創建具有相同內容的新對象。只需使用已存在的對象。取而代之的

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

filterList.add(country); 

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

UPDATE2

不要在getItemId()

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

getadapter()後沒有顯示get方法。那是另一種方式嗎? –

+0

仍然不能正常工作 –

+0

使用我的解決方案後,確切的問題是什麼? – beeb

相關問題