android - cannot update listview on changing an EditText value(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 值时无法更新列表视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:android - 在更改 EditText 值时无法更新列表视图
				
        
 
            
        - 在测试浓缩咖啡时,Android设备不会在屏幕上启动活动 2022-01-01
 - 使用自定义动画时在 iOS9 上忽略 edgesForExtendedLayout 2022-01-01
 - MalformedJsonException:在第1行第1列路径中使用JsonReader.setLenient(True)接受格式错误的JSON 2022-01-01
 - 如何检查发送到 Android 应用程序的 Firebase 消息的传递状态? 2022-01-01
 - android 4中的android RadioButton问题 2022-01-01
 - Android - 我如何找出用户有多少未读电子邮件? 2022-01-01
 - 用 Swift 实现 UITextFieldDelegate 2022-01-01
 - Android - 拆分 Drawable 2022-01-01
 - 想使用ViewPager,无法识别android.support.*? 2022-01-01
 - Android viewpager检测滑动超出范围 2022-01-01
 
				
				
				
				