在 RecyclerView Adapter 上滑行,当我尝试将 Fragment 放入 Activity 时,应用程序崩溃了
Glide at RecyclerViewAdapter it is crashing the app when I try to see a Fragment into an Activity
我有一个 Fragment
到一个 Activity
,我在那里显示来自 RecyclerView
的数据。
当我单击一个按钮时,它会将我转到 Activity。
在 Adapter
中,我想尝试 Glide
获取图标,但问题是 Glide
它正在使应用程序崩溃。
如果我用 setImageResource
手动添加一个图标,它不会使应用程序崩溃,但我想用 Glide
添加,因为图标取决于 url
.
这是代码。
Adapter.class
public class ReadingListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
ArrayList<ReadingList> arrayList;
ReadingListDB readingListDB;
String BASE_URL = "https://www.google.com/s2/favicons?domain=";
public ReadingListAdapter(Context mContext, ArrayList<ReadingList> arrayList) {
this.mContext = mContext;
this.arrayList = arrayList;
}
@NonNull
@Override
public ReadingListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.reading_item, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int i) {
final ViewHolder viewHolder = (ViewHolder) holder;
readingListDB = new ReadingListDB(mContext);
viewHolder.readingListTitle.setText(arrayList.get(i).getPageTitle());
viewHolder.readingListUrl.setText(arrayList.get(i).getUrl());
String imageURL = BASE_URL + arrayList.get(i).getUrl();
viewHolder.imgFavIcon.setImageResource(R.drawable.default_favicon); //Here is the set manually
Glide.with(mContext)
.load(imageURL)
.into(viewHolder.imgFavIcon);
Activity.class
public class ActivityBookmarksFavorites extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "ActivityBookmark";
Button btnChangeBookmark, speedDial, readingList;
LinearLayout addBookmarkLayout;
ImageView addBookmark;
BookmarkDB bookmarkDB;
String data = null;
Button btnClose;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bookmarks);
speedDial = findViewById(R.id.btnFavSites);
readingList = findViewById(R.id.btnFavPages);
bookmarkDB = new BookmarkDB(this);
Intent receivedIntent = getIntent();
String test = receivedIntent.getStringExtra("SpeedDial");
SpeedDialFragment newFragment = new SpeedDialFragment();
ReadingListFragment newFragment2 = new ReadingListFragment();
if ("SpeedDial".equals(test)) {
getSupportFragmentManager().beginTransaction().add(R.id.frameLayoutWithFragment, newFragment).commit();
speedDial.setSelected(true);
speedDial.setClickable(true);
} else {
getSupportFragmentManager().beginTransaction().add(R.id.frameLayoutWithFragment, newFragment2).commit();
readingList.setSelected(true);
readingList.setClickable(true);
}
Fragment.class
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
paramView = inflater.inflate(R.layout.fragment_reading_list, container, false);
linLayoutEmptyLis = paramView.findViewById(R.id.linLayoutEmptyListReading);
mRecyclerView = paramView.findViewById(R.id.lvReading);
readingListAdapter = new ReadingListAdapter(mContext, arrayList);
readingListDB = new ReadingListDB(getActivity());
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext);
mRecyclerView.setLayoutManager(linearLayoutManager);
mRecyclerView.setHasFixedSize(true);
ReadingList readingList = new ReadingList();
DividerItemDecoration mDividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(),
linearLayoutManager.getOrientation());
mRecyclerView.addItemDecoration(mDividerItemDecoration);
new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(mRecyclerView);
final Cursor data = readingListDB.getData();
单击并发送到 Activity 的按钮。
MainActivity.class
bookmark.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ActivityBookmarksFavorites.class);
startActivity(intent);
}
});
Glide 出错
You cannot start a load on a not yet attached View or a Fragment where getActivity() returns null (which usually occurs when getActivity() is called before the Fragment is attached or after the Fragment is destroyed)
您在 Fragment.class 的 onCreateView 的第 4 行中使用了未初始化的变量 (mContext)。只需在之前初始化它或调用 getActivity() 以提供有效的上下文。
我有一个 Fragment
到一个 Activity
,我在那里显示来自 RecyclerView
的数据。
当我单击一个按钮时,它会将我转到 Activity。
在 Adapter
中,我想尝试 Glide
获取图标,但问题是 Glide
它正在使应用程序崩溃。
如果我用 setImageResource
手动添加一个图标,它不会使应用程序崩溃,但我想用 Glide
添加,因为图标取决于 url
.
这是代码。
Adapter.class
public class ReadingListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
ArrayList<ReadingList> arrayList;
ReadingListDB readingListDB;
String BASE_URL = "https://www.google.com/s2/favicons?domain=";
public ReadingListAdapter(Context mContext, ArrayList<ReadingList> arrayList) {
this.mContext = mContext;
this.arrayList = arrayList;
}
@NonNull
@Override
public ReadingListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.reading_item, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int i) {
final ViewHolder viewHolder = (ViewHolder) holder;
readingListDB = new ReadingListDB(mContext);
viewHolder.readingListTitle.setText(arrayList.get(i).getPageTitle());
viewHolder.readingListUrl.setText(arrayList.get(i).getUrl());
String imageURL = BASE_URL + arrayList.get(i).getUrl();
viewHolder.imgFavIcon.setImageResource(R.drawable.default_favicon); //Here is the set manually
Glide.with(mContext)
.load(imageURL)
.into(viewHolder.imgFavIcon);
Activity.class
public class ActivityBookmarksFavorites extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "ActivityBookmark";
Button btnChangeBookmark, speedDial, readingList;
LinearLayout addBookmarkLayout;
ImageView addBookmark;
BookmarkDB bookmarkDB;
String data = null;
Button btnClose;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bookmarks);
speedDial = findViewById(R.id.btnFavSites);
readingList = findViewById(R.id.btnFavPages);
bookmarkDB = new BookmarkDB(this);
Intent receivedIntent = getIntent();
String test = receivedIntent.getStringExtra("SpeedDial");
SpeedDialFragment newFragment = new SpeedDialFragment();
ReadingListFragment newFragment2 = new ReadingListFragment();
if ("SpeedDial".equals(test)) {
getSupportFragmentManager().beginTransaction().add(R.id.frameLayoutWithFragment, newFragment).commit();
speedDial.setSelected(true);
speedDial.setClickable(true);
} else {
getSupportFragmentManager().beginTransaction().add(R.id.frameLayoutWithFragment, newFragment2).commit();
readingList.setSelected(true);
readingList.setClickable(true);
}
Fragment.class
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
paramView = inflater.inflate(R.layout.fragment_reading_list, container, false);
linLayoutEmptyLis = paramView.findViewById(R.id.linLayoutEmptyListReading);
mRecyclerView = paramView.findViewById(R.id.lvReading);
readingListAdapter = new ReadingListAdapter(mContext, arrayList);
readingListDB = new ReadingListDB(getActivity());
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext);
mRecyclerView.setLayoutManager(linearLayoutManager);
mRecyclerView.setHasFixedSize(true);
ReadingList readingList = new ReadingList();
DividerItemDecoration mDividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(),
linearLayoutManager.getOrientation());
mRecyclerView.addItemDecoration(mDividerItemDecoration);
new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(mRecyclerView);
final Cursor data = readingListDB.getData();
单击并发送到 Activity 的按钮。
MainActivity.class
bookmark.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ActivityBookmarksFavorites.class);
startActivity(intent);
}
});
Glide 出错
You cannot start a load on a not yet attached View or a Fragment where getActivity() returns null (which usually occurs when getActivity() is called before the Fragment is attached or after the Fragment is destroyed)
您在 Fragment.class 的 onCreateView 的第 4 行中使用了未初始化的变量 (mContext)。只需在之前初始化它或调用 getActivity() 以提供有效的上下文。