nim*_*112 1 java android android-fragments android-recyclerview
在我的RecyclerView中,我需要将部分物品替换为片段。我遵循了维克多·克鲁兹(Victor Cruz)的回答,能够实现我想要的。
一切正常,但我面临一个严重的问题,即我Resources$NotFoundException Unable to find resource ID只在RecyclerView的最后一项中遇到问题,请注意,此问题仅在最后一项中出现,其他人都可以正常工作。
我尝试过的步骤:
我试图resource ID在R.java文件中查找,但徒劳无功。
我尝试减少和增加RecyclerView中的项目数量,但问题仍然相同。
请提出建议,我在哪里做错了。我很乐意提供其他相关细节。
发布问题5天后(并为此苦苦了一周),我无法解决问题。我制作了一个小示例应用程序来执行此特定任务,您可以从此处下载代码。
请帮助我。
编辑:邮政编码:
private void flipcard(final RecyclerView.ViewHolder holder)
{
final MyHolder myHolderflipcard= (MyHolder) holder;
// Delete old fragment
int containerId = myHolderflipcard.container.getId();// Get container id
Fragment oldFragment = ((FragmentActivity) context).getFragmentManager().findFragmentById(containerId);
if(oldFragment != null)
{
((FragmentActivity) context).getFragmentManager().beginTransaction().remove(oldFragment).commit();
}
int newContainerId = getUniqueId();
// Set the new Id to our know fragment container
myHolderflipcard.container.setId(newContainerId);
// Just for Testing we are going to create a new fragment according
// if the view position is pair one fragment type is created, if not
// a different one is used.
{
Fragment f;
f = new CardBackFragment();
// Then just replace the recycler view fragment as usually
((FragmentActivity) context).getFragmentManager().beginTransaction()
.setCustomAnimations(
R.animator.card_flip_right_in,
R.animator.card_flip_right_out,
R.animator.card_flip_left_in,
R.animator.card_flip_left_out)
.addToBackStack(null)
.replace(newContainerId, f).commit();
myHolderflipcard.cardView.setVisibility(View.GONE);
}
}
// Method that could us an unique id
private int getUniqueId(){
return (int)
SystemClock.currentThreadTimeMillis();
}
Run Code Online (Sandbox Code Playgroud)
如果可以用的话,这是我的logcat。
E/UncaughtException: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x1678
at android.content.res.Resources.getResourceName(Resources.java:2209)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:886)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.app.BackStackRecord.run(BackStackRecord.java:834)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:447)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5292)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
E/AndroidRuntime: FATAL EXCEPTION: main
Process: **app package name //intentionally written**, PID: 3136
android.content.res.Resources$NotFoundException: Unable to find resource ID #0x1678
at android.content.res.Resources.getResourceName(Resources.java:2209)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:886)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.app.BackStackRecord.run(BackStackRecord.java:834)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1452)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:447)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5292)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
Run Code Online (Sandbox Code Playgroud)
小智 5
这个问题很有趣。在调试示例应用程序一段时间后,这是我的发现:
resource id所缺少的是创建片段的ID -
CardBackFragment。resource id动态后给予更换,并提交片段为了证明我刚才所说的,这里是我调试您的应用程序时的屏幕截图,请注意显示的ID:
这是调试器告诉它丢失的丢失的ID:

而且要清楚,newContainerIdtis已翻译为此处的十六进制ID(对不起,我的英语不好)
那么这里发生了什么?
答案在于代码执行该行的方式:
myHolderflipcard.cardView.setVisibility(View.GONE);
这是在您提交要显示的片段之后触发的。
这是发生的情况:当您告诉卡片视图消失时,最后一项从ui中删除->因为它已从ui中删除,并且是回收者视图中的最后一项->高度recycler view缩短以最小化的view。该错误发生在最后一个项目上,因为recycler view了解到包含row layout问题的主题为空,并且它是最后一个项目->最后一个项目被转移到上面的问题行。同时,未将插入fragment您的线程framelayout。因此,当它完成并尝试找到时containerid,它找不到它。因此,崩溃。
因此,解决问题的方法是等待框架完全添加,然后删除问题
解决方法是:
myHolderflipcard.cardView.setVisibility(View.GONE);从您的flipcard方法中删除行
在外面创建一个: private MyHolder curHolder;
创建一个可运行的以隐藏CardView:
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
@Override
public void run() {
Log.d("mId", String.valueOf(curHolder.container.getId()));
curHolder.cardView.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)
// handler.postDelayed(this,500); };
提交完成后将其发布:
Fragment f;
f = new CardBackFragment();
// Then just replace the recycler view fragment as usually
((FragmentActivity) context).getFragmentManager().beginTransaction()
.setCustomAnimations(
R.animator.card_flip_right_in,
R.animator.card_flip_right_out,
R.animator.card_flip_left_in,
R.animator.card_flip_left_out)
.addToBackStack(null)
.replace(newContainerId, f).commit();
// Once all fragment replacement is done we can show the hidden container
handler.post(runnable);
Run Code Online (Sandbox Code Playgroud)尽管它发生的非常快。handler.postDelayed(runnable, 100);如果要确保在任何情况下都能成功替换该片段,可以使用代替
这是完整的代码(因为我的英语真的很不好,所以我以防万一)
private void flipcard(final RecyclerView.ViewHolder holder)
{
final MyHolder myHolderflipcard= (MyHolder) holder;
String nim=mysr_id.get(Integer.parseInt(mpref.getradio_button_value()));
Pattern pattern = Pattern.compile("[0-9]+");
Matcher matcher = pattern.matcher(nim);
if (matcher.find())
{
currentsrid=Integer.parseInt(matcher.group(0));
if (currentsrid!=flag)
{
flag = Integer.parseInt(matcher.group(0));
// Delete old fragment
int containerId = myHolderflipcard.container.getId();// Get container id
Fragment oldFragment = ((FragmentActivity) context).getFragmentManager().findFragmentById(containerId);
if(oldFragment != null)
{
((FragmentActivity) context).getFragmentManager().beginTransaction().remove(oldFragment).commit();
}
int newContainerId = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
newContainerId = View.generateViewId();
}
// Set the new Id to our know fragment container
myHolderflipcard.container.setId(newContainerId);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
curHolder = myHolderflipcard;
}
// Just for Testing we are going to create a new fragment according
// if the view position is pair one fragment type is created, if not
// a different one is used.
{
Fragment f;
f = new CardBackFragment();
// Then just replace the recycler view fragment as usually
((FragmentActivity) context).getFragmentManager().beginTransaction()
.setCustomAnimations(
R.animator.card_flip_right_in,
R.animator.card_flip_right_out,
R.animator.card_flip_left_in,
R.animator.card_flip_left_out)
.addToBackStack(null)
.replace(newContainerId, f).commit();
// Once all fragment replacement is done we can show the hidden container
handler.post(runnable);
//myHolderflipcard.container.setVisibility(View.VISIBLE);
//myHolderflipcard.radioGroup.setVisibility(View.GONE);
//myHolderflipcard.tvQuestion.setVisibility(View.GONE);
// myHolderflipcard.cardView.setVisibility(View.GONE);
}
}else
{
// backtoorignal=false;
// ((FragmentActivity)context). getFragmentManager().popBackStack();
}
}
}
private MyHolder curHolder;
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
@Override
public void run() {
Log.d("mId", String.valueOf(curHolder.container.getId()));
curHolder.cardView.setVisibility(View.GONE);
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4353 次 |
| 最近记录: |