RecyclerViewAdapter Folgende Fehlermeldung

  • Antworten:15
  • Bentwortet
Isabel
  • Forum-Beiträge: 17

12.08.2018, 22:26:33 via Website

Hi, beim Kompilieren kommt folgende Fehlermeldung. Vielleicht kann mir jemand behilflich sein. Vielen Dank
VG

Do not treat position as fixed; only use immediately and call holder.getAdapterPosition() to look it up later [RecyclerView]
public void onBindViewHolder(ViewHolder holder, final int position) {

public class RecyclerViewAdapter extends RecyclerView.Adapter{

private static final String TAG = "RecyclerViewAdapter";

private ArrayList<String> mImageNames = new ArrayList<>();
private ArrayList<String> mImages = new ArrayList<>();
private Context mContext;

public RecyclerViewAdapter(Context context, ArrayList<String> imageNames, ArrayList<String> images ) {
    mImageNames = imageNames;
    mImages = images;
    mContext = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_listitem, parent, false);
    ViewHolder holder = new ViewHolder(view);
    return holder;
}

//Die Stelle

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
Log.d(TAG, "onBindViewHolder: called.");

    Glide.with(mContext)
            .asBitmap()
            .load(mImages.get(position))
            .into(holder.image);

    holder.imageName.setText(mImageNames.get(position));

    holder.parentLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.d(TAG, "onClick: clicked on: " + mImageNames.get(position));

            Toast.makeText(mContext, mImageNames.get(position), Toast.LENGTH_SHORT).show();

            Intent intent = new Intent(mContext, GalleryActivity.class);
            intent.putExtra("image_url", mImages.get(position));
            intent.putExtra("image_name", mImageNames.get(position));
            mContext.startActivity(intent);
        }
    });
}

@Override
public int getItemCount() {
    return mImageNames.size();
}


public class ViewHolder extends RecyclerView.ViewHolder{

    CircleImageView image;
    TextView imageName;
    RelativeLayout parentLayout;

    public ViewHolder(View itemView) {
        super(itemView);
        image = itemView.findViewById(R.id.image);
        imageName = itemView.findViewById(R.id.image_name);
        parentLayout = itemView.findViewById(R.id.parent_layout);
    }
}

}

Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

13.08.2018, 05:51:32 via Website

Hallo
Eigentlich sagt die Fehlermeldung doch schon einiges aus.
Wenn du eine Methode überschreibst dann ändere nichts an der Parameter Übergabe.

public void onBindViewHolder(ViewHolder holder, int position) {

Nur int nicht final int.

Hilfreich?
Isabel
Kommentieren
Isabel
  • Forum-Beiträge: 17

13.08.2018, 17:54:33 via Website

Vielen Dank für die schnelle Antwort. Ich hatte mal schon das ohne final probiert, dann kommt folgende Fehlermeldung:

public void onBindViewHolder(ViewHolder holder, int position) {
error: local variable position is accessed from within inner class; needs to be declared final 
Hilfreich?
Kommentieren
Ludy
  • Admin
  • Forum-Beiträge: 7.958

13.08.2018, 18:28:29 via App

Hallo Isabel,

herzlich willkommen hier im Forum (*)

dazu musst du in der sub-class, wie in der Fehlermeldung holder.getAdapterPosition() verwenden

— geändert am 13.08.2018, 18:28:43

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Hilfreich?
Isabel
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

13.08.2018, 18:47:10 via Website

Hi,
bei mir sieht der Aufruf so aus , wurde automatisch Importiert.

public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position){

— geändert am 13.08.2018, 19:09:27

Hilfreich?
Isabel
Kommentieren
Isabel
  • Forum-Beiträge: 17

13.08.2018, 20:38:17 via Website

der selbe Fehler.

error: local variable position is accessed from within inner class; needs to be declared final

Hilfreich?
Kommentieren
Isabel
  • Forum-Beiträge: 17

13.08.2018, 21:39:16 via Website

holder.getAdapterPosition() versucht?

Ja, habe versucht, immer noch Fehler ((

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

13.08.2018, 22:06:47 via Website

Hi versuche es mal so

enter code here
 public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{

    private static final String TAG = "RecyclerViewAdapter";

    private ArrayList<String> mImageNames = new ArrayList<>();
    private ArrayList<String> mImages = new ArrayList<>();
    private Context mContext;

    public RecyclerViewAdapter(Context context, ArrayList<String> imageNames, ArrayList<String> images ) {
        mImageNames = imageNames;
        mImages = images;
        mContext = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_listitem, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

//Die Stelle

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        Log.d(TAG, "onBindViewHolder: called.");

        Glide.with(mContext)
                .asBitmap()
                .load(mImages.get(position))
                .into(holder.image);

        holder.imageName.setText(mImageNames.get(position));

        holder.parentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d(TAG, "onClick: clicked on: " + mImageNames.get(position));

                Toast.makeText(mContext, mImageNames.get(position), Toast.LENGTH_SHORT).show();

                Intent intent = new Intent(mContext, GalleryActivity.class);
                intent.putExtra("image_url", mImages.get(position));
                intent.putExtra("image_name", mImageNames.get(position));
                mContext.startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() {
        return mImageNames.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder{

        CircleImageView image;
        TextView imageName;
        RelativeLayout parentLayout;

        public ViewHolder(View itemView) {
            super(itemView);
            image = itemView.findViewById(R.id.image);
            imageName = itemView.findViewById(R.id.image_name);
            parentLayout = itemView.findViewById(R.id.parent_layout);
        }
    }

}

}

Hilfreich?
Isabel
Kommentieren
Ludy
  • Admin
  • Forum-Beiträge: 7.958

13.08.2018, 22:17:30 via Website

Hierbei sollte kein Fehler beim compiling entstehen, selber eben getestet.

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
Log.d(TAG, "onBindViewHolder: called.");

    Glide.with(mContext)
            .asBitmap()
            .load(mImages.get(position))
            .into(holder.image);

    holder.imageName.setText(mImageNames.get(position));

    holder.parentLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.d(TAG, "onClick: clicked on: " + mImageNames.get(holder.getAdapterPosition()));

            Toast.makeText(mContext, mImageNames.get(holder.getAdapterPosition()), Toast.LENGTH_SHORT).show();

            Intent intent = new Intent(mContext, GalleryActivity.class);
            intent.putExtra("image_url", mImages.get(holder.getAdapterPosition()));
            intent.putExtra("image_name", mImageNames.get(holder.getAdapterPosition()));
            mContext.startActivity(intent);
        }
    });
}

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Hilfreich?
Isabel
Kommentieren
Isabel
  • Forum-Beiträge: 17

13.08.2018, 22:34:17 via Website

das ist sehr nett, dass Sie mir helfen, habe eben den Code ausprobieren, habe Bildschirmfoto gemacht.
Siehe das Bild
image

Hilfreich?
Kommentieren
Isabel
  • Forum-Beiträge: 17

13.08.2018, 22:36:03 via Website

Liegt das vielleicht an bundle.grade?

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

}

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0-rc01'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:recyclerview-v7:28.0.0-rc01'
implementation 'de.hdodenhof:circleimageview:2.2.0'
implementation 'com.github.bumptech.glide:glide:4.7.1'
}

oder muss aufgeben. Trotzdem vielen besten Dank :)

Hilfreich?
Kommentieren
Ludy
  • Admin
  • Forum-Beiträge: 7.958

14.08.2018, 04:51:38 via Website

Sorry, muss natürlich
public void onBindViewHolder(final ViewHolder holder, int position) {
heißen!

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Hilfreich?
Isabel
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

14.08.2018, 05:19:41 via Website

Hi hast du dir mein Beispiel richtig angesehen vor allen die erste Zeile

  public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{

Du extendest den Adapter nicht richtig. Das mit dem final ist nicht wichtig auch in meinen Programmen benutze ich final für beide Parameter. Wenn Du Dir Beispiele im Netz an schaust ist es auch immer so.

In deinem letzten Bild ist auch der holder rot unterstrichen solange da etwas rot ist werden immer Compiler Fehler kommen.

Dein anfangs Code war eigentlich richtig nach dem ich die erste Zeile geändert hatte war nichts mehr rot bis auf die Ressourcen die ich natürlich nicht habe und Klassen . Habe das dann alles ersetzt und konnte compilieren.

An dem gradle liegt es nicht Du hast die richtige lib eingebunden.

@ludy holder.getAdapterPosition() wird wenig bringen denn sie ist in einer callback Methode wo sie auf "position" zugreifen will. Dort hat sie auch die Variable "holder" nicht.
Bei deinem Versuch bist du nicht in einer Callback Methode und da hast du sowie so zugriff auf die Variablen.
So mit muss sie den Trick mit final machen was auch in diesem Fall kein Problem ist.
Denn sie verändert den Werd nicht list in so zusagen nur.

Wie gesagt leite die Klasse richtig ab.

— geändert am 14.08.2018, 06:45:43

Hilfreich?
Isabel
Kommentieren
Isabel
  • Forum-Beiträge: 17

15.08.2018, 20:37:15 via Website

Hi,
ich habe gesamten Kode schritt für schritt durchgegangen, App startet zummendest, wenn ich folgende Zeile auskommentiere. Gibt es andere Lösung vielleicht? Vielen Dank

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";

//vars
private ArrayList<String> mNames = new ArrayList<>();
private ArrayList<String> mImageUrls = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d(TAG, "onCreate: started.");

    initImageBitmaps();
}

private void initImageBitmaps(){
    Log.d(TAG, "initImageBitmaps: preparing bitmaps.");

//Hier liegt das Problem.

mImageUrls.add("....Jordan_Lipofsky.jpg");
mNames.add("Havasu Falls");

    initRecyclerView();
}

private void initRecyclerView(){
    Log.d(TAG, "initRecyclerView: init recyclerview.");
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerv_view);
    RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, mNames, mImageUrls);
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
}

}

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

15.08.2018, 21:55:24 via Website

Hi
Du darfst in in einer Activity Klasse nicht im Klassen Rumpf die Liste initialisieren.
Nur primitive Datentypen können gleich Initialisiert werden.
Komplexe Datentypen nur als Argument im Klassen Rumpf.

Im Rumpf

private ArrayList<String> mNames ;

In der onCreate

 mNames = new ArrayList<>();

— geändert am 16.08.2018, 11:52:55

Hilfreich?
Kommentieren