android - 在更改 EditText 值时无法更新列表视图

android - cannot update listview on changing an EditText value(android - 在更改 EditText 值时无法更新列表视图)
本文介绍了android - 在更改 EditText 值时无法更新列表视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我有一项活动,它从包含许多国家/地区的信息(名称、首都、人口、国旗图像)的数据库中检索数据.主布局有一个以大写名称作为输入的 EditText 和一个 ListView.启动活动时,将检索所有国家/地区并在 ListView 中简要显示.然后在键入 EditText 时,我希望 ListView 显示具有匹配首都名称的国家/地区.但我看到的是一个空白的 ListView.此外,如果 EditText 为空,我希望 ListView 显示开头显示的所有国家/地区.

I have an activity that retrieves data from a database that contains information (name, capital, population, flag image) for many countries. The main layout has an EditText to take the capital name as the input and a ListView. On launching the activity, all the countries are retrieved and shown briefly in the ListView. Then on typing in the EditText I want the ListView to show the countries with the matching capital name. But what I see is a blank ListView. Besides if the EditText is empty, I want the ListView to show all the countries as it showed in the beginning.

主要布局文件如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    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
        xmlns:ads="http://schemas.android.com/apk/res-auto"
        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)是:

And the code for the activity ( CapitalActivity.java ) is:

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

上面只显示了必要的代码段.我应该怎么做才能达到目标?

Only the necessary code segment has been shown above. What should I do to achieve the target ?

我在上面粘贴的代码中大部分省略了 EfficientAdapter 实现部分.但是这次我也粘贴了该代码:

I mostly omitted the EfficientAdapter implementation part in the code pasted above. However I am pasting that code too this time :

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);
        }
    }

推荐答案

只需从当前页面打开同一页面即可获取以下代码

just open teh same page from your current page for the below code

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(String searchKey) {

private void setListItems(String searchKey) {

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

adapter.notifyDataSetChanged();

}这里

这篇关于android - 在更改 EditText 值时无法更新列表视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

Prevent enter key on EditText but still show the text as multi-line(防止在 EditText 上输入键,但仍将文本显示为多行)
Android keyboard next button issue on EditText(EditText上的Android键盘下一个按钮问题)
When the soft keyboard appears, it makes my EditText field lose focus(当软键盘出现时,它使我的 EditText 字段失去焦点)
android how to make text in an edittext exactly fixed lines(android如何在edittext中制作文本完全固定的行)
How to use regular expression in Android(如何在 Android 中使用正则表达式)
Filter list view from edit text(从编辑文本中过滤列表视图)