如何解决这个String和int的问题?

问题描述 投票:0回答:1

你看我有一个 问题: 有没有可能在不完全改变代码的情况下,将该路径改为int?

我使用android studio,目前正在开发应用程序,但我有一件事很困扰。

我有一个图片的字符串路径,需要变成int才能工作。

String path1 = Environment.getDataDirectory().getAbsolutePath() + "/data/sk.lotario.bg/app_imgBuns/0.png";
String path2 = Environment.getDataDirectory().getAbsolutePath() + "/data/sk.lotario.bg/app_imgBuns/1.png";


    List<SliderBN> sliderBNS = new ArrayList<>();
    for(int i = 0; i < Recipe.bnPos; i++){
        sliderBNS.add(new SliderBN(path1));
        sliderBNS.add(new SliderBN(path2));

在SliderBN类中,我有这个。

public class SliderBN {

    private int image;

    SliderBN(int image){
        this.image = image;
    }

    public int getImage() {
        return image;
    }

问题是我不想在这里把它改成字符串,因为那样我就得改很多代码。

这里是该类的适配器。


    private List<SliderBN> sliderBNS;
    private ViewPager2 vpBN;
    private static final String TAG = "SliderBNAdapter";
    public static int vpBNPosition = 0;

    public SliderBNAdapter(List<SliderBN> sliderBNS, ViewPager2 vpBN) {
        this.sliderBNS = sliderBNS;
        this.vpBN = vpBN;
    }

    public SliderBNAdapter() {

    }

    @NonNull
    @Override
    public SliderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            return new SliderViewHolder(
                    LayoutInflater.from(parent.getContext()).inflate(
                            R.layout.slider_item_container,
                            parent,
                            false
                )
        );
    }

    @Override
    public void onBindViewHolder(@NonNull SliderViewHolder holder, int position) {
        holder.setImage(sliderBNS.get(position));
        if (position == sliderBNS.size()) {
            vpBN.post(runnable);
        }
    }



    @Override
    public int getItemCount() {
        vpBNPosition = vpBN.getCurrentItem();
        Log.i(TAG,"position "+vpBNPosition);
        return sliderBNS.size();
    }

    class SliderViewHolder extends RecyclerView.ViewHolder {

        private ImageView imageView;

        SliderViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imageSlide);
        }
        void setImage(SliderBN sliderBN){
            imageView.setImageResource(sliderBun.getImage());
        }
    }

    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            sliderBNS.addAll(sliderBNS);
            notifyDataSetChanged();
        }
    };
java string android-studio int android-viewpager2
1个回答
0
投票

你可以在SliderBN中添加两个属性。一个是 String path 另一个是 int index. 当您创建 SliderBN 你可以直接设置你想要的值。然后在你的代码中你可以使用你需要的属性。

public class SliderBN {

    private int index;
    private String path;

    SliderBN(String path, int index){
        this.index = index;
        this.path = path;
    }

    public int getIndex() {
        return index;
    }

    public String getPath() {
        return path;
    }
}

在一开始创建图片的时候,你可以这样做。

String pathToImages = Environment.getDataDirectory().getAbsolutePath() + "/data/sk.lotario.bg/app_imgBuns/";

List<SliderBN> sliderBNS = new ArrayList<>();
// Here you need to be sure that you always have the images else you will 
// receive exceptions! If this images will be dynamically added/removed then 
// you need another way for retrieving the names and loading them in the list.
for(int i = 0; i < Recipe.bnPos; i++){
    sliderBNS.add(new SliderBN(pathToImages + i + ".png", i));
}

比如你需要设置图片路径的时候,你可以直接调用 getPath 方法。

class SliderViewHolder extends RecyclerView.ViewHolder {

    private ImageView imageView;

    SliderViewHolder(@NonNull View itemView) {
        super(itemView);
        imageView = itemView.findViewById(R.id.imageSlide);
    }
    void setImage(SliderBN sliderBN){
        // Here you can set the path to the image
        // I saw that you setImageResource(int resId)
        // But for this to work you need the Image ids
        // In the current case we can use setImageURI(Uri uri)
        // With Uri you need to provide the path to the image not the id

         File imgFile = new File(sliderBun.getPath());
         if(imgFile.exists())
         {
             Uri uri = Uri.fromFile(imgFile);
             imageView.setImageURI(uri);
         }
         else
         {
             // Log here message that the file does not exist
             // and also log the path so you can see what is going wrong
         }
    }
}

注意: 由于你的代码是现在这样,你不需要 index (int) in class SliderBN 因为你在一开始添加所有图片的列表中就有这些信息。但我还是不知道你所有的用例,所以我留下了它。请看使用列表的索引来获取该位置的对象的例子。

@Override
public void onBindViewHolder(@NonNull SliderViewHolder holder, int position) 
{
    // Here we get SliderBN object from the list by list position and not by 
    // internal properties
    holder.setImage(sliderBNS.get(position));
    if (position == sliderBNS.size()) {
        vpBN.post(runnable);
    }
}

有一个地方你会需要索引,那就是如果你有... ... 未排序的列表 SliderBN 对象,并且你需要轻松地对它们进行排序。那么你可以使用这个属性 index 来对该列表中的对象进行排序。但在你的例子中,你是通过增长的索引在 for loop 所以你的名单其实是有排序的。

祝大家好运!

© www.soinside.com 2019 - 2024. All rights reserved.