Как я могу получить изображения динамически из папки для рисования? - PullRequest
0 голосов
/ 06 декабря 2018

Я получаю изображения с помощью статического имени, например,

{R.drawable.image1,R.drawable.image2,R.drawable.image3}

Если у меня есть около 50 изображений, я не могу дать каждое имя файла в массиве, поэтому оно должно бытьдинамичный, как я могу достичь этого.А также, пожалуйста, скажите мне, где поставить мой динамически код

package com.example.nauman.swipeapp;

import android.annotation.SuppressLint;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class SwipeAdapter extends PagerAdapter {
    private int[]image =  {R.drawable.image1,R.drawable.image2,R.drawable.image3};

    private Context cx;

    SwipeAdapter(Context cx){

        this.cx=cx;
    }

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

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return (view==(RelativeLayout)object);
    }

    @SuppressLint("SetTextI18n")
    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {

        LayoutInflater layoutInflater = (LayoutInflater) cx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        assert layoutInflater != null;
        View view= layoutInflater.inflate(R.layout.page_fragment,container,false);
        ImageView imageView= view.findViewById(R.id.imageView);
        imageView.setImageResource(image[position]);
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((RelativeLayout) object);
    }

}

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Если все ваши рисованные объекты имеют такие имена, как: image1, image2, image3, ....тогда вы можете получить их идентификаторы ресурсов следующим образом:

int i = 1; // get the id of image1
int resId = context.getResources().getIdentifier("image" + i, "drawable", context.getPackageName());

и использовать его:

imageView.setImageResource(resId);

, чтобы это работало, вы должны предоставить действительный Context (внутри действия, которое выможно использовать this).

0 голосов
/ 06 декабря 2018

Измените конструктор вашего класса адаптера, как показано ниже.Просто добавьте список изображений в качестве параметра

public class SwipeAdapter extends PagerAdapter {
private ArrayList<Integer> image;

private Context cx;

SwipeAdapter(Context cx, ArrayList<Integer> image){

    this.cx=cx
    this.image =image
}

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

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
   return (view==(RelativeLayout)object);
}

 @SuppressLint("SetTextI18n")
 @NonNull
 @Override
 public Object instantiateItem(@NonNull ViewGroup     container, int position) {

   LayoutInflater layoutInflater = (LayoutInflater)      cx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
assert layoutInflater != null;
View view=   layoutInflater.inflate(R.layout.page_fragment,container,false);
ImageView imageView=  view.findViewById(R.id.imageView);
imageView.setImageResource(image[position]);
container.addView(view);
return view;
}

@Override
public void destroyItem(@NonNull ViewGroup container,     int position, @NonNull Object object) {
container.removeView((RelativeLayout) object);
} 

Создание адаптера со списком изображений как следующий.Для того, чтобы зацикливаться среди изображений в нарисованном ресурсе, необходимо добавить индекс в его названии в порядке от 1 до 50, если вы хотите 50 изображений в вашем адаптере

 ArrayList<Integer> images=new ArrayList<Integer>()
 for(int i =0;i<50; i++){
 int res = getResources().getIdentifier("<your pakecgename>:drawable/abc"+i, null, null);
 images.add(res);
}
SwipeAdapter adapter = new SwipeAdapter(activity, images)
0 голосов
/ 06 декабря 2018

Это решение выглядит немного странно не только потому, что оно использует рефлексию, но и потому, что оно сильно зависит от возможности распознавать ваши собственные ресурсы, которые можно рисовать, сопоставляя их имена с определенным шаблоном (поэтому вы должны попытаться использовать действительно уникальные имена длякартинки)

При этом вы можете изменить свой код следующим образом:

Сохраните private int[] image;, но инициализируйте его в конструкторе Адаптера:

SwipeAdapter(Context cx){
    this.cx=cx;
    buildImageArray();
}

с помощьюновый метод (примечание: вы должны импортировать java.lang.reflect.Field;)

private void buildImageArray() {

    // this will give you **all** drawables, including those from e.g. the support libraries!
    Field[] drawables = R.drawable.class.getDeclaredFields();
    SparseIntArray temp = new SparseIntArray();
    int index = 0;
    for (Field f : drawables) {
        try {
            System.out.println("R.drawable." + f.getName());
            // check the drawable is "yours" by comparing the name to your name pattern
            // this is the point where some unwanted drawable may slip in,
            // so you should spend some effort on the naming/ matching of your pictures
            if (f.getName().startsWith("image")) {
                System.out.println("R.drawable." + f.getName() + "==========================================");
                int id = cx.getResources().getIdentifier(f.getName(), "drawable", cx.getPackageName());
                temp.append(index, id);
                index++;
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    image = new int[index];
    for (int i = 0; i < index; i++) {
        image[i] = temp.valueAt(i);
    }
}
...