Ich habe einen RecycleView mit einem Adapter, der eine Liste von Servern zeigt und der Benutzer muss einen Server auswählen.notifyItemChanged() den RecyclerView scrollen und zu UP springen
, wenn ich rufe notifyItemChanged (previousPosition) innerhalb der onClick() -Methode der alte Server nicht ausgewählt und der neue Server ausgewählt zu machen, das ist die RecycleView Liste Sprung in der Mitte nach oben genau der Liste.
und dieses Problem passieren nur, wenn ich
hier in der RecycleView Liste auf einer der letzten 2 oder 3 Server klicken ist der Code meiner 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;
}
}
}
irgendwelche Lösungen zu lösen dieses Problem ? Vielen Dank.
Das Problem genau passiert, wenn ich die Layouthöhe angeben und lassen Sie es nicht
<android.support.v7.widget.RecyclerView
android:layout_width="wrap_content"
android:layout_height="400dp"
android:id="@+id/serverRecyclerView"
android:layout_margin="10dp"
/>
oder wrap_content wenn i Um zB wie das unten etwas ausdrückte:
<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"/>
genau mein Code ist:
<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"/>
Warum notifyItemChanged (previousSelected) ??? –
, weil ich möchte, dass diese vorherige Ansicht als nicht ausgewählt angezeigt wird, wenn ich es nicht alle Server als angezeigt, weil, wenn ich notifyItemChanged an dieser alten Position aufrufen wird onBindViewHolder aufrufen und es wird überprüft, ob Diese Position entspricht der Zahl, die in der hier ausgewählten Ganzzahl gespeichert wurde. if (position == ausgewählt) { halter.getBackground(). setSelected (true); } else { halter.getBackground(). SetSelected (false); } –
@OulhafianeZakariaa schnelle Notiz -> Backtick um Code, Methodennamen verbessert die Lesbarkeit (wie 'this' -> 'this') –