2016-04-19 6 views
8

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"/> 
+0

Warum notifyItemChanged (previousSelected) ??? –

+0

, 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); } –

+0

@OulhafianeZakariaa schnelle Notiz -> Backtick um Code, Methodennamen verbessert die Lesbarkeit (wie 'this' -> 'this') –

Antwort

2

ich weiß nicht, warum, aber ich verwendet:

RecyclerView.setHasFixedSize(true) 

Das funktionierte für mich. Ich hoffe, es kann helfen.

+0

nicht für mich funktioniert –

+0

Does Ich arbeite auch nicht für mich. – clocksmith

10

Sieht aus wie dies ein Fehler ist: https://code.google.com/p/android/issues/detail?id=203574

Die beste Abhilfe scheint Bart Antwort zu sein, um die RecyclerView des LinearLayoutManager des AutoMeasure Eigenschaft auf false gesetzt.

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

Das Set FixedSize auf echte Lösung zu viele Nebenwirkungen hatten ...

RecyclerView.setHasFixedSize (true)

+4

Das funktioniert nicht für mich. Stattdessen verschwinden alle meine Ansichten innerhalb der RecyclerView. – clocksmith

+0

löste mein Problem. Es sollte die akzeptierte Antwort sein! –

+0

nach vielen Suchen ist dies nur eine Lösung, vielen Dank –

0

ich über das ähnliche Problem kam, nehmen Sie nur Pflege der XML-Layout-Datei.
Verwenden Sie nicht die layout_below, layout_above oder andere ähnliche Eigenschaften in RecyclerView oder RecyclerView der übergeordneten Ansicht.
Sie können LinearLayout weight, layout_marginBottom oder etw. Verwenden, um
layout_below oder andere zu erreichen.

0
RecyclerView.ItemAnimator animator = myRecyclerListView.getItemAnimator(); 
if (animator instanceof SimpleItemAnimator) { 
    ((SimpleItemAnimator)animator).setSupportsChangeAnimations(false); 
} 
1

für alle, die auf dieses Problem stolpern, versuchen

yourRecyclerView.notifyItemChanged(int position, Object payload); 

diese einen mit nicht für mich, den Trick.

Mit

setAutoMeasureEnabled(false); 

auch gearbeitet, aber in einigen Fällen Rand Recycler Blick seltsam benahm. Viel Glück!

Verwandte Themen