簡體   English   中英

使用edittext搜索數據列表視圖

[英]Search an data listview using edittext

我正在使用themoviedb API創建電影目錄應用。 如何使用EditText實現搜索?

我有一個包含電影信息的列表視圖。

應用截圖:

現在,我想使用EditText查找另一部電影,並且更新列表視圖。 我怎么做?

我的裝載機:

public class MyAsyncTaskLoader extends AsyncTaskLoader<ArrayList<MovieItem>> {

    public ArrayList<MovieItem> mData;
    public boolean hasResult = false;

    public MyAsyncTaskLoader(final Context context) {
        super(context);
        onContentChanged();
        Log.d("INIT ASYNCLOADER","1");
    }

    @Override
    protected void onStartLoading() {
        Log.d("Content Changed","1");
        if (takeContentChanged())
            forceLoad();
        else if (hasResult)
            deliverResult(mData);
    }

    @Override
    public void deliverResult(final ArrayList<MovieItem> data) {
        mData = data;
        hasResult = true;
        super.deliverResult(data);
    }

    @Override
    protected void onReset() {
        super.onReset();
        onStopLoading();
        if (hasResult) {
            onReleaseResources(mData);
            mData = null;
            hasResult = false;
        }
    }

    public static String Search = "Avengers";
    public static String API_KEY = "f00e74c69ff0512cf9e5bf128569f6b5";

    @Override
    public ArrayList<MovieItem> loadInBackground() {
        Log.d("LOAD BG","1");
        SyncHttpClient client = new SyncHttpClient();
        final ArrayList<MovieItem> movieItemses = new ArrayList<>();
        final String url = "https://api.themoviedb.org/3/search/movie?api_key="+API_KEY+"&language=en-US&query="+Search;
                client.get(url, new AsyncHttpResponseHandler() {
            @Override
            public void onStart() {
                super.onStart();
                setUseSynchronousMode(true);
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers,
                                  byte[] responseBody) {
                try {
                    String result = new String(responseBody);
                    JSONObject responseObject = new JSONObject(result);
                    JSONArray list = responseObject.getJSONArray("results");

                    for (int i = 0 ; i < list.length() ; i++){
                        JSONObject movie = list.getJSONObject(i);
                        MovieItem movieItems = new MovieItem(movie);
                        movieItemses.add(movieItems);
                    }
                    Log.d("REQUEST SUCCESS","1");
                }catch (Exception e){
                    e.printStackTrace();
                    Log.d("REQUEST FAILED","1");
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers,
                                  byte[] responseBody, Throwable error) {
            }
        });

        for (int i = 0 ; i< movieItemses.size() ; i++){
            Log.d("Title",movieItemses.get(i).getTitle());
        }
        Log.d("BEFORE RETURN","1");

        return movieItemses;
    }

    protected void onReleaseResources(ArrayList<MovieItem> data) {
        //nothing to do.
    }
    public ArrayList<MovieItem> getResult() {
        return mData;
    }
}

我的適配器:

public class MovieAdapter extends BaseAdapter {

    private ArrayList<MovieItem> mData = new ArrayList<>();
    private LayoutInflater mInflater;
    private Context context;
    Activity activity;

    private String urlConfig ;
    public MovieAdapter(Context context) {
        this.context = context;
        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void setData(ArrayList<MovieItem> items){
        mData = items;
        notifyDataSetChanged();
    }

    public void clearData(){
        mData.clear();
    }

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

    @Override
    public int getViewTypeCount() {
        return 1;
    }

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

    @Override
    public MovieItem getItem(int position) {
        return mData.get(position);
    }

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

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

            convertView = mInflater.inflate(R.layout.item_row_film, null);

            holder.textViewuJudul= (TextView)convertView.findViewById(R.id.tv_judul);

            holder.textViewDescription = (TextView)convertView.findViewById(R.id.tv_deskripsi);
            holder.textViewRate = (TextView)convertView.findViewById(R.id.tv_rate);
            holder.imgPoster = (ImageView) convertView.findViewById(R.id.img_poster);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.textViewuJudul.setText(mData.get(position).getTitle());
        holder.textViewDescription.setText(mData.get(position).getDescription());
        holder.textViewRate .setText(mData.get(position).getRate());
        Picasso.with(context).load(mData.get(position).getImgurl()).into(holder.imgPoster);
        return convertView;
    }

    private class ViewHolder {
        public TextView textViewuJudul;
        public TextView textViewDescription;
        public TextView textViewRate;
        public ImageView imgPoster;
    }}

項目:

public class MovieItem  {

    public static String POSTER_BASE_URL = "http://image.tmdb.org/t/p/";
    private int id;
    private String title;
    private String description;
    private String rate;
    private String imgurl;

    public  MovieItem(JSONObject object){

        try {
            String title = object.getString("title");
            String description = object.getString("overview");
            double movieRatet = object.getDouble("vote_average");
            String movieRate = new DecimalFormat("#.#").format(movieRatet);
            String releaseDate = object.getString("release_date");
            String posterUrl = object.getString("poster_path");
            posterUrl = POSTER_BASE_URL + "w185" + posterUrl;
            description = description.length() > 64 ? description.substring(0,64)+"...":description;

            Log.d("movie poster", posterUrl);
            Log.d("movie title ", title);
            Log.d("movie description ", description);
            Log.d("movie release ", releaseDate);



            this.title = title;
            this.description = description;
            this.rate = releaseDate;
            this.imgurl = posterUrl;


        }catch (Exception e){

            e.printStackTrace();
        }
    }

我的主要活動:

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<ArrayList<MovieItem>>
        ,View.OnClickListener{

    ListView listView;
    MovieAdapter adapter;
    MyAsyncTaskLoader myAsyncTaskLoader;
    private TextView edt_cari;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        edt_cari = (TextView) findViewById(R.id.edt_cari);


        adapter = new MovieAdapter(this);
        adapter.notifyDataSetChanged();
        listView = (ListView) findViewById(R.id.listView);

        listView.setAdapter(adapter);
        getLoaderManager().initLoader(0, null, this);

    }

    @Override
    public Loader<ArrayList<MovieItem>> onCreateLoader(int id, Bundle args) {
        Log.d("Create Loader", "1");
        return new MyAsyncTaskLoader(this);
    }

    @Override
    public void onLoadFinished(Loader<ArrayList<MovieItem>> loader, ArrayList<MovieItem> data) {
        Log.d("Load Finish","1");
        adapter.setData(data);
    }

    @Override
    public void onLoaderReset(Loader<ArrayList<MovieItem>> loader) {
        Log.d("Load Reset","1");
        adapter.setData(null);
    }

    @Override
    public void onClick(View v) {

        if (v.getId() == R.id.btn_cari){
            SearchMovieTask searchMovie = new SearchMovieTask();
            searchMovie.execute(edt_cari.getText().toString().trim());

        }
    }

    private class SearchMovieTask extends AsyncTask<String,Void,String>{

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... params) {
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
        }
    }}

將您的MovieAdapter替換為此...!

 public class MovieAdapter extends BaseAdapter implements Filterable {

        private ArrayList<MovieItem> mData = new ArrayList<>();
        private ArrayList<MovieItem> mSearchData = new ArrayList<>();
        private ArrayList<MovieItem> categoryListOne = new ArrayList<>();
        private LayoutInflater mInflater;
        private Context context;
        Activity activity;
        ItemFilter mFilter = new ItemFilter();

        private String urlConfig;

        public MovieAdapter(Context context) {
            this.context = context;
            mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        public void setData(ArrayList<MovieItem> items) {
            mData = items;
            mSearchData = items;
            notifyDataSetChanged();
        }

        public void clearData() {
            mData.clear();
        }

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

        @Override
        public int getViewTypeCount() {
            return 1;
        }

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

        @Override
        public MovieItem getItem(int position) {
            return mData.get(position);
        }

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

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

                convertView = mInflater.inflate(R.layout.item_row_film, null);

                holder.textViewuJudul = (TextView) convertView.findViewById(R.id.tv_judul);

                holder.textViewDescription = (TextView) convertView.findViewById(R.id.tv_deskripsi);
                holder.textViewRate = (TextView) convertView.findViewById(R.id.tv_rate);
                holder.imgPoster = (ImageView) convertView.findViewById(R.id.img_poster);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            holder.textViewuJudul.setText(mData.get(position).getTitle());
            holder.textViewDescription.setText(mData.get(position).getDescription());
            holder.textViewRate.setText(mData.get(position).getRate());
            Picasso.with(context).load(mData.get(position).getImgurl()).into(holder.imgPoster);
            return convertView;
        }

        @Override
        public Filter getFilter() {
            return mFilter;
        }

        public class ItemFilter extends Filter {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {

                constraint = constraint.toString().toLowerCase().replace(" ", "");
                Log.v("DataAdapter", "constratinst : " + constraint);
                FilterResults result = new FilterResults();
                if (constraint.toString().length() > 0) {
                    ArrayList<Sticker> filteredItems =
                            new ArrayList<>();
                    for (int i = 0, l = mData.size(); i < l; i++) {
                        // ArrayList<HashMap<String, String>> p =
                        // originalList.get(i);
                        String p = mData.get(i).getName().toLowerCase().replace(" ", "");
                        if (p.toLowerCase().startsWith(String.valueOf(constraint)))
                            filteredItems.add(mData.get(i));

    //                    if (p.toLowerCase().contains(constraint))
    //                        filteredItems.add(categoryListSearch.get(i));
                    }
                    Log.v("DataAdapter", "not blank");
                    result.count = filteredItems.size();
                    result.values = filteredItems;

                } else {
                    synchronized (this) {
                        result.count = categoryListOne.size();
                        result.values = categoryListOne;
    //                    result.values = dataList;
    //                    result.count = dataList.size();
                    }
                }
                return result;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                // users = (List<GraphUser>) results.values;
                //filteredData = (ArrayList<String>) results.values;
                mData = (ArrayList<MovieItem>) results.values;
                notifyDataSetChanged();

    //            for (int i = 0, l = mData.size(); i < l; i++)
    //                mSearchData.get(i);
                //add(productList.get(i));

                notifyDataSetInvalidated();
            }
        }


        private class ViewHolder {

            public TextView textViewuJudul;
            public TextView textViewDescription;
            public TextView textViewRate;
            public ImageView imgPoster;


        }

    }

並且您的活動將EditText Listener設置為此。

editText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                }

                @Override
                public void afterTextChanged(Editable editable) {
                     adapter.getFilter().filter(charSequence.toString());
                }
            });

我希望它對您有幫助..!

在搜索EditText上實現addTextChangedListener() ,隨着文本更改filter列表數據並使用過濾后的數據更新MovieAdapter

查看如何更新自定義列表適配器后

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM