android - notifyItemChanged() 使 RecyclerView 滚动并跳转到 UP

标签 android android-recyclerview

我有一个带有显示服务器列表的适配器的 RecycleView 并且用户必须选择一个服务器。

当我在 onClick() 方法中调用 notifyItemChanged(previousPosition) 时 取消选择旧服务器并选择新服务器, 这使得 RecycleView 列表恰好跳到列表的中间。

当我单击 RecycleView 列表中的最后 2 或 3 个服务器之一时,就会发生此问题

这是我的 RecyclerView.Adapter 的代码:

public class ServerAdapter extends RecyclerView.Adapter<ServerAdapter.ServerViewHolder> {

    private List<Server> listServers = new ArrayList<>();
    private int[] icons = new int[]{R.drawable.server1,R.drawable.server2,R.drawable.server3,R.drawable.server4,R.drawable.server5,R.drawable.server6,R.drawable.offline};
    private int selected = 0;
    private int previousSelected = 0;

    public ServerAdapter(List<Server> listServers){
        this.listServers = listServers;
    }

    @Override
    public ServerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.server_relative_layout,parent,false);
        return new ServerViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ServerViewHolder holder, final int position) {
        if(position == selected){
            holder.getBackground().setSelected(true);
        }else{
            holder.getBackground().setSelected(false);
        }
        holder.getBackground().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(position != selected){
                    previousSelected = selected;
                    selected = position;
                    holder.getBackground().setSelected(true);
                    notifyItemChanged(previousSelected);
                }
            }
        });
        holder.getImageServer().setImageResource(icons[position%6]);
        holder.getTextNameServer().setText(listServers.get(position).getName());
        holder.getTextConnected().setText(listServers.get(position).getUrl());
    }

    @Override
    public int getItemCount() {
        return listServers.size();
    }

    public class ServerViewHolder extends RecyclerView.ViewHolder{
        private ImageView imageServer;
        private TextView textNameServer;
        private TextView textConnected;
        private View background;
        public ServerViewHolder(View itemView) {
            super(itemView);
            imageServer = (ImageView)itemView.findViewById(R.id.imageServer);
            textNameServer = (TextView)itemView.findViewById(R.id.textNameServer);
            textConnected = (TextView)itemView.findViewById(R.id.textConnected);
            background = itemView;
        }

        public ImageView getImageServer() {
            return imageServer;
        }

        public TextView getTextConnected() {
            return textConnected;
        }

        public TextView getTextNameServer() {
            return textNameServer;
        }

        public View getBackground() {
            return background;
        }
    }
}

有解决这个问题的方法吗?谢谢。

当我指定布局高度并且不让它 wrap_content 时,问题就发生了

<android.support.v7.widget.RecyclerView
    android:layout_width="wrap_content"
    android:layout_height="400dp"
    android:id="@+id/serverRecyclerView"
    android:layout_margin="10dp"
/>

或者当我把它放在下面这样的例子时:

<android.support.v7.widget.RecyclerView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/serverRecyclerView"
    android:layout_margin="10dp"
    android:layout_below="@+id/image"/>

我的代码是:

<android.support.v7.widget.RecyclerView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/serverRecyclerView"
    android:layout_margin="10dp"
    android:layout_alignTop="@+id/imageBall"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_toRightOf="@+id/camera"
    android:layout_toEndOf="@+id/camera"/>

最佳答案

看起来这是一个错误:https://code.google.com/p/android/issues/detail?id=203574

最好的解决方法似乎是 Bart 将 RecyclerView 的 LinearLayoutManager 的 AutoMeasure 属性设置为 false 的答案。

  LinearLayoutManager llm = new LinearLayoutManager(context);
  llm.setAutoMeasureEnabled(false);       
  recyclerView.setLayoutManager(llm);

将 FixedSize 设置为 true 的解决方案有太多的副作用......

RecyclerView.setHasFixedSize(真)

关于android - notifyItemChanged() 使 RecyclerView 滚动并跳转到 UP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36724898/

相关文章:

android - 同一滚动下的水平和垂直 RecyclerView

java - 从服务器日期获取时区

android - 巴士座位预订管理

java - android - 如何获取当前方向?

android - 有没有办法获得总设备内存?我需要它进行优化

android - 没有连接适配器;单击后退按钮并再次启动应用程序时跳过布局

java - 当我删除一个项目时,回收站查看列表修改所有项目

android - RecyclerView 适配器给出错误 "The hierarchy of the type RecycleAdapter is inconsistent"

java - Android APK 文件的 MD5 校验和不同。为什么?

android - 在 onPostExecute() 中运行另一个 AsyncTask