-1

I try to migrate from ListView to RecyclerView. And i have got error on setOnItemClickListener. An error say: Cannot resolve method 'setOnItemClickListener(anonymous android.widget.AdapterView.OnItemClickListener)' I have no idea with this error. Can anyone help me to migrating to recycler view?

Here is screenshot error in MainActivity.java

Here is screenshot error

This is MainActivity.java code:

 package com.example.rssreader;

    import android.content.Intent;
    import android.net.Uri;
    import android.os.AsyncTask;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.recyclerview.widget.RecyclerView;

    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;

    import java.io.IOException;
    import java.io.InputStream;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.ArrayList;
    import android.app.ProgressDialog;

    import com.google.android.gms.ads.AdLoader;
    import com.google.android.gms.ads.AdRequest;
    import com.google.android.gms.ads.AdView;
    import com.google.android.gms.ads.MobileAds;
    import com.google.android.gms.ads.formats.UnifiedNativeAd;
    import com.google.android.gms.ads.reward.RewardedVideoAd;

    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserException;
    import org.xmlpull.v1.XmlPullParserFactory;

    public class MainActivity extends AppCompatActivity {

    RecyclerView myRss;
    ArrayList titles;
    ArrayList links;

    private AdView mAdView;


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

        // Initialize the Google Mobile Ads SDK
        MobileAds.initialize(this,
                getString(R.string.admob_app_id));

        // Admob
        mAdView = findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);

        // タップイベント
        myRss = (RecyclerView) findViewById(R.id.myRss);

        titles = new ArrayList();
        links = new ArrayList();

        myRss.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) {

                Uri uri = Uri.parse(links.get(position));
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);
            }
        });

        new ProcessInBackground().execute();


    }


    // ネットワーク接続
    public InputStream getInputStream(URL url)
    {
        try{
            return  url.openConnection().getInputStream();
        }
        catch (IOException e)
        {
            return null;
        }
    }



    // XML
    // https://blog.codecamp.jp/feed.xml
    public class ProcessInBackground extends AsyncTask
    {
        ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
        Exception exception = null;

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

            progressDialog.setMessage("Loading Data");
            progressDialog.show();

        }

        @Override
        protected String doInBackground(Integer... integers) {
            try{
                URL url = new URL("https://blog.codecamp.jp/feed.xml");
                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                factory.setNamespaceAware(false);
                XmlPullParser xpp = factory.newPullParser();
                xpp.setInput(getInputStream(url), "UTF_8");
                boolean insideItem = false;
                int eventType = xpp.getEventType();

                while (eventType != XmlPullParser.END_DOCUMENT)
                {
                    if (eventType == XmlPullParser.START_TAG)
                    {
                        if (xpp.getName().equalsIgnoreCase("item"))
                        {
                            insideItem = true;
                        }
                        else if (xpp.getName().equalsIgnoreCase("title"))
                        {
                            if (insideItem)
                            {
                                titles.add(xpp.nextText());
                            }
                        }
                        else if (xpp.getName().equalsIgnoreCase("link"))
                        {
                            if (insideItem)
                            {
                                links.add(xpp.nextText());
                            }
                        }
                    }
                    else if (eventType == XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item"))
                    {
                        insideItem = false;
                    }
                    eventType = xpp.next();
                }

            } catch (XmlPullParserException e) {
                e.printStackTrace();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


            return null;
        }

        // 読み込んだ XMLデータを画面出力
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            ArrayAdapter adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, titles);
            myRss.setAdapter(adapter);

            progressDialog.dismiss();

        }
    }

    }

And this is app gradle file:

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId 'com.example.rssreader'
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.recyclerview:recyclerview:1.1.0-beta01'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'

    implementation 'com.pascalwelsch.arrayadapter:arrayadapter:1.2.0'
    implementation 'com.google.firebase:firebase-ads:18.1.1'
    implementation 'com.google.android.gms:play-services-ads:18.1.1'

    implementation "androidx.constraintlayout:constraintlayout:1.1.3"

}

apply plugin: 'com.google.gms.google-services'
veby91
  • 63
  • 1
  • 7
  • Share the logcat output – Yash Aug 12 '19 at 03:29
  • I can't run that code. But this error say Cannot resolve method 'setOnItemClickListener(anonymous android.widget.AdapterView.OnItemClickListener)' – veby91 Aug 12 '19 at 03:41
  • RecyclerView dosen't have `SetOnItemClickListener` .Check this post for alternate ways in which you can achieve the item click. https://stackoverflow.com/questions/24885223/why-doesnt-recyclerview-have-onitemclicklistener – Sunil Sunny Aug 12 '19 at 03:43

1 Answers1

1

Recyclerview does not provide setOnItemClickListener() you have to add your own interface in your adapter . Create interface as following :-

    public interface OnItemClickListener{
      void onClicked(Uri item,int position);
     }

Now set a onclick listener on every item in onBindViewHolder() . and call listener.onClicked(uris.get(i),i);

Don't forget to initialize listener object of OnItemClickListener . Simplest way is doing it in constructor

    public CustomAdapter(Context context,ArrayList<Uri> uris,OnItemClickListener listener){
    this.context=context;
    this.uris=uris;
    this.listener = listener;
    }
Aashit Shah
  • 578
  • 3
  • 9