Android 如何创建滚动到选定位置的回收器视图
我正在尝试制作一个应用程序,当我们在recycler视图中单击特定项目时,它应该在recycler视图中启动一个片段,以在屏幕中央显示所选项目,就像instagram网格视图一样。当我们选择一篇文章时,它会在中心显示所选文章的详细信息,我们还可以滚动到其他文章 这是我的网格适配器Android 如何创建滚动到选定位置的回收器视图,android,android-recyclerview,onclicklistener,scrollable,Android,Android Recyclerview,Onclicklistener,Scrollable,我正在尝试制作一个应用程序,当我们在recycler视图中单击特定项目时,它应该在recycler视图中启动一个片段,以在屏幕中央显示所选项目,就像instagram网格视图一样。当我们选择一篇文章时,它会在中心显示所选文章的详细信息,我们还可以滚动到其他文章 这是我的网格适配器 public class PostImageAdapter extends RecyclerView.Adapter<PostViewHolder> { private Context context;
public class PostImageAdapter extends RecyclerView.Adapter<PostViewHolder> {
private Context context;
private List<Post> posts;
private OnGridItemSelected onGridItemSelected;
public PostImageAdapter(Context context) {
this.context = context;
posts = new ArrayList<>();
onGridItemSelected = (OnGridItemSelected) context;
}
@Override
public PostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.layout_squareimage, parent, false);
return new PostViewHolder(view);
}
@Override
public void onBindViewHolder(PostViewHolder holder, final int position) {
Post post = posts.get(position);
Glide.with(context).load(post.getImagePath())
.error(R.drawable.ic_refresh)
.placeholder(R.color.grey_3)
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.into(holder.imageView);
final int adapterPosition = holder.getAdapterPosition();
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context, "Adapter Position is" + adapterPosition , Toast.LENGTH_SHORT).show();
onGridItemSelected.onItemSelected(adapterPosition);
}
});
}
public void addPaths(List<Post> paths) {
int startIndex = posts.size();
posts.addAll(paths);
notifyItemRangeInserted(startIndex, posts.size());
}
@Override
public int getItemCount() {
return posts.size();
}
公共类PostImageAdapter扩展了RecyclerView.Adapter{
私人语境;
私人名单员额;
已选择专用OnGridItemSelected OnGridItemSelected;
公共PostImageAdapter(上下文){
this.context=上下文;
posts=newarraylist();
onGridItemSelected=(onGridItemSelected)上下文;
}
@凌驾
public PostViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图=LayoutFlater.from(上下文)。充气(R.layout.layout_squareimage,父级,false);
返回新的PostViewHolder(视图);
}
@凌驾
公共无效onBindViewHolder(PostViewHolder,最终int位置){
Post Post=posts.get(位置);
Glide.with(context.load)(post.getImagePath())
.错误(R.drawable.ic_刷新)
.占位符(R.color.grey_3)
.diskCacheStrategy(diskCacheStrategy.RESULT)
.插入(支架.图像视图);
final int adapterPosition=holder.getAdapterPosition();
holder.imageView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Toast.makeText(上下文,“适配器位置为”+适配器位置,Toast.LENGTH_SHORT).show();
onGridItemSelected.onItemSelected(适配器位置);
}
});
}
公共无效添加路径(列表路径){
int startIndex=posts.size();
posts.addAll(路径);
notifyItemRangeInserted(startIndex,posts.size());
}
@凌驾
public int getItemCount(){
返回后。大小();
}
我的网格碎片
public void setupGrid() {
mRecyclerView.setLayoutManager(new GridLayoutManager(context, 3));
final PostImageAdapter adapter = new PostImageAdapter(context);
mRecyclerView.setAdapter(adapter);
mRecyclerView.setHasFixedSize(true);
FirebaseQuery.getAllPost().addListenerForSingleValueEvent(new ValueEventListener() {
final ArrayList<Post> posts = new ArrayList<>();
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
posts.clear();
for (DataSnapshot ds : dataSnapshot.getChildren()) {
posts.add(ds.getValue(Post.class));
}
adapter.addPaths(posts);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
public void setupGrid(){
setLayoutManager(新的GridLayoutManager(上下文,3));
最终PostImageAdapter=新的PostImageAdapter(上下文);
mRecyclerView.setAdapter(适配器);
mRecyclerView.setHasFixedSize(true);
FirebaseQuery.getAllPost().addListenerForSingleValueEvent(新值EventListener()){
最终ArrayList posts=新ArrayList();
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
posts.clear();
对于(DataSnapshot ds:DataSnapshot.getChildren()){
posts.add(ds.getValue(Post.class));
}
adapter.addpath(posts);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
后细节片段
public class PostDetailsFragment extends Fragment {
private static final String TAG = PostDetailsFragment.class.getSimpleName();
@BindView(R.id.postDetailsRecyclerView)
RecyclerView mRecyclerView;
private Unbinder unbinder;
private Context context;
private int i;
public PostDetailsFragment() {
super();
setArguments(new Bundle());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_post_details, container, false);
unbinder = ButterKnife.bind(this, view);
context = getActivity();
try {
i = getPosition();
} catch (NullPointerException e) {
Log.d(TAG, "onCreateView:" + e.getMessage());
}
return view;
}
@Override
public void onStart() {
super.onStart();
setRecyclerView(i);
}
private int getPosition() {
Bundle bundle = this.getArguments();
if (bundle != null) {
return bundle.getInt(context.getString(R.string.key));
} else {
return 0;
}
}
public void setRecyclerView(int position) {
final PostImageAdapter adapter = new PostImageAdapter(context);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
mRecyclerView.setLayoutManager(linearLayoutManager);
linearLayoutManager.scrollToPosition(position);
mRecyclerView.setAdapter(adapter);
FirebaseQuery.getAllPost().addListenerForSingleValueEvent(new ValueEventListener() {
final ArrayList<Post> posts = new ArrayList<>();
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
posts.clear();
for (DataSnapshot ds : dataSnapshot.getChildren()) {
posts.add(ds.getValue(Post.class));
}
adapter.addPaths(posts);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
unbinder.unbind();
}
公共类PostDetailsFragment扩展了片段{
私有静态最终字符串标记=PostDetailsFragment.class.getSimpleName();
@BindView(R.id.postDetailsRecyclerView)
回收视图mRecyclerView;
私人无障碍者;
私人语境;
私人互联网i;
公共PostDetailsFragment(){
超级();
setArguments(新Bundle());
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.fragment\u post\u详细信息,容器,错误);
unbinder=ButterKnife.bind(这个,视图);
context=getActivity();
试一试{
i=getPosition();
}捕获(NullPointerException e){
d(标记“onCreateView:+e.getMessage());
}
返回视图;
}
@凌驾
public void onStart(){
super.onStart();
setRecyclerView(一);
}
private int getPosition(){
Bundle=this.getArguments();
if(bundle!=null){
返回bundle.getInt(context.getString(R.string.key));
}否则{
返回0;
}
}
公共void setRecyclerView(内部位置){
最终PostImageAdapter=新的PostImageAdapter(上下文);
LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(上下文);
mRecyclerView.setLayoutManager(linearLayoutManager);
linearLayoutManager.scrollToPosition(位置);
mRecyclerView.setAdapter(适配器);
FirebaseQuery.getAllPost().addListenerForSingleValueEvent(新值EventListener()){
最终ArrayList posts=新ArrayList();
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
posts.clear();
对于(DataSnapshot ds:DataSnapshot.getChildren()){
posts.add(ds.getValue(Post.class));
}
adapter.addpath(posts);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
@凌驾
公共空间{
super.ondestory();
unbinder.unbind();
}
}
我试图传递适配器位置,并将适配器设置为滚动/从该位置开始,但它似乎不起作用。请帮助我创建类似instagram的系统,在该系统中,它以线性布局显示带有详细信息的详细帖子