Восстановить просмотр списка в диалоговом окне после поиска

У меня небольшая проблема в моем настраиваемом диалоговом окне. Когда пользователь ищет элемент в представлении списка, в списке отображаются нужные элементы, но если пользователь, например, хочет выполнить поиск снова, в представлении списка отображаются результаты предыдущего поиска.

Проблема: как восстановить просмотр списка после первого поиска?

Моя активность с настраиваемым диалогом

    edit.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                showDialog();

            }

        });

    }

}

private void showDialog() {
    dialog = new Dialog(this);
    View view = getLayoutInflater().inflate(R.layout.material_list, null);
    searchList = (ListView) view.findViewById(R.id.searchList);
    dialog.setTitle("Välj ny artikel");

    final MaterialAdapter adapter = new MaterialAdapter(
            InformationActivity.this, materialList);

    dialog.setContentView(view);

    searchList.setAdapter(adapter);

    searchList.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View v,
                int position, long id) {

            Materials itemMat = materialList.get(position);

            resultProduct = itemMat.materialName;
            resultProductNo = itemMat.materialNo;

            result = resultProduct + " " + resultProductNo;
            Toast.makeText(getApplicationContext(), result,
                    Toast.LENGTH_SHORT).show();

        }

    });

    search = (EditText) dialog.findViewById(R.id.search);

    search.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            resultText = search.getText().toString()
                    .toLowerCase(Locale.getDefault());
            adapter.filter(resultText);

        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
    cancel = (Button) dialog.findViewById(R.id.btnCancel);
    cancel.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            dialog.dismiss();

        }
    });

    ok = (Button) dialog.findViewById(R.id.btnOK);
    ok.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            product.setText(resultProduct);
            productNo.setText(resultProductNo);
            dialog.dismiss();

        }
    });

    dialog.show();

}

}

Мой адаптер

public class MaterialAdapter extends BaseAdapter {
LayoutInflater inflater;
Context context;
List<Materials> searchItemList = null;
ArrayList<Materials> materialList = new ArrayList<Materials>();

public MaterialAdapter(Context context, List<Materials> searchItemList) {
    this.context = context;
    inflater = LayoutInflater.from(context);
    this.searchItemList = searchItemList;
    this.materialList = new ArrayList<Materials>();
    this.materialList.addAll(searchItemList);

}

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

@Override
public Object getItem(int position) {
    return searchItemList.get(position);
}

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

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;
    if (convertView == null) {

        convertView = inflater.inflate(R.layout.d, null);
        viewHolder = new ViewHolder();
        viewHolder.tvMaterialName = (TextView) convertView
                .findViewById(R.id.tvMaterialName);
        viewHolder.tvMaterialNo = (TextView) convertView
                .findViewById(R.id.tvMaterialNo);

        convertView.setTag(viewHolder);

    } else {
        viewHolder = (ViewHolder) convertView.getTag();

    }

    viewHolder.tvMaterialName.setText((searchItemList.get(position))
            .getMaterialName());
    viewHolder.tvMaterialNo.setText((searchItemList.get(position))
            .getMaterialNo());

    return convertView;

}

public class ViewHolder {
    TextView tvMaterialName;
    TextView tvMaterialNo;

}

public void filter(String charText) {
    charText = charText.toLowerCase(Locale.getDefault());
    searchItemList.clear();
    if (charText.length() == 0) {
        searchItemList.addAll(materialList);
    } else {
        for (Materials wp : materialList) {
            if (wp.getMaterialName().toLowerCase(Locale.getDefault())
                    .startsWith(charText)) {
                searchItemList.add(wp);
            }
        }
    }
    notifyDataSetChanged();

}

}

Спасибо за помощь :)


person Camo    schedule 28.03.2014    source источник


Ответы (2)


Попробуйте изменить search.getText() на s.toString()

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        resultText = search.getText().toString()
                .toLowerCase(Locale.getDefault());
        adapter.filter(resultText);

    }

to

    public void onTextChanged(CharSequence s, int start, int before, int count) {
        resultText = s.toString().toLowerCase(Locale.getDefault());
        adapter.filter(resultText);
    }

Второстепенное дело, сделать materialList = searchItemList; И searchItemList пусто, которое будет заполнено элементами поиска (при первом запуске будут те же элементы в списке материалов).

P.S В этом случае ваш адаптер должен реализовывать Filterable (implements Filterable)

person Marco Acierno    schedule 29.03.2014
comment
Большое спасибо за помощь! Я подумал об этом, но мне понадобилось руководство :) - person Camo; 31.03.2014

@Override
        public void afterTextChanged(Editable s) {
 resultText = search.getText().toString()
                    .toLowerCase(Locale.getDefault());
            adapter.filter(resultText);
        } 

Попробуйте это и проверьте, помогает ли это

person playmaker420    schedule 28.03.2014