У меня есть CardView.Когда я нажимаю на карточку, открывается новое действие и отображается соответствующее изображение и некоторый текст.
Я использую массив XML для хранения пути к изображениям для рисования и библиотеку Glide для загрузки изображений.
IУ меня есть несколько исключений, которые относятся к загруженному изображению, когда я получаю Intent в другом действии.
Когда я надуваю main_xms, которые содержат CardView, все работает.Но сейчас я не понимаю, что это за проблема.
Исключения
массив 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();
}
Исключение касается класса, который получает данные