如何修复调用getParent()方法时的'Attempt to invoke virtual method on a null object reference'



我在LinearLayout中有按钮,它是RecyclerView中单元格的一部分。我想将其更改为另一个按钮,所以我使用了一些需要按钮父视图的方法,方法是调用button.getParent((方法。不幸的是,它以"尝试在空对象引用上调用虚拟方法'android.view.ViewParent android.view.View.getParent(('错误结尾。我觉得我想念看什么,但我无法捕捉到它可能是什么。我会感谢您的帮助。

在下面的代码示例中,我包含的代码在我看来对解决我的问题至关重要。当然,如果需要,我可以提供更多。

layout_cell.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/relativeLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:padding="2dp">
<RelativeLayout
android:id="@+id/subItem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/descript"
android:layout_marginTop="16dp"
android:orientation="vertical">
<LinearLayout
android:id="@+id/buttonsLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/fileNameTextViewInCell"
android:layout_marginHorizontal="8dp"
>
<Button
android:id="@+id/downloadButtonInCell"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_weight="1"
app:icon="@drawable/ic_download"
app:iconPadding="8dp" />
</LinearLayout>

</RelativeLayout>


</RelativeLayout>

细胞适配器.java:

public class CellAdapter extends RecyclerView.Adapter<CellAdapter.ViewHolder> {
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater
.from(viewGroup.getContext())
.inflate(R.layout.layout_cell, viewGroup, false);
mViewHolder = new ViewHolder(view);
return mViewHolder;
}
viewHolder.mDownloadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ViewGroupUtils.replaceView(view, mViewHolder.mLoadingButton);
view.setEnabled(false);
}
});
public class ViewHolder extends RecyclerView.ViewHolder {
RelativeLayout mRelativeLayout;
Button mDownloadButton;
Button mLoadingButton;
LinearLayout mButtonsLayout;
public ViewHolder(View itemView) {
super(itemView);
mRelativeLayout = itemView.findViewById(R.id.relativeLayout);
mDownloadButton = (Button) itemView.findViewById(R.id.downloadButtonInCell);
mLoadingButton = itemView.findViewById(R.id.loadingView);
mButtonsLayout = itemView.findViewById(R.id.buttonsLayout);
}
}

}

ViewGroupUtils.java:

public class ViewGroupUtils {
public static ViewGroup getParent(View view) {
return (ViewGroup) view.getParent();
}
public static void removeView(View view) {
ViewGroup parent = getParent(view);
if(parent != null) {
parent.removeView(view);
}
}
public static void replaceView(View currentView, View newView) {
ViewGroup parent = getParent(currentView);
if(parent == null) {
return;
}
final int index = parent.indexOfChild(currentView);
removeView(currentView);
removeView(newView);
parent.addView(newView, index);
}
}

我知道您正在动态尝试从回收器视图行中删除现有按钮并将其替换为新视图,只是建议您可以尝试此选项吗

现有视图是否处于可见状态,新视图处于隐藏/消失状态,并且基于逻辑只是翻转现有视图和新视图的可见性?

所以首先默认 --> 现有视图 -->状态可见
新建视图 --根据您的要求>状态隐藏/消失

所以根据您的情况

现有视图 -->状态隐藏/消失 新视图 -->状态可见

这可能更容易,您可能不必为回收商视图而苦恼,因为下一个挑战是获取特定行的动态 ID。

相关内容

  • 没有找到相关文章

最新更新