【问题标题】:How can I solve this String and int problem?我该如何解决这个 String 和 int 问题?
【发布时间】:2020-06-02 07:34:48
【问题描述】:

您知道我有一个问题:有没有可能在不完全更改代码的情况下以某种方式更改到 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();
        }
    };

【问题讨论】:

  • Integer.parseInt(myStringValue);
  • 对不起我的错。我忘了提一个问题。我是stackoverflow的新手。有没有可能在不完全更改代码的情况下以某种方式将路径更改为 int ?解析其中一个 cmets 中提到的 int 不起作用。我试过了。
  • 你的字符串值是多少?
  • 您可以更新您的描述添加您的问题。这样会更容易阅读,无需向下滚动即可查看 cmets 中的问题。
  • 更改SliderBN 类的构造函数以接收String 并在构造函数内部从String 中提取图像的编号。上课只是为了保存int 没有任何意义。有了这种变化,开设课程会更有意义。

标签: java string android-studio int android-viewpager2


【解决方案1】:

您可以向 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 内部的增长索引创建图像,因此您的列表实际上是排序的。

祝大家好运!

【讨论】:

  • 感谢您的回答,但问题仍然存在,因为我使用的 ImageView 类要求返回 int 的方法 getImage,所以我不能使用返回 String 的方法 getPath。你能帮我整理一下吗?我可以在这里发布整个代码
  • 好的,我明白你的意思了。我不知道需要 int(资源 id)的 API。我现在查看文档,发现这个方法: setImageURI(Uri uri) -> developer.android.com/reference/android/widget/… 它需要 Uri 所以请测试它。我还在您使用此方法的地方更新了我的代码。如果您有一些问题,请检查如何在 Android 中使用 Uri 查找文件(在您的情况下为图像)或在此处再次写入。希望对您有所帮助。
  • 我还添加了文件你可以在上面的例子中看到如何使用它。
  • 也可能的解决方案是这两种方法:developer.android.com/reference/android/widget/…developer.android.com/reference/android/widget/… 只需搜索示例如何使用它们显示本地图像
  • 谢谢你,完美无瑕,但我只需要从sliderBN列表中删除for loop,它现在可以完美运行
猜你喜欢
  • 1970-01-01
  • 2020-03-25
  • 2020-02-14
  • 2021-10-23
  • 1970-01-01
  • 2021-07-31
相关资源
最近更新 更多