I have created a very simple project, displaying 28 images with StaggeredGridLayoutManager
by recyclerview. but as I scroll the recyclerview it moves items for example from left to right or swap the column of left and right.
codes:
import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; public class MainActivity extends Activity { String mImageDir; private RecyclerView mRecyclerView; private StaggeredGridLayoutManager mLayoutManager; MyRecyclerAdapter myRecyclerAdapter; List mImageList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRecyclerView = (RecyclerView)findViewById(R.id.recyclerview_rootview); mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL); mLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS); mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setHasFixedSize(false); mImageList = new ArrayList(); for (int i = 1; i
And the adapter:
public class MyRecyclerAdapter extends RecyclerView.Adapter { private List mItems; Context mContext; public MyRecyclerAdapter(Context context,List objects) { mContext = context; mItems = objects; } static class ViewHolder extends RecyclerView.ViewHolder{ public ImageView mImageView; public TextView mTextView; public View rootView; public ViewHolder(View itemView) { super(itemView); rootView = itemView; mImageView =(ImageView)itemView.findViewById(R.id.image); mTextView =(TextView)itemView.findViewById(R.id.title); } } @Override public int getItemCount() { return mItems.size(); } @Override public void onBindViewHolder(ViewHolder holder, int position) { ImageModel item = mItems.get(position); Picasso.with(mContext).load(item.getResId()).into(holder.mImageView); holder.mTextView.setText(item.getTitle()); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int arg1) { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); View convertView = inflater.inflate(R.layout.item, parent, false); return new ViewHolder(convertView); } }
and a sample moving item:
http://i.imgur.com/FUapm2K.gif?1
if you play (scroll up and down) you can discover more interesting animation :-)
How to prevent that and having stable layout like an ordinary listview?
Edit
@Override public void onBindViewHolder(ViewHolder holder, int position) { ImageModel item = mItems.get(position); RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams)holder.mImageView.getLayoutParams(); float ratio = item.getHeight()/item.getWidth(); rlp.height = (int)(rlp.width * ratio); holder.mImageView.setLayoutParams(rlp); Picasso.with(mContext).load(item.getResId()).into(holder.mImageView); holder.mTextView.setText(item.getTitle()); }