Я изучаю Android, и у меня проблема с адаптером. Я могу получить текст в адаптере, но у меня проблемы с настройкой источника изображения.

[Это результат, если я прокомментирую код]

[это пример того, что я хочу, кроме установки изображений из моего массива.

Я использую целочисленный массив с элементом, который можно вывести в arrays.xml

<integer-array name="champ_image">
        <item>@drawable/aatrox</item>
        <item>@drawable/ahri</item>
        <item>@drawable/akali</item>
        <item>@drawable/alistar</item>
        <item>@drawable/amumu</item>
        <item>@drawable/anivia</item>
        <item>@drawable/ashe</item>
    </integer-array>

Вот моя ошибка LogCat:

01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime: FATAL EXCEPTION: main
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime: Process: com.sagar.materialdesigndemo, PID: 19392
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime: android.content.res.Resources$NotFoundException: Resource ID #0x0
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime:     at android.content.res.Resources.getValue(Resources.java:1307)
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime:     at android.content.res.Resources.getDrawable(Resources.java:826)
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime:     at android.content.Context.getDrawable(Context.java:403)
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime:     at android.support.v4.content.ContextCompatApi21.getDrawable(ContextCompatApi21.java:26)
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime:     at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:321)
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime:     at android.support.v7.internal.widget.TintManager.getDrawable(TintManager.java:177)
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime:     at android.support.v7.internal.widget.TintManager.getDrawable(TintManager.java:170)
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime:     at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:53)
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime:     at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:74)
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime:     at com.sagar.adapters.ChampAdapter.onBindViewHolder(ChampAdapter.java:55)
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime:     at com.sagar.adapters.ChampAdapter.onBindViewHolder(ChampAdapter.java:15)
01-04 03:09:30.057 19392-19392/com.sagar.materialdesigndemo E/AndroidRuntime:     at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5212)

Вот мой адаптер под названием ChampAdapter, я думаю, проблема в: holder.champImg.setImageResource(champItem.get(position).champImg); //HERE

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

    public List<ChampionItemModel> champItem;

    public ChampAdapter(List<ChampionItemModel> champItem){this.champItem = champItem;}

    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView champName;
        TextView roleChamp;
        ImageView champImg;

        public ViewHolder(View itemView) {
            super(itemView);
            this.champName = (TextView)itemView.findViewById(R.id.champ_name);
            this.roleChamp = (TextView)itemView.findViewById(R.id.champ_role);
            this.champImg = (ImageView)itemView.findViewById(R.id.champ_image);
        }
    }

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

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        holder.itemView.setClickable(true);
        holder.itemView.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v){

            }
        });

        holder.champName.setText(champItem.get(position).champName);
        holder.roleChamp.setText(champItem.get(position).roleChamp);
        holder.champImg.setImageResource(champItem.get(position).champImg); //HERE IS THE PROBLEM
    }

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

}

А вот и остальной код

  • Модель:

    public class ChampionItemModel {
    
        public String champName;
        public String roleChamp;
        public int champImg;
    
        public ChampionItemModel(String champName, String roleChamp, int champImg){
            this.champName = champName;
            this.roleChamp = roleChamp;
            this.champImg = champImg;
        }
    }
    
  • Метод фрагмента называется initializeChampsItemList:

    private void initializeChampsItemList(){
            ChampionItemModel championItemModel;
            String[] champsNames = getResources().getStringArray(R.array.champ_name);
            String[] champsRoles = getResources().getStringArray(R.array.champ_role);
            int[] champsImages = getResources().getIntArray(R.array.champ_image);
            final int length = champsNames.length;
            for(int i=0;i<length;i++){
                championItemModel = new ChampionItemModel(champsNames[i], champsRoles[i], champsImages[i]);
                champItems.add(championItemModel);
            }
    
        }
    
0
Janco Boscan 4 Янв 2016 в 11:01

3 ответа

Лучший ответ

Как и в arrays.xml champ_image элемент массива @drawable/aatrox означает, что champ_image набирается как массив вместо int. поэтому используйте метод obtainTypedArray, который возвращает TypedArray как:

TypedArray imgsTypedArray = getResources().obtainTypedArray(R.array.champ_image);

Теперь используйте TypedArray.getResourceId, чтобы получить доступные для рисования идентификаторы и передать их ChampionItemModel как:

for(int i=0;i<length;i++){
  int drawableId= imgsTypedArray.getResourceId(i, -1);
  championItemModel = new ChampionItemModel(champsNames[i], 
                                 champsRoles[i], 
                                 drawableId);
  champItems.add(championItemModel);
}
1
ρяσѕρєя K 4 Янв 2016 в 15:25

Я предполагаю, что вы пытаетесь загрузить изображения из папки с возможностью переноса. Затем объявите массив champsImages, как показано ниже:

Int [] champsImages = {R.drawable.image1, R.drawable.image2, R.drawable.image3, ... и др.};

Думаю, это поможет достичь ожидаемого результата.

0
Zahidur Rahman Faisal 4 Янв 2016 в 09:32

http://developer.android.com/guide/topics/resources/more-resources.html#TypedArray

Файл XML сохранен в res / values / arrays.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <array name="icons">
     <item>@drawable/home</item>
     <item>@drawable/settings</item>
     <item>@drawable/logout</item>
   </array>
   <array name="colors">
     <item>#FFFF0000</item>
     <item>#FF00FF00</item>
     <item>#FF0000FF</item>
   </array>
</resources>

Этот код приложения извлекает каждый массив, а затем получает первую запись в каждом массиве:

Resources res = getResources();
TypedArray icons = res.obtainTypedArray(R.array.icons);
Drawable drawable = icons.getDrawable(0);

TypedArray colors = res.obtainTypedArray(R.array.colors);
int color = colors.getColor(0,0);
0
Leo 4 Янв 2016 в 15:32