RecyclerView中的imageButton无法显示

时间:2017-03-29 19:01:18

标签: java android android-recyclerview recycler-adapter playing-cards

我已经在你的论坛上潜伏了一段时间了,他们在我曾经遇到的各种问题上帮助了我,所以谢谢! :d

我正在尝试创建我的第一个Android应用程序,它是一个名为shithead的纸牌游戏,我和我的朋友经常玩。

我决定使用RecyclerView来展示您的手牌。我需要能够在运行时动态地将按钮(带卡片图像)添加到显示器。据我所知,我需要一个适配器。

使用" https:// guides.codepath.com/android/using-the-recyclerview"上的便捷指南;并试图为了我自己的目的修改它我已经非常接近于使这项工作的测试运行。当我在Android Studio中的模拟器上运行程序时,它会给我以下显示: images displayed as grey rectangles

我觉得我必须非常接近,而且我只是缺少一些使用android或android studio的重要语法。

在我的Card对象中,我构建了一个String idText,它与我在项目的mipmap-hdpi,mipmap-xhdpi等文件夹中保存的卡片图像相关(mipmap-hdpi如下所示) mipmap-hdpi folder in Android Studio

public Card(int suitInput, int rankInput)
{
    suit = suitInput;
    rank = rankInput;
    faceUp = false;
    text = RankString[rank] + " of " + SuitString[suit];
    idText = "i_" + RankString[rank] + "_of_" + SuitString[suit];
}

我的Card Class中也有一个函数getImageId:

public static int getImageId(Context context) {
    return context.getResources().getIdentifier("drawable/@+id/" + idText, null, context.getPackageName());
}

我的CardAdapter中的onBindViewHolder方法如下:

@Override
public void onBindViewHolder(CardAdapter.ViewHolder viewHolder, int position)
{
    //get the data model based on position
    Card card = mCards.get(position);

    //Set item views baased on views and data model
    ImageButton imageButton = viewHolder.cardButton;
    imageButton.setImageResource(card.getImageId(mContext));
    TextView textView = viewHolder.cardText;
    textView.setText(card.text);
}

我的MainActivity类目前做得很少。它初始化了一个玩家,我和一个卡片对象。然后它给了我6张牌,从未洗过的甲板顶部,AKA 2-7颗钻石。然后它初始化CardAdapter。

public class MainActivity extends AppCompatActivity {

Player me;
Deck deck;

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

    //lookup the recyclerview in activity layout
    RecyclerView rvCards = (RecyclerView) findViewById(R.id.rvCards);

    me = new Player("Dr_StrangeKill");
    deck = new Deck();

    me.hand.add(deck.getCards().remove(0));
    me.hand.add(deck.getCards().remove(0));
    me.hand.add(deck.getCards().remove(0));
    me.hand.add(deck.getCards().remove(0));
    me.hand.add(deck.getCards().remove(0));
    me.hand.add(deck.getCards().remove(0));

    //create adapter passing in sample user data
    CardAdapter adapter = new CardAdapter(this, me.hand);
    //Attach the adapter to the recyclerView to populate items
    rvCards.setAdapter(adapter);
    //Set layout manager to position the items
    rvCards.setLayoutManager(new LinearLayoutManager(this));
}

在代码值的范围内,Deck,Player和Card对象似乎都按预期工作,因为结果显示正确显示' Dr_StrangeKill'已收到2到7颗钻石,但没有显示卡片图像本身!这是我第一次在任何IDE(eclipse,visual studio,android studio)中使用图像,我觉得我非常接近,但却以一些小而重要的方式关闭。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

我建议你将图像放在一个可绘制的文件夹中,因为mipmap文件夹用于启动器图标,如果你想支持不同的屏幕密度,这里有link,它显示了如何为每个屏幕密度创建一个可绘制的文件夹之后你应该得到这样的图像标识符:

context.getResources().getIdentifier(idText, "drawable", context.getPackageName());

答案 1 :(得分:0)

看起来您正在尝试按名称获取图像资源的标识符。在这种情况下,您可以尝试:

return context.getResources()。getIdentifier(idText,“mipmap”,context.getPackageName());

但不建议这样做。查看getIdentifier()的文档 https://developer.android.com/reference/android/content/res/Resources.html#getIdentifier(java.lang.String,java.lang.String,java.lang.String)

您可以将id(一个int)添加到您的卡片对象并实例化为新卡片(R.mipmap.hearts_2,2,“hearts”)或者您实例化(似乎您正在使用公共字段)并且没有构造函数)并在适配器中获取该ID以在imageview上设置。