listview不会更改并保留相同的项目

时间:2018-03-02 14:40:52

标签: java android listview

我的listview根据我在edittext中输入的数字进行更改,当我输入另一个数字时,列表不会改变,并保持与前一个数字类型相同的项目。

这是适配器:

 public class ElectorListAdapter  extends BaseAdapter{
private Context activity;
private LayoutInflater inflater;
private List<Electors> DataList;
private ArrayList<Electors> arraylist=null;
 //  private ItemFilter mFilter = new ItemFilter();


public ElectorListAdapter(Context activity, List<Electors> electors) {
    this.activity = activity;
    this.DataList = electors;


    this.arraylist = new ArrayList<Electors>();
    this.arraylist.addAll(electors);
    inflater = LayoutInflater.from(activity);
}

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

@Override
public Object getItem(int location) {
    return DataList.get(location);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (inflater == null)
        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if (convertView == null)
        convertView = inflater.inflate(R.layout.elector_info_cell_list, null);

    TextView name = (TextView)convertView.findViewById(R.id.name);
    TextView status = (TextView)convertView.findViewById(R.id.status);
    Electors m = DataList.get(position);


    //97697691
    name.setText(m.getName());
    status.setText(m.getStatus().toString());


    return convertView;
}



}

这是MainActivity中的植入:

 adapter = new ElectorListAdapter(this, list);
    lv.setAdapter(adapter);
    lv.setTextFilterEnabled(true); 

在这里我清除了清单:

       serial.setOnFocusChangeListener(new View.OnFocusChangeListener() {
          @Override
          public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                serialno = serial.getText().toString();

                if(serial.getText()!=null){
                   //list = new ArrayList<>();
                    list.clear();
                    getlist();

                }else if(serial.getText()==null){

                    lv.setVisibility(v.GONE);
                }

            }
        }
    });

这里是getlist();

 public void getlist(){
    //list = new ArrayList<>();

    try {
        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        String URL = "http://gickuwait-dev.com/electionapi/api/electors";
        JSONObject jsonBody = new JSONObject();
        // jsonBody.put("tblRegisteredUsers_nickName", username.getText().toString().trim());
        jsonBody.put("SerialNo", serialno.toString().trim());



        final String requestBody = jsonBody.toString();

        StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                //my response later should be changed

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("VOLLEY", error.toString());
            }
        })

        {
            @Override
            public String getBodyContentType() {
                return "application/json; charset=utf-8";
            }

            @Override
            public byte[] getBody() throws AuthFailureError {
                try {
                    return requestBody == null ? null : requestBody.getBytes("utf-8");
                } catch (UnsupportedEncodingException uee) {
                    VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8");
                    return null;
                }
            }
            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse response) {
                String responseString;
                String json = null;
                try {
                    json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }

                responseString = String.valueOf(json).trim();
                ArrayList<ElectorResponse> list_response = new ArrayList<ElectorResponse>();
                Type listType = new TypeToken<List<ElectorResponse>>() {}.getType();
                list_response = new Gson().fromJson(responseString, listType);

                for (int i = 0; i < list_response.size(); i++) {
                    Electors listItemData = new Electors();
                    listItemData.setName(list_response.get(i).getNameAr());
                    listItemData.setStatus(list_response.get(i).getExpr1());
                    listItemData.setId(list_response.get(i).getPKID());


                    if (listItemData.getName().startsWith(classletter)){
                        list.add(listItemData);
                    }

                }

                // i should have this piece of code for methods that are running in the background
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                      adapter.notifyDataSetChanged();
                    }
                });
                 // String Check =  yourModel.getMessagetitle();

                return Response.success(list_response.toString(), HttpHeaderParser.parseCacheHeaders(response));
            }
        };

        requestQueue.add(stringRequest);
    } catch (JSONException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

这里我使用过滤器来过滤列表

     name.addTextChangedListener(new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                                  int count) {

        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {



        }

        @Override
        public void afterTextChanged(Editable theWatchedText) {

            //Vote.this.adapter.getFilter().filter(theWatchedText.toString());
            String text = name.getText().toString().toLowerCase(Locale.getDefault());
         //   Vote.this.adapter.getFilter().filter(text);

            search_model(name.getText().toString());


        }
    });
      private void search_model(String key){
    search = new ArrayList<>();
    for(int i = 0;i<list.size();i++){
        Electors electors = list.get(i);
        if(electors.getName().toLowerCase(Locale.getDefault()).startsWith(key)){
            search.add(electors);
        }
    }

    adapter = new ElectorListAdapter(this, search);
    lv.setAdapter(adapter);
    lv.setTextFilterEnabled(true);
}

当我输入另一个数字时,如何让它更改其值,适配器中是否缺少某些内容?提前谢谢

3 个答案:

答案 0 :(得分:0)

您需要通过notifyDatasetChanged()

通知数据集的更改列表

答案 1 :(得分:0)

数据更改时应该有清晰的数组列表。然后将新文本添加到数组列表并更新它。

arraylist.clear(); //to clear array list
arraylist.add(); //to add new text
adapter.notifyDataSetChanged(); //to notify adapter

答案 2 :(得分:0)

if(serial.getText()!=null){
                   //list = new ArrayList<>();
                    list.clear();

               // since you removed the item you need to inform the adapter to 
               //refresh view

              adapter.notifyDataSetChanged();

// also as soon as getlist(); gets new list , set that list on adapter and call 
// adapter.notifyDataSetChanged();
                    getlist();

                }