我开发了一个ListView,它显示带有标题的产品列表,列表位于CHOICE_MODE_SINGLE。
我在listView的顶部插入一个EditText,以允许逐个字母地搜索产品。 所以研究工作很好,但产品数量不一样。 所以问题是在我点击一个项目后搜索,选择了错误的产品,因为listview将函数中的位置保持为list_data。
例如: 在任何搜索之前,我选择项目和系统采取好项目
但是,如果我进行搜索,listview将使用输入的字母中的新数据列表进行重建。
如您所见,我选择名为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();
}
答案 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();
使用适配器对象 我希望它会对你有所帮助。