Java RecyclerView中的imageButton未显示
我已经在你们的论坛上潜伏了一段时间了,他们在我遇到的各种问题上帮了我很大的忙,所以谢谢!:D 我正在尝试为android创建我的第一个应用程序,这是一款名为shithead的纸牌游戏,我和我的朋友过去经常玩这个游戏 我决定用回收器来展示你的手。我需要能够动态添加按钮(与卡图像)在运行时显示。据我所知,我需要一个适配器 使用“https://guides.codepath.com/android/Using the recyclerview”上的便捷指南,并尝试为自己的目的对其进行修改,我已经非常接近于实现这一功能的测试运行。当我在Android Studio的模拟器上运行该程序时,它会显示以下内容: 我觉得我已经非常接近了,我只是缺少了一些使用android或android studio的关键语法 在我的卡对象中,我构建了一个字符串idText,该字符串与我保存在项目的mipmap hdpi、mipmap xhdpi等文件夹中的卡图像相关(如下所示的mipmap hdpi) 我的Card类中还有一个函数getImageId:Java RecyclerView中的imageButton未显示,java,android,android-recyclerview,playing-cards,Java,Android,Android Recyclerview,Playing Cards,我已经在你们的论坛上潜伏了一段时间了,他们在我遇到的各种问题上帮了我很大的忙,所以谢谢!:D 我正在尝试为android创建我的第一个应用程序,这是一款名为shithead的纸牌游戏,我和我的朋友过去经常玩这个游戏 我决定用回收器来展示你的手。我需要能够动态添加按钮(与卡图像)在运行时显示。据我所知,我需要一个适配器 使用“https://guides.codepath.com/android/Using the recyclerview”上的便捷指南,并尝试为自己的目的对其进行修改,我已经非常
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);
}
到目前为止,我的主要活动课做得很少。它初始化一个玩家、我和一副牌对象。然后,它给了我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));
}
就代码的值而言,牌组、玩家和牌对象似乎都在按预期工作,因为结果显示正确显示“Dr_StrangeKill”已收到2-7颗钻石,但没有显示牌图像本身!这是我第一次在任何IDE(eclipse、visualstudio、androidstudio)中使用图像,我感觉自己非常接近,但在某些小但关键的方面却很差。任何帮助都将不胜感激 我建议您将图像放在一个可绘制文件夹中,因为mipmap文件夹用于启动图标,如果您想支持不同的屏幕密度,下面是一个演示如何为每个屏幕密度创建一个可绘制文件夹的示例,然后您应获得如下图像标识符:
context.getResources().getIdentifier(idText, "drawable", context.getPackageName());
看起来您正在尝试按名称获取图像资源的标识符。在这种情况下,您可以尝试: 返回context.getResources().getIdentifier(idText,“mipmap”,context.getPackageName()) 但不建议这样做。有关getIdentifier()的信息,请参见文档 ,java.lang.String,java.lang.String)
您可以将id(一个int)添加到您的卡对象中,然后像新卡一样实例化(R.mipmap.hearts\u 2,2,“hearts”),或者以您正在实例化的方式实例化(似乎您使用的是公共字段,而不是构造函数),然后在适配器中获取该id以在imageview上设置。是否显示任何内容,或者仅仅是
ImageButton
没有?为什么要将图像存储在mipmap文件夹中,但要从drawable获取资源id?@JediBurrell-它显示一些小的灰色框,似乎对单击做出响应(它们闪烁),但里面没有图像。我猜它们是android studio中最小的默认按钮displays@nabillondon-因为我对这玩意儿一窍不通。我应该如何引用这些图像?据我所知,引用drawable允许android studio根据显示的屏幕正确选择正确的图像大小。。。。我应该选一个吗?AKA返回context.getResources().getIdentifier(“mipmap hdpi/@+id/”+idText,null,context.getPackageName());如此接近,却又如此遥远!RecyclerView现在显示卡片,并按预期滚动,但显示的所有卡片都是黑桃王牌,与RankString和SuitString的最终索引相关。从牌组中拾取的牌对象仍然正确,因为它正确地显示了图像旁边的文本“2个黑桃”等,但不知何故,引用的图像始终是黑桃的王牌!。知道了!我的idText字段和getIdText方法都是静态的,而我的文本字段不是静态的。在牌组的创建过程中,最后一张实例化的牌是黑桃王牌,因此每次调用getIdText()都将返回黑桃王牌。非常感谢你的帮助@谢谢你的帮助:请考虑接受它作为答案。
context.getResources().getIdentifier(idText, "drawable", context.getPackageName());