【问题标题】:change adapter of ListView after each search letters在每个搜索字母后更改 ListView 的适配器
【发布时间】:2014-05-22 07:51:34
【问题描述】:

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

我在 listView 的顶部添加了一个 EditText,以允许按字母搜索产品字母。 所以研究工作很好,但产品的数量并不相同。 所以问题是当我点击一个项目进行搜索后,选择了错误的产品,因为 listview 将函数中的位置保留在 list_data 中。

例如: 在进行任何搜索之前,我会选择商品,系统会选择好商品

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

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

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

}

【问题讨论】:

    标签: java android listview android-listview


    【解决方案1】:

    我解决了我的问题。

    最后,在 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);
            }
        });
    

    【讨论】:

      【解决方案2】:

      当你改变适配器列表时,你应该调用适配器的方法。

      notifyDataSetChange(); 
      

      使用您的适配器对象 希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        相关资源
        最近更新 更多