android-не удается обновить listview при изменении значения EditText

У меня есть деятельность, которая извлекает данные из базы данных, которая содержит информацию (имя, капитал, население, изображение флага) для многих стран. Основной макет имеет EditText, чтобы принять имя заглавной буквы в качестве входных данных и ListView. При запуске действия все страны извлекаются и кратко отображаются в ListView. Затем при вводе EditText я хочу, чтобы ListView показывал страны с соответствующим названием капитала. Но я вижу пустой список. Кроме того, если EditText пуст, Я хочу, чтобы ListView показал все страны, как это было показано в начале.

Основной файл макета выглядит следующим образом:

<RelativeLayout 
    
    android_id="@+id/parentLayout"
    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_background="#FFFFFF"
    android_orientation="vertical" >

    <com.google.android.gms.ads.AdView
        
        android_id="@+id/adView"
        android_layout_width="match_parent"
        android_layout_height="wrap_content"
        android_layout_alignParentBottom="true"
        ads_adSize="SMART_BANNER"
        ads_adUnitId="@string/banner_ad_id"
        android_visibility="gone" />

    <RelativeLayout
        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_layout_above="@id/adView"
        android_layout_marginBottom="10dp"
        android_layout_marginLeft="10dp"
        android_layout_marginRight="10dp"
        android_layout_marginTop="5dp" >



        <EditText 
            android_id="@+id/search_input_capital"
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            android_inputType="text"
            android_layout_alignParentTop="true"
           android_visibility="visible" >
        <requestFocus />

        </EditText>
        <ListView
            android_id="@+id/listView"
            android_layout_width="match_parent"
            android_layout_height="match_parent"
            android_cacheColorHint="#00000000"
            android_divider="@android:color/transparent"
            android_drawSelectorOnTop="false" 
            android_layout_below="@id/search_input_capital">
        </ListView>
    </RelativeLayout>

</RelativeLayout>

И код действия (CapitalActivity.java):

   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_capital);

        private ArrayList<Country> items;
        private ArrayList<Country> items_all;

        private ArrayList<Country>  items_new;

        private EfficientAdapter adapter;
        private ListView listView;


        EditText searchInput=(EditText)findViewById(R.id.search_input_capital);

        items = new ArrayList<Country>();
        items_new = new ArrayList<Country>();
        listView = (ListView) findViewById(R.id.listView);
        listView.setDividerHeight(10);

        adapter = new EfficientAdapter(CapitalActivity.this);
        listView.setAdapter(adapter);

       setListItems("");

      searchInput.addTextChangedListener(new TextWatcher() {

               @Override
               public void afterTextChanged(Editable s) {

               }

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

               @Override    
               public void onTextChanged(CharSequence s, int start,
                 int before, int count) {


                   String searchCapital = new String(s.toString()).trim();

                 items_new.clear();

               for(Country myCountry  : items_all) {

               if( myCountry.getCapital() != null &&  
                     myCountry.getCapital().trim().toLowerCase().contains(searchCapital)) {

               items_new.add(myCountry);
                 }
                }



             items.clear();

            items = (ArrayList<Country>) items_new.clone();

            if(searchCapital.trim().isEmpty()){

            items = items_all;
            }

            adapter.notifyDataSetChanged();


               }
              });





private void setListItems(String searchKey) {

    items_all= DatabaseAccessor.getCountryList(CapitalActivity.this, type, typeValue, searchKey);
    items=items_all;

    adapter.notifyDataSetChanged();
}

Выше показан только необходимый сегмент кода. Что нужно сделать для достижения цели ?

EDIT1: я в основном опустил часть EfficientAdapterреализации в коде, вставленном выше. Однако я вставляю этот код тоже в этот раз :

public class EfficientAdapter extends BaseAdapter {
        private LayoutInflater mInflater;
        private Context context;

        public EfficientAdapter(Context context) {
            mInflater = LayoutInflater.from(context);
            this.context = context;
        }

        public View getView(final int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.country_container, null);
                holder = new ViewHolder();

                holder.nameView = (TextView) convertView.findViewById(R.id.nameView);
                holder.continentView = (TextView) convertView.findViewById(R.id.continentView);
                holder.imageView = (ImageView) convertView.findViewById(R.id.imageView);
                holder.detailsView = (TextView) convertView.findViewById(R.id.detailsView);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            OnClickListener ocl = new OnClickListener() {

                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(CapitalActivity.this, CountryLearningActivity.class);
                    intent.putExtra(Constants.KEY_COUNTRY, items);
                    intent.putExtra(Constants.KEY_INDEX, position);
                    startActivity(intent);
                }
            };

            Country item = items.get(position);
            holder.nameView.setText(item.getCountry());
            if (type.equalsIgnoreCase(filters[0]) || type.equalsIgnoreCase(filters[1])
                    || type.equalsIgnoreCase(filters[2])) {
                holder.continentView.setText(item.getContinent());
            } else if (type.equalsIgnoreCase(filters[3])) {
                holder.continentView.setText(Html
                        .fromHtml("Area: " + formatter.format(Double.parseDouble(item.getArea())) + " km<sup>2</sup>"));
            } else if (type.equalsIgnoreCase(filters[4])) {
                holder.continentView.setText("Population : " + item.getPopulation());
            }
            holder.imageView.setImageResource(Utils.getResID(CapitalActivity.this, item.getFlag()));
            holder.detailsView.setOnClickListener(ocl);
            convertView.setOnClickListener(ocl);

            return convertView;
        }

        class ViewHolder {
            TextView nameView;
            ImageView imageView;
            TextView continentView;
            TextView detailsView;
        }

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

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

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

1 ответ

  1. просто откройте ту же страницу с текущей страницы для кода ниже

    enter cod  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_capital);
    
        private ArrayList<Country> items;
        private ArrayList<Country> items_all;
    
        private ArrayList<Country>  items_new;
    
        private EfficientAdapter adapter;
        private ListView listView;
    
    
        EditText searchInput=(EditText)findViewById(R.id.search_input_capital);
    
        items = new ArrayList<Country>();
        items_new = new ArrayList<Country>();
        listView = (ListView) findViewById(R.id.listView);
        listView.setDividerHeight(10);
    
        adapter = new EfficientAdapter(CapitalActivity.this);
        listView.setAdapter(adapter);
    
       setListItems("");
    
      searchInput.addTextChangedListener(new TextWatcher() {
    
               @Override
               public void afterTextChanged(Editable s) {
    
               }
    
               @Override    
               public void beforeTextChanged(CharSequence s, int start,
                 int count, int after) {
               }
    
               @Override    
               public void onTextChanged(CharSequence s, int start,
                 int before, int count) {
    
    
                   String searchCapital = new String(s.toString()).trim();
    
                 items_new.clear();
    
               for(Country myCountry  : items_all) {
    
               if( myCountry.getCapital() != null &&  
                     myCountry.getCapital().trim().toLowerCase().contains(searchCapital)) {
    
               items_new.add(myCountry);
                 }
                }
    
    
    
             items.clear();
    
            items = (ArrayList<Country>) items_new.clone();
    
            if(searchCapital.trim().isEmpty()){
    
            items = items_all;
            }
    
            adapter.notifyDataSetChanged();
    
    
               }
              });
    

    private void setListItems (строка searchKey) {

    items_all= DatabaseAccessor.getCountryList(CapitalActivity.this, type, typeValue, searchKey);
    items=items_all;
    
    adapter.notifyDataSetChanged();
    

    }e здесь