【问题标题】:imageButton in RecyclerView not displayingRecyclerView中的imageButton不显示
【发布时间】:2017-03-29 19:01:17
【问题描述】:

一段时间以来,我一直潜伏在您的论坛上,他们在我遇到的各种问题上为我提供了极大的帮助,非常感谢! :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];
}

我的卡片类中还有一个 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)中处理图像,我觉得我离得很近,但在一些小但关键的方式上。任何帮助将不胜感激!

【问题讨论】:

  • 是否有任何显示,或者只是 ImageButton 没有显示?
  • 为什么把图片保存在mipmap文件夹,却从drawable中获取资源id?
  • @JediBurrell - 它显示小灰色框,似乎响应点击(它们闪烁)但其中没有图像。我猜它们是 android studio 显示的最小的默认按钮
  • @nabillondon - 因为我对这些东西完全是个菜鸟。我应该如何参考图像?据我所知,引用drawable允许android studio根据它显示的屏幕正确选择正确的图像尺寸......我应该选择一个吗? AKA return context.getResources().getIdentifier("mipmap-hdpi/@+id/" + idText, null, context.getPackageName());

标签: java android android-recyclerview playing-cards


【解决方案1】:

我建议你把你的图片放在一个drawable文件夹中,因为mipmap文件夹是用来存放启动器图标的,如果你想支持不同的屏幕密度,这里有一个link,它向你展示了如何为每个屏幕密度创建一个drawable文件夹,之后你应该像这样得到你的图像标识符:

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

【讨论】:

  • 如此接近,却又如此遥远! RecyclerView 现在显示卡片,它们按预期滚动,但显示的所有卡片都是黑桃 A,它与 RankString 和 SuitString 的最终索引相关。从甲板上挑选的卡片对象仍然是正确的,因为它在图像旁边正确显示文本“黑桃 2”等,但不知何故,所引用的图像总是黑桃 A...!aceofspades.
  • 明白了!我的 idText 字段和我的 getIdText 方法都是静态的,而我的文本字段不是。在创建一副牌时,最后一张实例化的牌是黑桃 A,因此每次调用 getIdText() 都会返回黑桃 A。非常感谢您的帮助!
  • @Dr_StrangeKill 很高兴它有帮助 :) 请考虑接受它作为答案
【解决方案2】:

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

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") 一样进行实例化,或者您正在实例化(好像您正在使用公共字段)并且没有构造函数)并在适配器中获取该 ID 以在图像视图上设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    相关资源
    最近更新 更多