问题描述
在我的2列交错网格中,我使用无限列表的效果来自动按10乘10加载元素,除了我向上滚动时,其他一切都正常.前两个元素会更改其位置.就像前两项从一列跳到另一列一样.
In my Staggered Grid with 2 columns I use the effect of infinite list to automatically load elements 10 by 10, everything works fine except when I scroll up. The first two elements change their position. It is like the first two items jump from one column to another.
如我所读,适配器必须保存每个元素的状态.但是,我不知道该怎么做.
As I read, the adapter must save the state of each element. But, I do not know how to do it.
这是我用来显示StaggeredGrid功能的主要代码
This is the main code that I use to display the StaggeredGrid functionality
public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
private int space;
public SpacesItemDecoration(int space) {
this.space = space;
}
@Override
public void getItemOffsets(Rect outRect, View view,
RecyclerView parent, RecyclerView.State state) {
outRect.left = space;
outRect.right = space;
outRect.bottom = space+1;
// Add top margin only for the first item to avoid double space between items
if(parent.getChildLayoutPosition(view) == 0)
outRect.top = space;
}
}
public class SolventViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView vh_name;
public TextView vh_price;
public ImageView vh_image;
public SolventViewHolders(View v) {
super(v);
v.setOnClickListener(this);
vh_image=(ImageView)v.findViewById(R.id.thumbnail);
vh_name= (TextView) v.findViewById(R.id.title);
vh_price= (TextView) v.findViewById(R.id.subtitle);
}
public void sendImage(String url) {
Picasso.with(ctx)
.load(url)
.into(vh_image);
}
@Override
public void onClick(View view) {
int position = getPosition();
if (user_id != null) {
openDetail(MyLogs.get(position).getId_item(), MyLogs.get(position).getItemName(), MyLogs.get(position).getPrice(), MyLogs.get(position).getDescrip(), MyLogs.get(position).getId_store(), MyLogs.get(position).getId_store());
}
}
}
public class SolventRecyclerViewAdapter extends RecyclerView.Adapter<SolventViewHolders> {
private List<productItem> itemList;
private Context context;
public SolventRecyclerViewAdapter(Context context, List<productItem> itemList) {
this.itemList = itemList;
this.context = context;
}
@Override
public SolventViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_mosaico_defoult, null);
SolventViewHolders rcv = new SolventViewHolders(layoutView);
return rcv;
}
@Override
public void onBindViewHolder(SolventViewHolders holder, int position) {
holder.vh_name.setText(itemList.get(position).getName());
holder.vh_price.setText("CLP:"+itemList.get(position).getPrice());
}
@Override
public int getItemCount() {
return this.itemList.size();
}
}
#Edit 1:
这就是我实例化适配器的方式
This is how I instanciate the adapter
recyclerView = (RecyclerView)view.findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
gaggeredGridLayoutManager = new StaggeredGridLayoutManager(2, 1);
recyclerView.setLayoutManager(gaggeredGridLayoutManager);
recyclerView.addItemDecoration(new SpacesItemDecoration(2));
populateList(currentPage);
rcAdapter= new SolventRecyclerViewAdapter(ctx, MyLogs);
recyclerView.setAdapter(rcAdapter);
populate方法作为json格式的asyntask响应发生:
The populate method happens as an asyntask response that comes in json format:
...
for(int i=0; i < lengthJsonArr; i++)
{
JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
...
MyLogs.add("name,price,etc");
rcAdapter.notifyDataSetChanged();
}
这就是我保持onScroll的方式:
And this is how i hold the onScroll:
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
visibleItemCount = gaggeredGridLayoutManager.getChildCount();
totalItemCount = gaggeredGridLayoutManager.getItemCount();
int[] firstVisibleItems = null;
firstVisibleItems = gaggeredGridLayoutManager.findFirstVisibleItemPositions(firstVisibleItems);
if (firstVisibleItems != null && firstVisibleItems.length > 0) {
pastVisiblesItems = firstVisibleItems[0];
}
if (loading) {
if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
loading= false;
Log.d("tag", "LOAD NEXT ITEM");
currentPage = currentPage + 1;
populateList(currentPage);
}
}
}
});
感谢您的帮助
推荐答案
这是一个功能.重新排序和重新定位视图,以实现物品的无缝组合.
This is a feature. Reordering and repositioning view for a seamless tream of items.
使用 setGapStrategy(int gapStrategy)
您可能需要GAP_HANDLING_NONE
.
这篇关于Android RecyclerView StaggeredGrid项在滚动顶部时更改位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!