Ich habe die Dokumentation zur Verwendung von GridView befolgt und hatte das gleiche Problem wie dieser Typ. ImageAdapter kann nicht auf eine Fragmentklasse angewendet werden

Der Code in meiner Fragmentklasse lautet wie folgt

public class SecondFragment extends Fragment {

    View myView;
    GridView gridview;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        myView = inflater.inflate(R.layout.second_layout, container, false);
        gridview = (GridView) myView.findViewById(R.id.gridview);
        gridview.setAdapter(new ImageAdapter(getActivity()));
        return myView;
    }
} 

In der vorletzten Zeile "Image Adapter kann nicht auf android.app.activity angewendet werden" wird jedoch eine Fehlermeldung angezeigt.

Mein ImageAdapter lautet wie folgt

public class ImageAdapter extends BaseAdapter {

    private Context mcontext;

    @Override
    public int getCount() {
        return mthumbids.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {
            imageView = new ImageView(mcontext);
            imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        }
        else  {
            imageView = (ImageView)convertView;
        }

        return imageView;
    }

    private Integer[] mthumbids =
            {
              R.drawable.img1, R.drawable.img2,
              R.drawable.img3, R.drawable.img4,
              R.drawable.img5, R.drawable.img6
            };
}
-1
lmathurin 18 Apr. 2018 im 18:59

4 Antworten

Beste Antwort

Sie benötigen einen Konstruktor in Ihrer ImageAdapter - Klasse, der den Kontext als Parameter verwendet.

Und Sie müssen den Hintergrund des Bildes auch basierend auf der Adapterposition einstellen.

Hier ist die modifizierte Adapterklasse.

public class ImageAdapter extends BaseAdapter {

    private Context mcontext;

    public ImageAdapter (Context context) {
        mContext = context;
    }

    @Override
    public int getCount() {
        return mthumbids.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {
            imageView = new ImageView(mcontext);
            imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);

            // Add the following to load the image
            imageView.setBackground(ContextCompat.getDrawable(context, mthumbids[position]));
        }
        else  {
            imageView = (ImageView)convertView;
        }

        return imageView;
    }

    private Integer[] mthumbids =
            {
              R.drawable.img1, R.drawable.img2,
              R.drawable.img3, R.drawable.img4,
              R.drawable.img5, R.drawable.img6
            };
}
0
Reaz Murshed 18 Apr. 2018 im 16:33

Sie können den Kontext auch vom übergeordneten Element in getView() abrufen. Dann müssen Sie den Kontext nicht übergeben und speichern. Ihr getView sieht also so aus:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    if (convertView == null) {
        Context context = parent.getContext(); // <-- add this line
        imageView = new ImageView(context); // use the context from the parent
        imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(8, 8, 8, 8);
    }
    else  {
        imageView = (ImageView)convertView;
    }

    return imageView;
}
0
beeb 18 Apr. 2018 im 16:21

Fehlender Konstruktor mit Argumentkontext für ImageAdapter. Es wird automatisch nur ein leerer Konstruktor erstellt. Sie sollten Konstruktoren mit bestimmten Argumentwerten schreiben.

public ImageAdapter(Context context){

MContext = Kontext; }}

0
dev 18 Apr. 2018 im 16:22

Fügen Sie diesen Code in die ImageAdapter-Klasse ein.

public ImageAdapter (Context context) {
    super();
    mContext = context;
}
0
Ihdina 18 Apr. 2018 im 16:36