Передача нарисованного массива XML и использование Glide для его получения - PullRequest
0 голосов
/ 30 января 2019

У меня есть CardView.Когда я нажимаю на карточку, открывается новое действие и отображается соответствующее изображение и некоторый текст.

Я использую массив XML для хранения пути к изображениям для рисования и библиотеку Glide для загрузки изображений.

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

Когда я надуваю main_xms, которые содержат CardView, все работает.Но сейчас я не понимаю, что это за проблема.

Исключения enter image description here

массив XML

  <array name="sports_images">
        <item>@drawable/img_baseball</item>
        <item>@drawable/img_badminton</item>
        <item>@drawable/img_basketball</item>
        <item>@drawable/img_bowling</item>
        <item>@drawable/img_cycling</item>
        <item>@drawable/img_golf</item>
        <item>@drawable/img_running</item>
        <item>@drawable/img_soccer</item>
        <item>@drawable/img_swimming</item>
        <item>@drawable/img_tabletennis</item>
        <item>@drawable/img_tennis</item>
    </array>

Класс, представляющий данные

class Sport {

//Member variables representing the title and information about the sport
private String title;
private String info;
private int imageResourse;

/**
 * Constructor for the Sport data model
 *
 * @param title The name if the sport.
 * @param info  Information about the sport.
 */
 Sport(String title, String info, int imageResourse) {
    this.title = title;
    this.info = info;
    this.imageResourse = imageResourse;
}

public Sport() {
}

/**
 * Gets the title of the sport
 *
 * @return The title of the sport.
 */
String getTitle() {
    return title;
}

/**
 * Gets the info about the sport
 *
 * @return The info about the sport.
 */
String getInfo() {
    return info;
}

/**
 * Gets sport image
 *
 * @return The image of the spors.
 */
public int getImageResourse() {
    return imageResourse;
}

Класс адаптера, который реализует метод onClick для передачи данных в другое действие

class SportsAdapter extends RecyclerView.Adapter<SportsAdapter.ViewHolder> {


//Member variables
private ArrayList<Sport> mSportsData;
private Context mContext;

/**
 * Constructor that passes in the sports data and the context
 *
 * @param sportsData ArrayList containing the sports data
 * @param context    Context of the application
 */
SportsAdapter(Context context, ArrayList<Sport> sportsData) {
    this.mSportsData = sportsData;
    this.mContext = context;
}


/**
 * Required method for creating the viewholder objects.
 *
 * @param parent   The ViewGroup into which the new View will be added after it is bound to an adapter position.
 * @param viewType The view type of the new View.
 * @return The newly create ViewHolder.
 */
@NonNull
@Override
public SportsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false));
}

/**
 * Required method that binds the data to the viewholder.
 *
 * @param holder   The viewholder into which the data should be put.
 * @param position The adapter position.
 */
@Override
public void onBindViewHolder(SportsAdapter.ViewHolder holder, int position) {
    //Get current sport
    Sport currentSport = mSportsData.get(position);
    //Populate the textviews with data
    holder.bindTo(currentSport);
}


/**
 * Required method for determining the size of the data set.
 *
 * @return Size of the data set.
 */
@Override
public int getItemCount() {
    return mSportsData.size();
}


/**
 * ViewHolder class that represents each row of data in the RecyclerView
 */
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    //Member Variables for the TextViews
    private TextView mTitleText;
    private TextView mInfoText;
    private ImageView mSportImage;

    /**
     * Constructor for the ViewHolder, used in onCreateViewHolder().
     *
     * @param itemView The rootview of the list_item.xml layout file
     */
    ViewHolder(View itemView) {
        super(itemView);
        //Initialize the views
        mTitleText = itemView.findViewById(R.id.title);
        mInfoText = itemView.findViewById(R.id.subTitle);
        mSportImage = itemView.findViewById(R.id.sportImage);

        //Set the listener to the entire view
        itemView.setOnClickListener(this);
    }

    void bindTo(Sport currentSport) {
        //Populate the textviews with data
        mTitleText.setText(currentSport.getTitle());
        mInfoText.setText(currentSport.getInfo());
        Glide.with(mContext).load(currentSport.getImageResourse()).into(mSportImage);
    }

    @Override
    public void onClick(View v) {
        //Get the object position which was clicked
        Sport currentSport = mSportsData.get(getAdapterPosition());
        Intent detailIntent = new Intent(mContext,DetailActivity.class);
        detailIntent.putExtra("title", currentSport.getTitle());
        detailIntent.putExtra("image_resource", currentSport.getImageResourse());
        mContext.startActivity(detailIntent);
    }
}

Класс, который получает данные

public class DetailActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);

    TextView sportText = findViewById(R.id.header_detail);
    ImageView sportImage = findViewById(R.id.sportImage);

    sportText.setText(getIntent().getStringExtra("title"));


    TypedArray sportsImageResources = getResources().obtainTypedArray(R.array.sports_images);

    int position = getIntent().getIntExtra("image_resource",0);

    Glide.with(this).load(sportsImageResources.getResourceId(position,0)).into(sportImage);
    sportsImageResources.recycle();

}

Исключение касается класса, который получает данные

1 Ответ

0 голосов
/ 31 января 2019

Внутри адаптера вы загружаете изображение, используя currentSport.getImageResourse()

 Glide.with(mContext).load(currentSport.getImageResourse()).into(mSportImage);

Работает нормально.

Но в своей деятельности вы пытаетесь загрузить его через позицию, которую вы получаете из намерения

int position = getIntent().getIntExtra("image_resource",0);

Но вы не устанавливаете позицию для намерения, вы сами устанавливаете resourceid.Так что image_resource - это не позиция, это ID ресурса для рисования

detailIntent.putExtra("image_resource", currentSport.getImageResourse());

Вы должны вызывать glide со значением, которое вы отправляете с намерением

Glide.with(mContext).load(getIntent().getIntExtra("image_resource",0)).into(mSportImage);
...