【发布时间】: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