在每个搜索字母后更改ListView的适配器

时间:2014-05-22 07:51:35

标签: java android listview android-listview

我开发了一个ListView,它显示带有标题的产品列表,列表位于CHOICE_MODE_SINGLE。

我在listView的顶部插入一个EditText,以允许逐个字母地搜索产品。 所以研究工作很好,但产品数量不一样。 所以问题是在我点击一个项目后搜索,选择了错误的产品,因为listview将函数中的位置保持为list_data。

例如:                在任何搜索之前,我选择项目和系统采取好项目 enter image description here

但是,如果我进行搜索,listview将使用输入的字母中的新数据列表进行重建。

enter image description here

如您所见,我选择名为BA300的产品,系统采用BA03D。 我认为适配器存在问题,listview将第一个适配器与setOnItemClickListener()中的所有项保持在一起,而我使用新的列表项设置适配器以重建listview。

///////////////////////////Method to create and display a pop-up with list of allproduct/////////

public void openListAllProduct(final FormField field){

    ArrayList<String> list_datas = new ArrayList<String>();

    ProductQuery productQuery = new ProductQuery(this);
    productQuery.open();        
    list_datas = productQuery.getAllProduct();
    productQuery.close();

    final Dialog dialog = new Dialog(ViewPdf.this);
    dialog.setContentView(R.layout.list_all_product);       
    final ListView list_view = (ListView) dialog.findViewById(R.id.list_prod);
    final EditText search_product = (EditText) dialog.findViewById(R.id.search_product);
    final EditText quantity_product = (EditText) dialog.findViewById(R.id.quantity_product);        
    final TextView TVProduct = (TextView) dialog.findViewById(R.id.TVproductAll);

    search_product.setSingleLine();
    dialog.setTitle("Tous les produits");   

    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
    quantity_product.setRawInputType(Configuration.KEYBOARD_12KEY);

    final ArrayAdapter<String> modeAdapter = new ArrayAdapter<String>(this,  android.R.layout.select_dialog_singlechoice, list_datas);
//////////////////////////////////////////////////////////////////////////////////      
list_view.setAdapter(modeAdapter); <----ITS THE FIRST ADAPTER WITH ALL ITEM
//////////////////////////////////////////////////////////////////////////////////
    list_view.setChoiceMode(ListView.CHOICE_MODE_SINGLE);       
    list_view.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,long id) {               
            Log.i("Product :",quantity_product.getText() + " " + modeAdapter.getItem(position));
            item_lv = modeAdapter.getItem(position).toString();
            TVProduct.setText(item_lv);
        }
    });
    ///si le field n'est pas remplie alors on désactive le bouton supprimer
    if(!field.isEmpty()){

        String[] datas_product = ((TextField) field).getValue().split(" ");
        quantity_product.setText(datas_product[0]);
        TVProduct.setText(datas_product[1]);
    }
    search_product.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            ProductQuery productQuery = new ProductQuery(ViewPdf.this);
            productQuery.open();        
            final ArrayAdapter<String> modeAdapter = new ArrayAdapter<String>(ViewPdf.this, android.R.layout.select_dialog_singlechoice, productQuery.getProductByChar(s.toString()));
//////////////////////////////////////////////////////////////////////////////////
            list_view.setAdapter(modeAdapter); <-- THE SECOND ADAPTE WITH NEW LIST OF DATAS
//////////////////////////////////////////////////////////////////////////////////
            list_view.invalidateViews(); <---- rebuild the listView

            productQuery.close();               
        }

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


    ////bouton pour revenir à la popup produit/contrat
    Button dialog_button_return = (Button) dialog.findViewById(R.id.button_return);     
    dialog_button_return.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {               
            dialog.dismiss();
            openListProductContractClient(R.layout.list_product_by_contract,field,0);
        }
    });

    ////bouton pour valider la sélection
    Button dialog_button_validate = (Button) dialog.findViewById(R.id.button_validate_all_product);     
    dialog_button_validate.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {   
            try {

                if(quantity_product.getText().toString().isEmpty()){
                    quantity_product.setText("1");
                }
                if(list_view.getCheckedItemPosition() == AdapterView.INVALID_POSITION){                         
                    if(!TVProduct.getText().toString().isEmpty()){
                        ((TextField) field).setValue(quantity_product.getText() + " " + TVProduct.getText().toString());
                    }

                }else{
                    ((TextField) field).setValue(quantity_product.getText() + " " + item_lv);
                }


            } catch (PDFException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            dialog.dismiss();
        }
    });


    dialog.show();

}

2 个答案:

答案 0 :(得分:0)

我解决了我的问题。

最后在setOnItemClickListener中,我使用变量parent获取位置,即全部。我认为它更难.. =)

list_view.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,long id) {               
            Log.i("Product :",quantity_product.getText() + " " + modeAdapter.getItem(position));
            //item_lv = modeAdapter.getItem(position).toString();
            item_lv = parent.getItemAtPosition(position).toString();
            TVProduct.setText(item_lv);
        }
    });

答案 1 :(得分:0)

更改适配器列表时,应调用适配器的方法。

notifyDataSetChange(); 

使用适配器对象 我希望它会对你有所帮助。