使用edittext过滤listview的问题

时间:2014-11-20 11:30:56

标签: android listview filter android-edittext

你好我正在开发一个app,它有一个edittext来搜索listview上的项目。如果用户在edittext中键入一个字母,则listview将被过滤完成。还使用了适配器。现在我有以下问题:

1)当我清除字母edittext时,我的列表视图没有得到更新..

2)如果我输入了错误的字母或字母,这些字母或字母没有与列表视图中的任何项目相矛盾,那么列表视图就会变得清晰。

在SO中已经过去了 Android filter listview custom adapter

并搜索同样的问题,但没有得到解决它..Plz任何人帮助我..

这是我的代码:

    package com.AAAAA.AAAAA;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.AdapterView.OnItemClickListener;

    import com.AAAAA.adapter.UpdateSingleItemViewActivity;
    import com.AAAAA.adapter.UpdatesAdapterList;
    import com.AAAAA.local.database.DBController;
    import com.AAAAA.AAAAA.AAAAA.constant.Constant;
    import com.AAAAA.AAAAA.AAAAA.utils.Utility;

    public class Cardiology_updates extends Activity implements OnClickListener,
            OnRefreshListener {
        EditText et ;
        private Context appContext;
        // ProgressDialog mProgressDialog;
        private Dialog dialog;
        private boolean isFinish = false;
        String result = "";
        JSONObject jsonobject;
        JSONArray jsonArray;
        ArrayList<HashMap<String, String>> UpdatesHmList;
        public static ArrayList<HashMap<String, String>> FinalLocalDataList;
        ArrayList<HashMap<String, String>> LocalDataList;
        DBController controller = new DBController(this);
        HashMap<String, String> queryValues;
        ListView list;
        UpdatesAdapterList adapter;
        public static String UpdateID = "UpdateID";
        public static String UpdateTitle = "Title";
        /*
         * public static String UpdateDescription = "Description"; public static
         * String POPULATION = "UpdateDate"; public static String UpdateImage =
         * "Photo";
         */

        public static String UpdateDescription = "Description";
        public static String POPULATION = "Title";
        public static String UpdateImage = "Complete_imagePath";

        public static String Complete_imagePath;
        public static String Title;
        public static String Description;

        SwipeRefreshLayout swipeLayout;
        private ProgressBar progressbar;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_cardiology_updates);
    //      controller.deleteAllJsonData();
            appContext = this;
            animationView();
            initComponent();

        }

        private void animationView() {
            // TODO Auto-generated method stub
            progressbar = (ProgressBar) findViewById(R.id.loading);
        }

        private void initComponent() {
            // TODO Auto-generated method stub
            swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
            swipeLayout.setOnRefreshListener(this);
            swipeLayout.setColorScheme(android.R.color.holo_blue_bright,
                    android.R.color.holo_green_light,
                    android.R.color.holo_orange_light,
                    android.R.color.holo_red_light);


            dialog = new Dialog(appContext);
            dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog.setContentView(R.layout.alert_dialog);
            ((Button) findViewById(R.id.Button01)).setOnClickListener(this);
            ((Button) dialog.findViewById(R.id.btnOk)).setOnClickListener(this);

            new GetUpdatesInfo().execute();

        }

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (v.getId() == R.id.Button01) {

                finish();
                // finishActivity() ;
            } else if (v.getId() == R.id.btnOk) {
                dialog.dismiss();
                if (isFinish) {
                    this.finish();
                }

            }
        }

        public class GetUpdatesInfo extends AsyncTask<String, Void, String> {

            protected void onPreExecute() {
                super.onPreExecute();
                if (progressbar.getVisibility() != View.VISIBLE) {
                    progressbar.setVisibility(View.VISIBLE);
                }
            }

            @Override
            protected String doInBackground(String... params) {
                // Create an array
                UpdatesHmList = new ArrayList<HashMap<String, String>>();
                // Retrieve JSON Objects from the given URL address
                String url = null;

                url = Constant.serverUrl + "/GetUpdateList";
                result = Utility.postParamsAndfindJSON(url);
                Log.e("result doInBackground", "" + result);
                if (!(result == null)) {
                    try {
                        controller.deleteAllJsonData();
                        // Locate the array name in JSON
                        jsonArray = new JSONArray(result);

                        for (int i = 0; i < jsonArray.length(); i++) {
                            HashMap<String, String> map = new HashMap<String, String>();

                            jsonobject = jsonArray.getJSONObject(i);
                            // Retrive JSON Objects
                            map.put("UpdateID", jsonobject.getString("UpdateID"));
                            map.put("Title", jsonobject.getString("Title"));

                            String Upadates_Photo = jsonobject.optString("Photo")
                                    .toString();

                            String Complete_imagePath = Constant.prifixserverUrl
                                    + Upadates_Photo;
                            String Title = jsonobject.getString("Title").toString();
                            String Description = jsonobject
                                    .getString("Description").toString();

                            String noHtml = Description.replaceAll("<[^>]*>", "");

                            String parseResponse = noHtml.replaceAll("&nbsp;", "");

                            map.put("Photo", Complete_imagePath);
                            map.put("Description", Description);
                            map.put("UpdateDate",
                                    jsonobject.getString("UpdateDate"));

                            Log.e("UpdateID ",
                                    " "
                                            + jsonobject.getString("UpdateID")
                                                    .toString());
                            Log.e("Title ", " "
                                    + jsonobject.getString("Title").toString());
                            Log.e("Complete_imagePath ",
                                    " " + Complete_imagePath.toString());

                            Log.e("Description ", " " + parseResponse);

                            Log.e("UpdateDate ",
                                    " "
                                            + jsonobject.getString("UpdateDate")
                                                    .toString());

                            queryValues = new HashMap<String, String>();
                            queryValues.put("Complete_imagePath",
                                    Complete_imagePath);
                            queryValues.put("Title", Title);
                            queryValues.put("Description", Description);
                            controller.insertAllJsonData(queryValues);
                            // Set the JSON Objects into the array
                            UpdatesHmList.add(map);
                        }

                    } catch (JSONException e) {
                        Log.e("Error", e.getMessage());
                        e.printStackTrace();
                    }
                }
                return result;
            }

            @Override
            protected void onPostExecute(String result) {
                // Locate the listview in listview_main.xml
                if (progressbar.getVisibility() == View.VISIBLE) {
                    progressbar.setVisibility(View.GONE);
                }
                /*
                 * if (result == null) { //mProgressDialog.dismiss();
                 * localalldata();
                 * 
                 * }
                 */
                localalldata();

                /*
                 * list = (ListView) findViewById(R.id.list_Upadates); // Pass the
                 * results into ListViewAdapter.java adapter = new
                 * UpdatesAdapterList(Cardiology_updates.this, FinalLocalDataList);
                 * // Set the adapter to the ListView list.setAdapter(adapter);
                 */

                // Close the progressdialog
                // mProgressDialog.dismiss();
            }

        }

        @Override
        public void onRefresh() {
            // TODO Auto-generated method stub

            // TODO Auto-generated method stub

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                 getSomeData();
    //              localalldata();
                    swipeLayout.setRefreshing(false);
                }
            }, 5000);

        }

        protected void getSomeData() {
            // TODO Auto-generated method stub
            // localalldata();
            new GetUpdatesInfo().execute();
            adapter.notifyDataSetChanged();
            /*
             * if (LocalDataList == null) { Log.e("LocalDataList inside if ",
             * "LocalDataList inside if "); new GetUpdatesInfo().execute();
             * 
             * } else { // adapter.imageLoader.clearCache();
             * Log.e("LocalDataList else ", "LocalDataList else  ");
             * 
             * adapter.notifyDataSetChanged(); }
             */

        }

        private void localalldata() {
            // TODO Auto-generated method stub
            LocalDataList = controller.getAllJsonData();
            FinalLocalDataList = new ArrayList<HashMap<String, String>>();

            for (HashMap<String, String> hashMap : LocalDataList) {
                System.out.println(hashMap.keySet());
                HashMap<String, String> map = new HashMap<String, String>();
                for (String key : hashMap.keySet()) {
                    System.out.println(hashMap.get(key));

                    Complete_imagePath = hashMap.get("Complete_imagePath");
                    Title = hashMap.get("Title");
                    Description = hashMap.get("Description");

                    map.put("Complete_imagePath", Complete_imagePath);
                    map.put("Title", Title);
                    map.put("Description", Description);
                    Log.v("All Json CodiateUpdate Title", "" + Complete_imagePath);
                    Log.v("All Json CodiateUpdate Title", "" + Title);
                }
                FinalLocalDataList.add(map);
            }
            list = (ListView) findViewById(R.id.list_Upadates);
            // Pass the results into ListViewAdapter.java
            adapter = new UpdatesAdapterList(Cardiology_updates.this,
                    FinalLocalDataList);
            // Set the adapter to the ListView
            list.setTextFilterEnabled(true);
            list.setAdapter(adapter);
            // adapter.notifyDataSetChanged();
            et = (EditText) findViewById(R.id.search);
            // Capture Text in EditText
            et.addTextChangedListener(new TextWatcher() {

                @Override
                public void afterTextChanged(Editable arg0) {
                    adapter.filter(arg0.toString());
         }

                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1,
                        int arg2, int arg3) {
                    // TODO Auto-generated method stub
                }

                @Override
                public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                        int arg3) {
                    //String text = et.getText().toString().toLowerCase(Locale.getDefault());
                    //adapter.getFilter().filter(arg0);
                }
            });

             }
             }

这是我的适配器:

package com.AAAA.adapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

import com.AAAA.AAAA.Cardiology_updates;
import com.AAAA.AAAA.R;
import com.AAAA.imageloader.ImageLoader;

public class UpdatesAdapterList extends BaseAdapter {
    // Declare Variables
    Context context;
    LayoutInflater inflater;
    ArrayList<HashMap<String, String>> data;
    public ImageLoader imageLoader;
    private Activity activity;
    //HashMap<String, String> resultp = new HashMap<String, String>();
    private ArrayList<HashMap<String,String>> filterData;
    public UpdatesAdapterList(Context context,
            ArrayList<HashMap<String, String>> arraylist) {
        this.context = context;
        data = arraylist;
        imageLoader = new ImageLoader(context.getApplicationContext());
        filterData = new ArrayList<HashMap<String,String>>();
        filterData.addAll(this.data);
    }

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

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

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

    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.listview_updateitem, null);
            holder.UpdateTitle = (TextView) convertView.findViewById(R.id.txtUpdatetitle);
            holder.UpdateImage = (ImageView) convertView.findViewById(R.id.list_UpdateImage);

            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        holder.UpdateTitle.setText(filterData.get(position).get(Cardiology_updates.UpdateTitle));

        imageLoader.DisplayImage(filterData.get(position).get(Cardiology_updates.UpdateImage), holder.UpdateImage);
        // Capture ListView item click
        convertView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // Get the position
                //resultp = data.get(position);

                Intent intent = new Intent(context, UpdateSingleItemViewActivity.class);
                // Pass all data rank
                intent.putExtra("UpdateTile", filterData.get(position).get(Cardiology_updates.UpdateTitle));
                // Pass all data country
                intent.putExtra("UpdateDescription", filterData.get(position).get(Cardiology_updates.UpdateDescription));
                // Pass all data population
                intent.putExtra("population",filterData.get(position).get(Cardiology_updates.POPULATION));
                // Pass all data flag
                intent.putExtra("UpdateImage", filterData.get(position).get(Cardiology_updates.UpdateImage));
                // Start SingleItemView Class
                intent.putExtra("position", position);
                context.startActivity(intent);
            }
        }); return convertView;

    }

    class ViewHolder{
        TextView UpdateTitle;
        ImageView UpdateImage;
    }

    public void filter(String constraint) {
        filterData.clear();
        if (constraint.length() == 0) {
            filterData.addAll(data);
        }else{
            for (HashMap<String,String> row: data) {
                if(row.get(Cardiology_updates.UpdateTitle).toUpperCase().startsWith(constraint.toString().toUpperCase())){
                    filterData.add(row);
                }
            }
        }
        notifyDataSetChanged();
    }
}

活动在cliking listview项目上打开:

package com.AAAAA.adapter;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;

import com.AAAAA.AAAAA.Cardiology_updates;
import com.AAAAA.AAAAA.R;

public class UpdateSingleItemViewActivity extends Activity  {
     int position;
    String UpdateTile;
    String UpdateDescription;
    String population;
    String UpdateImage;
    //String position;
    ViewPager viewPager;
    PagerAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_update_single_item_view);

        Log.e("UpdateSingleItemViewActivity class",
                "UpdateSingleItemViewActivity class");
        /*
         * WebView webview = new WebView(this); setContentView(webview);
         */
        Button btnback = (Button) findViewById(R.id.Button01);
        btnback.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                finish();
            }
        });


        //WebView webview = (WebView) findViewById(R.id.webview);
        Intent i = getIntent();
        // Get the result of rank
        UpdateTile = i.getStringExtra("UpdateTile");
        // Get the result of country
        UpdateDescription = i.getStringExtra("UpdateDescription");
        // Get the result of population
        population = i.getStringExtra("population");
        // Get the result of flag
        UpdateImage = i.getStringExtra("UpdateImage");
        //i.putExtra("POSITION_KEY", position);
        position = i.getExtras().getInt("position");
        //webview.loadData(UpdateDescription, "text/html", null);
        viewPager = (ViewPager) findViewById(R.id.viewpager_layout);
        // Pass results to ViewPagerAdapter Class
        adapter = new ViewPagerAdapter(UpdateSingleItemViewActivity.this, Cardiology_updates.FinalLocalDataList);
        // Binds the Adapter to the ViewPager
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(position);
        }

    }

其Corrosponding适配器:

    package com.AAAAA.adapter;

import java.util.ArrayList;
import java.util.HashMap;

import com.AAAAA.AAAAA.Cardiology_updates;
import com.AAAAA.AAAAA.R;
import com.AAAAA.imageloader.ImageLoader;

import android.app.Activity;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.LinearLayout;

public class ViewPagerAdapter extends PagerAdapter {
    String UpdateTile;
    String UpdateDescription;
    //String population;
    String UpdateImage;
    String position;
    LayoutInflater inflater;
    Context context;
    ArrayList<HashMap<String, String>> data;
    public ImageLoader imageLoader;
      private Activity activity;
    //HashMap<String, String> resultp = new HashMap<String, String>();
      ArrayList<HashMap<String,String>> filterData;
    public ViewPagerAdapter(Context context, ArrayList<HashMap<String, String>> arraylist) {
        this.context = context;
        data = arraylist;
        filterData = new ArrayList<HashMap<String,String>>();
        filterData.addAll(this.data);
    }

    @Override
    public int getCount() {
        return filterData.size();
    }
    public Object getItem(int position) {
        return filterData.get(position);
    }
    public long getItemId(int position) {
        return position;
    }


    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((LinearLayout) object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {

        WebView webview;

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.viewpager_item, container,
                false);
        //resultp =data.get(position);

        webview=(WebView)itemView.findViewById(R.id.webview1);
        //webview.setText(webview[position]);
        webview.loadData(filterData.get(position).get(Cardiology_updates.UpdateDescription), "text/html", null);

        ((ViewPager) container).addView(itemView);
        return itemView;

}

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // Remove viewpager_item.xml from ViewPager
        ((ViewPager) container).removeView((LinearLayout) object);

    }
}

1 个答案:

答案 0 :(得分:0)

使用自定义适配器时,总是尝试为ListView性能实现ViewHolder设计模式,并使用自定义过滤器功能代替Filterable实现:

自定义过滤器功能需要两个数组列表一个是可过滤数据列表,另一个是用于原始数据列表:

public void filter(String constraint) {
   filterData.clear();
   if (constraint.length() == 0) {
       filterData.addAll(orignalData);
   }else{
       for (HashMap<String,String> row: orignalData) {
            if(row.get(Cardiology_updates.UpdateTitle).toUpperCase().startsWith(constraint.toString().toUpperCase())){
               filterData.add(row);
            }
        }
   }
   notifyDataSetChanged();
}

示例:

et.addTextChangedListener(new TextWatcher() {
    @Override
    public void afterTextChanged(Editable arg0) {
        adapter.filter(arg0.toString());
    }
    @Override
    public void beforeTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) {

    }
    @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) {

    }
});

public class UpdatesAdapterList extends BaseAdapter {

    private Context context;
    private ArrayList<HashMap<String,String>> filterData;
    private ArrayList<HashMap<String,String>> orignalData;
    public ImageLoader imageLoader;

    public UpdatesAdapterList(Context context,ArrayList<HashMap<String, String>> orignalData) {
        this.context = context;
        this.orignalData = orignalData;
        filterData = new ArrayList<HashMap<String,String>>();
        filterData.addAll(this.orignalData);
        imageLoader = new ImageLoader(this.context);
    }

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

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

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

    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.listview_updateitem, null);
            holder.UpdateTitle = (TextView) convertView.findViewById(R.id.txtUpdatetitle);
            holder.UpdateImage = (ImageView) convertView.findViewById(R.id.list_UpdateImage);

            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        holder.UpdateTitle.setText(filterData.get(position).get(Cardiology_updates.UpdateTitle));

        imageLoader.DisplayImage(filterData.get(position).get(Cardiology_updates.UpdateImage), holder.UpdateImage);
        // Capture ListView item click
        convertView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Intent intent = new Intent(context, UpdateSingleItemViewActivity.class);
                // Pass all data rank
                intent.putExtra("UpdateTile", filterData.get(position).get(Cardiology_updates.UpdateTitle));
                // Pass all data country
                intent.putExtra("UpdateDescription", filterData.get(position).get(Cardiology_updates.UpdateDescription));
                // Pass all data population
                intent.putExtra("population",filterData.get(position).get(Cardiology_updates.POPULATION));
                // Pass all data flag
                intent.putExtra("UpdateImage", filterData.get(position).get(Cardiology_updates.UpdateImage));
                // Start SingleItemView Class
                intent.putExtra("position", position);
                context.startActivity(intent);
            }
        });
        return convertView;
    }

    class ViewHolder{
        TextView UpdateTitle;
        ImageView UpdateImage;
    }

    public void filter(String constraint) {
        filterData.clear();
        if (constraint.length() == 0) {
            filterData.addAll(orignalData);
        }else{
            for (HashMap<String,String> row: orignalData) {
                if(row.get(Cardiology_updates.UpdateTitle).toUpperCase().startsWith(constraint.toString().toUpperCase())){
                    filterData.add(row);
                }
            }
        }
        notifyDataSetChanged();
    }
}