【问题标题】:Passing XML drawable array and using Glide to get it传递 XML 可绘制数组并使用 Glide 获取它
【发布时间】:2019-01-30 20:38:05
【问题描述】:

我有 CardView。当我点击卡片时,会打开一个新的 Activity 并显示适当的图像和一些文本。

我使用 XML 数组来存储我的可绘制图像的路径,并使用 Glide 库来上传图像。

当我在另一个 Activity 中获取 Intent 时,我有几个与上传图片相关的异常。

当我对包含 CardView 的 main_xms 进行膨胀时,所有工作都可以。但是现在我不明白这是什么问题。

例外情况

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;
}

适配器类,实现了将数据传递给另一个 Activity 的 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();

}

例外涉及接收数据的类

【问题讨论】:

    标签: android android-intent android-glide xml-drawable


    【解决方案1】:

    在适配器内部,您使用 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);
    

    【讨论】:

    • 第一次使用这个变种,但是遇到了同样的异常 RuntimeException 和 ArrayIndexOutOfBoundsException
    • ArrayIndexOutOfBoundsException 表示您尝试从数组中访问大于数组大小的索引。我假设抛出此异常是因为您将资源 ID 作为索引传递,这可能类似于 -1918237298 或 18778382 类型的数字。大于您的数组大小的数字。如果你想从中获取一些东西,你必须将有效的索引传递给数组
    猜你喜欢
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多