- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在关注 Android Developer CodeLab ( link )。将设备翻转为横向时,我无法获取 notifyDataSetChanged() 或 notifyItemRangeInserted() 来更新我的适配器。我在我的对象上实现了 Parcelable,它在从 onSaveInstanceState 包中拉出后正确地恢复了我的 ArrayList。但是当我调试这些 RecyclerView 方法时,适配器没有填充 ArrayList。此外,我注意到在横向模式下,将 ArrayList 重置为默认 11 项的 FAB 在设备翻转为横向模式时也不起作用。这让我相信某些东西可能属于错误的类别。
主 Activity
public class MainActivity extends AppCompatActivity {
// Tag for key in instance save bundle
static final String SPORT_ARRAY = "Sport Array";
// Member variables
private RecyclerView mRecyclerView;
private ArrayList<Sport> mSportsData;
private SportsAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize the RecyclerView
mRecyclerView = findViewById(R.id.recyclerView);
// Set the Layout Manager
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
// Initialize the ArrayList that will contain the data.
mSportsData = new ArrayList<>();
// Initialize the adapter and set it to the RecyclerView.
mAdapter = new SportsAdapter(this, mSportsData);
mRecyclerView.setAdapter(mAdapter);
// Get the data or restore it
if (savedInstanceState == null || !savedInstanceState.containsKey(SPORT_ARRAY)) {
initializeData();
} else {
restoreData(savedInstanceState);
}
// Helper class for creating swipe to dismiss and drag and drop functionality.
ItemTouchHelper helper = new ItemTouchHelper(
new ItemTouchHelper.SimpleCallback(ItemTouchHelper.LEFT |
ItemTouchHelper.RIGHT | ItemTouchHelper.DOWN | ItemTouchHelper.UP,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
/**
* Defines the drag and drop functionality.
*
* @param recyclerView The RecyclerView that contains the list items
* @param viewHolder The SportsViewHolder that is being moved.
* @param target The SportsViewHolder that you are switching the original one
* with.
* @return true if the item was removed, false otherwise.
*/
@Override
public boolean onMove(@NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder viewHolder,
@NonNull RecyclerView.ViewHolder target) {
// Get the from and to positions.
int from = viewHolder.getAdapterPosition();
int to = target.getAdapterPosition();
// Swap the items and notify the adapter.
Collections.swap(mSportsData, from, to);
mAdapter.notifyItemMoved(from, to);
return true;
}
/**
* Defines the swipe to dismiss functionality.
* @param viewHolder The ViewHolder being swiped.
* @param direction The direction it is swiped in.
*/
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
mSportsData.remove(viewHolder.getAdapterPosition());
mAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
}
});
// Attach the helper to the RecyclerView.
helper.attachToRecyclerView(mRecyclerView);
}
/**
* Method for initializing the sports data from resources.
*/
private void initializeData() {
// Get the resources from the XML file
String[] sportsList = getResources().getStringArray(R.array.sports_titles);
String[] sportsInfo = getResources().getStringArray(R.array.sports_info);
String[] sportsDetail = getResources().getStringArray(R.array.sports_detail_text);
TypedArray sportsImageResources = getResources().obtainTypedArray(R.array.sports_images);
// Clear the existing data (to avoid duplication)
mSportsData.clear();
// Create the ArrayList of Sports objects with the titles and information about each sport.
for (int i = 0; i < sportsList.length; i++) {
mSportsData.add(new Sport(sportsList[i], sportsInfo[i],
sportsDetail[i], sportsImageResources.getResourceId(i, 0)));
}
// Recycle the sports image resource array.
sportsImageResources.recycle();
// Notify the adapter of the change.
mAdapter.notifyDataSetChanged();
}
private void restoreData(Bundle savedBundle) {
mSportsData.clear();
mSportsData = savedBundle.getParcelableArrayList(SPORT_ARRAY);
// Notify the adapter of inserted items
mAdapter.notifyItemRangeInserted(0, mSportsData.size());
}
/**
* onClick method for the FAB that resets the data.
* @param view The button view that was clicked.
*/
public void resetSports(View view) {
initializeData();
}
/**
* Save the instance state
* @param outState The current instance state
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putParcelableArrayList(SPORT_ARRAY, mSportsData);
super.onSaveInstanceState(outState);
}
}
运动适配器
public class SportsAdapter extends RecyclerView.Adapter<SportsAdapter.ViewHolder>{
// Member variables
private ArrayList<Sport> mSportsData;
private Context mContext;
/**
* Constructor that passes in the sports data and the context.
* @param context Context of the application.
* @param sportsData ArrayList containing the sports data.
*/
SportsAdapter(Context context, ArrayList<Sport> sportsData) {
this.mSportsData = sportsData;
this.mContext = context;
}
/**
* Required method for creating the ViewHolder objects.
* @param viewGroup The ViewGroup into which the View will be added after it is bound to an
* adapter position.
* @param i The view type of the new View.
* @return The newly created ViewHolder.
*/
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.list_item, viewGroup,
false));
}
/**
* Required method that binds the data to the ViewHolder.
* @param viewHolder The ViewHolder into which the data should be put.
* @param i The adapter position.
*/
@Override
public void onBindViewHolder(@NonNull SportsAdapter.ViewHolder viewHolder, int i) {
// Get the current sport.
Sport currentSport = mSportsData.get(i);
// Populate the TextViews with data.
viewHolder.bindTo(currentSport);
}
/**
* Required method for determining the size of the data set.
* @return Size of the data set.
*/
@Override
public int getItemCount() {
return mSportsData.size();
}
/**
* ViewHolder class that represents each row of data in the RecyclerVIew.
*/
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
// Member variables for the TextViews.
private TextView mTitleText;
private TextView mInfoText;
private ImageView mSportsImage;
/**
* Constructor for the ViewHolder, used in onCreateViewHolder().
* @param itemView The rootview of the list_item.xml layout file.
*/
ViewHolder(View itemView) {
super(itemView);
// Initialize the views
mTitleText = itemView.findViewById(R.id.title);
mInfoText = itemView.findViewById(R.id.subTitle);
mSportsImage = itemView.findViewById(R.id.sportsImage);
// Set the OnClickListener to the entire view.
itemView.setOnClickListener(this);
}
void bindTo(Sport currentSport) {
// Populate the TextViews with data.
mTitleText.setText(currentSport.getTitle());
mInfoText.setText(currentSport.getInfo());
Glide.with(mContext).load(currentSport.getImageResource()).into(mSportsImage);
}
/**
* Handle click to show DetailActivity.
*
* @param v The view that was clicked.
*/
@Override
public void onClick(View v) {
Sport currentSport = mSportsData.get(getAdapterPosition());
Intent detailIntent = new Intent(mContext, DetailActivity.class);
detailIntent.putExtra("title", currentSport.getTitle());
detailIntent.putExtra("detail", currentSport.getDetail());
detailIntent.putExtra("image_resource", currentSport.getImageResource());
mContext.startActivity(detailIntent);
}
}
}
运动课
public class Sport implements Parcelable {
// Member variables representing the title and information about the sport.
private String mTitle;
private String mInfo;
private String mDetail;
private final int mImageResource;
/**
* Constructor for the Sport data model.
* @param title The name of the sport.
* @param info Information about the sport.
* @param detail Details about the sport (from Wikipedia).
* @param imageResource The image resource.
*/
Sport(String title, String info, String detail, int imageResource) {
this.mTitle = title;
this.mInfo = info;
this.mDetail = detail;
this.mImageResource = imageResource;
}
protected Sport(Parcel in) {
mTitle = in.readString();
mInfo = in.readString();
mDetail = in.readString();
mImageResource = in.readInt();
}
public static final Creator<Sport> CREATOR = new Creator<Sport>() {
@Override
public Sport createFromParcel(Parcel in) {
return new Sport(in);
}
@Override
public Sport[] newArray(int size) {
return new Sport[size];
}
};
/**
* Gets the title of the sport.
* @return The title of the sport.
*/
String getTitle() {
return mTitle;
}
/**
* Gets the info about the sport.
* @return The info about the sport.
*/
String getInfo() {
return mInfo;
}
/**
* Gets the details about the sport (from Wikipedia).
* @return The details about the sport.
*/
String getDetail() {
return mDetail;
}
/**
* Gets the image resource.
* @return The image resource.
*/
public int getImageResource() {
return mImageResource;
}
/**
* Describe the kinds of special objects contained in this Parcelable
* instance's marshaled representation. For example, if the object will
* include a file descriptor in the output of {@link #writeToParcel(Parcel, int)},
* the return value of this method must include the
* {@link #CONTENTS_FILE_DESCRIPTOR} bit.
*
* @return a bitmask indicating the set of special object types marshaled
* by this Parcelable object instance.
*/
@Override
public int describeContents() {
return 0;
}
/**
* Flatten this object in to a Parcel.
*
* @param dest The Parcel in which the object should be written.
* @param flags Additional flags about how the object should be written.
* May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mTitle);
dest.writeString(mInfo);
dest.writeString(mDetail);
dest.writeInt(mImageResource);
}
}
最佳答案
您没有正确更新适配器。当需要在 restoreData() 方法中从已保存的 Bundle 中恢复列表时,您可以执行以下操作:
mSportsData = savedBundle.getParcelableArrayList(SPORT_ARRAY);
这只是将 mSportsData 引用更改为指向 Bundle 中的列表。但是,RecyclerView 的适配器将基于您最初在 onCreate() 中创建的空列表:
mSportsData = new ArrayList<>();
这就是为什么您的 FAB 也失败了,因为它在适配器未使用的列表上调用了 initializeData()。
更新适配器的正确方法是将列表中的对象放入 mSportsData 中的 Bundle 中:
mSportsData.addAll(savedBundle.getParcelableArrayList(SPORT_ARRAY));
关于android - RecyclerView.notfiyDataSetChanged() 在横向布局中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54830035/
我在另一个 RecyclerView(parentRecyclerView) 中实现了 RecyclerView(childRecyclerView),图片说明了所有的实现: 我想编写一个 espre
我正在构建一个应用程序,它使用ViewPager2在页面之间水平滚动,每个页面都有一个垂直滚动的内容RecyclerView,其中每个列表的第一个位置都有一行水平滚动小部件,例如附加到寻呼机指示器类型
我正在尝试实现一个水平的 recyclerview 并且 recyclerview 的每个项目都将是一个具有网格布局的垂直 recyclerview。我面临的问题是,当我尝试垂直滚动子 recycle
我使用显示条目列表的 RecyclerView。每个条目都托管另一个 RecyclerView,它是一个图像列表。 我现在想让这个嵌套的 RecyclerView 可点击,而不是它的项目,而是整个 V
我正在尝试将手机中的图像加载到我的回收 View 中。 到目前为止,我已经创建了一个 recyclerview.adapter 和一个 gridlayoutmanager,并将它们附加到我的 recy
我需要一个可扩展 View ,其中父/可扩展标题将具有文本和下拉箭头。每个此类标题的子项应该是在网格结构中具有多个项目的 View 。 (有点像带有 GridLayoutManager 的回收器 Vi
我正在使用显示不同类别列表的 RecyclerView。每行项目还包含 RecyclerView 以显示类别项目列表。父级 RecyclerView 由垂直 LinearLayoutManager 填
我正在更新一个旧的 Android 项目,现在我从 RecyclerView 中反复收到这条日志语句: W/RecyclerView:RecyclerView 不支持滚动到绝对位置。改为使用 scro
在我的 Adapter 中,我调用 LayoutManager.ChildAt(position) 来获取 itemview,但是我得到的 View 不是匹配的 itemview,当我调用 notif
我正在从 ListView 迁移到 RecyclerView,但是在 SQLite 中输入一些数据后,我的列表没有使用 notifyDataSetChanged() 更新;所以我总是要调用setAda
我正在用 Google Now Cards 的风格创建一组 5 张卡片。我首先关注的是总体布局。 我正在使用 CardView 和 RecyclerView ,我想要实现的是这样的: 这是我的 Car
在我的应用程序中,我有一个 RecyclerView,其中包含一个简单的项目 View ,每行包含一个 TextView 和一个 Spinner。 用户从操作栏中单击“保存”后,我需要遍历所有项目并获
我正在尝试检查 RecyclerView 中是否可以看到某些特定项目;但我无法实现。请帮助我确定我的项目是否在 RecyclerView 中完全可见。 mrecylerView.addOnScroll
我有一个提要片段,它的主要元素是帖子的 RecyclerView。 我正在使用 Lisa Wray 的 Groupie 库管理回收站 https://github.com/lisawray/group
我有这两个类似的行为回收器 View 适配器,它们之间的唯一区别是 onclick 方法和传递给它们的对象。所以,我正在考虑将类 B 设计为从回收器 View 适配器继承,这样我就可以更改构造函数来执
这很奇怪。我对这个问题感到沮丧。我将数据保存在 ArrayList 中。当我将数据放在 RecyclerView 上时。数据未显示在列表中。这是我的代码 listOrder.forEach { ord
编辑我通过使用 CoordinatorLayout 和 AppBarLayout 作为 header 和 TabLayout 的包装解决了这个问题。本来应该很明显,但是哦,好吧。 原始问题:我有一个设
我有一个回收 View 。我想从其适配器类更新回收器 View 。我尝试了 notiftDataSetChanged( ) 但它只适用于主类。下面是 recyclerview 适配器类的代码。 pac
我正在使用具有不同 viewholders 的 recyclerview(具有垂直 LinearLayout),其中一个有另一个 RecyclerView(带有水平 LL)。在第二个 recycler
我想创建一个与 Google Play Store 或 Netflix App 类似的布局,其中在单个 RecyclerView 中基本上有多个水平 RecyclerView。如果这不是他们做事的方式
我是一名优秀的程序员,十分优秀!