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 上设置。
我潜伏在你们的论坛有一段时间了,他们对我遇到的各种问题提供了极大的帮助,非常感谢! :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 上设置。