RecyclerView 中的 imageButton 不显示

imageButton in RecyclerView not displaying

我潜伏在你们的论坛有一段时间了,他们对我遇到的各种问题提供了极大的帮助,非常感谢! :D

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

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

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

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

在我的卡片对象中,我构建了一个字符串 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];
}

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

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 class 目前做的很少。它初始化一个玩家、我和一副纸牌对象。然后它给了我未洗牌的牌顶上的 6 张牌,也就是 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 工作室)中处理图像,我觉得我非常接近,但在一些小但关键的方面有所不同。任何帮助将不胜感激!

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

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

您似乎在尝试通过名称获取图像资源的标识符。在那种情况下,您可以尝试:

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)添加到您的卡片对象并像 new Card(R.mipmap.hearts_2,2,"hearts") 一样实例化,或者您实例化(好像你正在使用 public 字段而没有构造函数)并在你的适配器中获取该 id 以在 imageview 上设置。