java.lang.ClassCastException:java.util.HashMap无法强制转换为java.util.Collection

时间:2016-07-04 22:56:33

标签: java android

我想在我的应用中添加搜索功能。主要是它将json数据检索到List中。

这是我的代码

MainActivity main;
Context context;
LayoutInflater inflater;
ArrayList<HashMap<String, String>> data;
ImageLoader imageLoader;
HashMap<String, String> resultp = new HashMap<String, String>();

private ArrayList<WorldPopulation> arrayList;





public ListViewAdapter(Context context,
                       ArrayList<HashMap<String, String>> arraylist) {
    this.context = context;
    data = arraylist;
    imageLoader = new ImageLoader(context);
}
public class ViewHolder {
    TextView rank;
    TextView country;
    TextView population;
    ImageView flag;
}
@Override
public int getCount() {
    return data.size();
}

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

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

public View getView(final int position, View view, ViewGroup parent) {
    // Declare Variables
    TextView rank;
    TextView country;
    TextView population;
    ImageView flag;

    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View itemView = inflater.inflate(R.layout.listview_item, parent, false);
    // Get the position
    resultp = data.get(position);

    // Locate the TextViews in listview_item.xml
    //rank = (TextView) itemView.findViewById(R.id.rank);
    country = (TextView) itemView.findViewById(R.id.country);
    // population = (TextView) itemView.findViewById(R.id.population);

    // Locate the ImageView in listview_item.xml
    flag = (ImageView) itemView.findViewById(R.id.flag);

    // Capture position and set results to the TextViews
    // rank.setText(resultp.get(MainActivity.VIDEO_ID));
    country.setText(resultp.get(MainActivity.TITLE));
    // population.setText(resultp.get(MainActivity.DESCRIPTION));
    // Capture position and set results to the ImageView
    // Passes flag images URL into ImageLoader.class
    imageLoader.DisplayImage(resultp.get(MainActivity.imgURL), flag);
    // Capture ListView item click
    mPublisherInterstitialAd = new PublisherInterstitialAd(context);
    mPublisherInterstitialAd.setAdUnitId("ca-app-pub-7500090319214897/8263070161");

    mPublisherInterstitialAd.setAdListener(new AdListener() {
        @Override
        public void onAdClosed() {
            requestNewInterstitial();

        }
    });

    requestNewInterstitial();

    itemView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // Get the position

                resultp = data.get(position);
                Intent intent = new Intent(context, PlayerViewDemoActivity.class);
                intent.putExtra("videoId", resultp.get(MainActivity.VIDEO_ID));
                context.startActivity(intent);


        }
    });
    return itemView;


}

// Filter Class
public void filter(String charText) {
    charText = charText.toLowerCase(Locale.getDefault());
    data.clear();
    if (charText.length() == 0) {
        data.addAll((Collection<? extends HashMap<String, String>>) resultp);

    } else {
        for (HashMap<String, String> wp : (Collection<? extends HashMap<String, String>>) resultp) {
            if (wp.get(MainActivity.TITLE).toLowerCase(Locale.getDefault())
                    .contains(charText)) {
                data.add(wp);


            }
        }
    }
    notifyDataSetChanged();
}

我在这段代码中遇到了一些错误。我能解决吗? 我堆叠超过15天。帮助我。

这是我的错误

java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.Collection
    at com.sextech.noui.ListViewAdapter.filter(ListViewAdapter.java:154)
    at com.sextech.noui.MainActivity$DownloadJSON$1.afterTextChanged(MainActivity.java:230)
    at android.widget.TextView.sendAfterTextChanged(TextView.java:7822)
    at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:9635)
    at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:976)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:520)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:454)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:33)
    at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:690)
    at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:450)
    at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:349)
    at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:82)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5593)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

主要活动

// Declare Variables
JSONObject jsonobject;
JSONArray jsonarray;
ListView listview;
ListViewAdapter adapter;
private ProgressBar spinner;
ArrayList<HashMap<String, String>> arraylist;
private AdView mAdView;
private InterstitialAd interstitial;
private long lastPressedTime;
public   static String imgURL = "url";
public static String VIDEO_ID = "videoId";
public static String TITLE = "title";
EditText editsearch;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    final WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
    final  boolean b=wifiManager.isWifiEnabled();

    ConnectivityManager cManager=(ConnectivityManager)getSystemService(this.CONNECTIVITY_SERVICE);
    final NetworkInfo nInfo=cManager.getActiveNetworkInfo();
    if(nInfo!=null&& nInfo.isConnected()) {
        Toast.makeText(this, "You are Connected to the Internet", Toast.LENGTH_LONG).show();
        setContentView(R.layout.listview_main);
        spinner = (ProgressBar)findViewById(R.id.progressBar1);
        new DownloadJSON().execute();
        AdView mAdView = new AdView(this);
        mAdView.setAdSize(AdSize.SMART_BANNER);

        // Gets the ad view defined in layout/ad_fragment.xml with ad unit ID set in
        // values/strings.xml.
        mAdView = (AdView) findViewById(R.id.ad_view);


        // Create an ad request. Check logcat output for the hashed device ID to
        // get test ads on a physical device. e.g.
        // "Use AdRequest.Builder.addTestDevice("ABCDEF012345") to get test ads on this device."
        AdRequest adRequest = new AdRequest.Builder()
                .addTestDevice("")
                .build();

        // Start loading the ad in the background.
        mAdView.loadAd(adRequest);


    }
    else {

        new AlertDialog.Builder(this)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setTitle("Your DATA Connection is Currently Unreachable")
                .setMessage("Connect your WiFi or 2G/3G DATA Connection")
                .setPositiveButton("WiFi ", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        try {
                            new Handler().postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    final Intent mainIntent = new Intent(MainActivity.this, MainActivity.class);
                                    MainActivity.this.startActivity(mainIntent);
                                    MainActivity.this.finish();
                                }
                            }, 5000);
                            wifiManager.setWifiEnabled(true);

                            Toast.makeText(MainActivity.this, "WiFi Enabling in 5sec Please Wait", Toast.LENGTH_LONG).show();
                        } catch (Exception e) {
                            throw new RuntimeException(e);

                        }

                    }
                })
                .setNegativeButton("3G/2G ", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //use here tablayout to work when 3G/2G connecion is available

                        new Handler().postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                final Intent mainIntent = new Intent(MainActivity.this, MainActivity.class);
                                MainActivity.this.startActivity(mainIntent);
                                MainActivity.this.finish();
                            }
                        }, 5000);

                        Intent myints = new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS);
                        Toast.makeText(MainActivity.this, "Your DATA Connection is NOW Connected", Toast.LENGTH_LONG).show();
                        startActivity(myints);

                    }
                })

                .setNeutralButton("Exit", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this, "To use this Application you have to Connected to the Internet", Toast.LENGTH_LONG).show();
                        finish();
                    }
                })


                .setCancelable(false)
                .show();

    }

}

public class DownloadJSON extends AsyncTask<Void, Void, Void> {

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

        spinner.setVisibility(View.VISIBLE);
    }

    @Override
    protected Void doInBackground(Void... params) {
        // Create an array
        arraylist = new ArrayList<HashMap<String, String>>();


        // Retrieve JSON Objects from the given URL address
        jsonobject = JSONfunctions.getJSONfromURL("https://www.googleapis.com/youtube/v3/search?part=id%2Csnippet&q=bangla+video+song&maxResults=50&key=AIzaSyAFfA9cCFpmsyK5byKaRWE_oQKjjsABuxI");

        try {
            // Locate the array name in JSON

            JSONArray jsonarray = jsonobject.getJSONArray("items");

            for (int i = 0; i < jsonarray.length(); i++) {
                HashMap<String, String> map = new HashMap<String, String>();
                jsonobject = jsonarray.getJSONObject(i);
                // Retrive JSON Objects
                JSONObject jsonObjId = jsonobject.getJSONObject("id");
                map.put("videoId", jsonObjId.getString("videoId"));

                JSONObject jsonObjSnippet = jsonobject.getJSONObject("snippet");
                map.put("title", jsonObjSnippet.getString("title"));

                //map.put("description", jsonObjSnippet.getString("description"));
                // map.put("flag", jsonobject.getString("flag"));

                JSONObject jsonObjThumbnail = jsonObjSnippet.getJSONObject("thumbnails");
                String imgURL = jsonObjThumbnail.getJSONObject("high").getString("url");
                map.put("url",imgURL);


                // Set the JSON Objects into the array
                arraylist.add(map);
            }
        } catch (JSONException e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void args) {
        // Locate the listview in listview_main.xml
        listview = (ListView) findViewById(R.id.listview);
        // Pass the results into ListViewAdapter.java
        adapter = new ListViewAdapter(MainActivity.this, arraylist);
        // Set the adapter to the ListView
        listview.setAdapter(adapter);
        // Close the progressdialog
        spinner.setVisibility(View.GONE);

        editsearch = (EditText) findViewById(R.id.search);

        // Capture Text in EditText
        editsearch.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
                String text = editsearch.getText().toString().toLowerCase(Locale.getDefault());
                adapter.filter(text);
            }

            @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) {
                // TODO Auto-generated method stub
            }
        });

    }
}


// Dialouge Box
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    //Handle the back button
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        //Ask the user if they want to quit
        new android.support.v7.app.AlertDialog.Builder (this)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setTitle(R.string.quit)
                .setMessage(R.string.really_quit)
                .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        //Stop the activity
                        MainActivity.this.finish();
                    }

                })


                .setNeutralButton(R.string.neutral, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getApplicationContext(), "Rate This App", Toast.LENGTH_SHORT).show();
                        startActivity(new Intent("android.intent.action.VIEW", Uri.parse("https://play.google.com/store/apps/details?id=com.vdoapps.banglatube")));
                    }
                })

                .setNegativeButton(R.string.no, null)
                .show();

        return true;
    } else {
        return super.onKeyDown(keyCode, event);
    }

}

}

1 个答案:

答案 0 :(得分:2)

HashMap未实施Collection。因此,您无法将广告HashMap输入Collection

在您的情况下,不需要类型转换。 resultp类型的HashMap对象,数据对象的类型为ArrayList<HashMap>,因此您只需执行data.add(resultp)

对于循环,你根本不需要循环。

if (resultp.get(MainActivity.TITLE).toLowerCase(Locale.getDefault()) .contains(charText)) { 
  data.add(resultp);
 }