2017-05-20 4 views
0

Ich habe eine einfache Recycler-Ansicht, die Kartenansichten mit nur 1 ImageView innerhalb enthält, die von Ressourcen geladen wird, aber ich habe starke Lags beim Scrollen sowieso, ich habe versucht recycler.setHasFixedSize (true) aber es hilft nicht.RecyclerView Scroll Lags mit einfachen Elementen

Acitivity Code

public class MainActivity extends AppCompatActivity { 

    private final int[] drawables = { 
      R.drawable.nxt_bluetooth_dongle, 
      R.drawable.color_sensor, 
      R.drawable.connector_cabels, 
      R.drawable.e_motor, 
      R.drawable.energy_storage, 
      R.drawable.energy_display, 
      R.drawable.gyroscopic_sensor, 
      R.drawable.intelligent_nxt_brick, 
      R.drawable.keyfob_transponder, 
      R.drawable.light_sensor, 
      R.drawable.motion_sensor, 
      R.drawable.nxt_ir_receiver, 
      R.drawable.nxt_light_sensor, 
      R.drawable.nxt_servo_motor, 
      R.drawable.nxt_sound_sensor, 
      R.drawable.nxt_touch_sensor, 
      R.drawable.nxt_ultrasonic_sensor, 
      R.drawable.rf_id_sensor, 
      R.drawable.solar_panel, 
      R.drawable.tilt_sensor, 
      R.drawable.temperature_sensor, 
      R.drawable.usb_hub 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler); 
     MyAdapter adapter = new MyAdapter(drawables); 
     recycler.setAdapter(adapter); 
     recycler.setLayoutManager(new GridLayoutManager(this, 3)); 
    } 

    private class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> { 

     private int[] drawables; 

     private MyAdapter(int[] drawables) { 
      this.drawables = drawables; 
     } 

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

     @Override 
     public void onBindViewHolder(MyHolder holder, int position) { 
      holder.legoImage.setImageResource(drawables[position]); 
     } 

     @Override 
     public int getItemCount() { 
      return drawables.length; 
     } 

     class MyHolder extends RecyclerView.ViewHolder { 

      ImageView legoImage; 

      MyHolder(View itemView) { 
       super(itemView); 
       legoImage = (ImageView) itemView.findViewById(R.id.legoImage); 
       legoImage.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         Intent intent = new Intent(MainActivity.this, LegoDetailActivity.class); 
         intent.putExtra(LegoDetailActivity.EXTRA_DRAWABLE_ID, drawables[getAdapterPosition()]); 
         ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
           MainActivity.this, legoImage, "legoDetail" 
         ); 
         startActivity(intent, options.toBundle()); 
        } 
       }); 
      } 
     } 
    } 
} 

Aktivität xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/recycler" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#e0e0e0" 
    tools:context="com.lol.legomindstorms.MainActivity"> 

</android.support.v7.widget.RecyclerView> 

Recycler Artikel xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    app:cardUseCompatPadding="true" 
    app:cardCornerRadius="0dp"> 

    <ImageView 
     android:id="@+id/legoImage" 
     android:layout_width="115dp" 
     android:layout_height="115dp" 
     android:transitionName="legoDetail" /> 

</android.support.v7.widget.CardView> 
+1

versuchen Sie Picasso oder Glide, um Bild in Artikel zu setzen. –

+0

Wie @DivyeshPatel erwähnt hat, könnte es das Laden der Bilder sein. Die zwei erwähnten Bibliotheken nehmen etwas von der Arbeit des UI-Threads und ermöglichen eine flüssigere Erfahrung. Ein Nebeneffekt ist, dass Bilder in den Blickpunkt geraten. Ich würde vorschlagen, dass Sie auch die Größe/Auflösung dieser Bilder überprüfen. Es könnte 4kb auf der Festplatte sein, aber es ist tatsächlich LxWx4 oder LxW * (AARRGGBB). – tricknology

+0

Siehe meine Antwort [hier] (http://stackoverflow.com/a/43219866/7292819). Es kann bei Ihrem Problem helfen. – Gary99

Antwort

0

gut wie pro meine Erfahrung denke ich, das Problem ist, mehrere Bilder
Als Android im Laden habe Probleme beim Laden von vielen Bildern im Speicher, wird als android standardmäßig nicht viel gc memeory Größe erlauben, Schauen Sie sich Ihre Protokolle erhalten Sie ein gc Speicher über Ladefehler oder etwas ähnliches zu diesem

1.you auch versuchen können, den Heap chaning Größe

2.Try eine externe Bibliothek verwendet, ist es immer gesagt nie das Rad try gleiten neu zu erfinden oder Piccaso

3.Try Clearing Bitmap-Speicher von Ihrem selbst

PS: ich bin nicht so writter so bitte nicht mi nd wenn meine Benennung schlecht war, aber ich habe mich mit diesen Ausgaben sehr beschäftigt, also bin ich sehr mit diesem Problem vertraut

+0

Ändern der Größe des Heapspeichers ist nur eine vorübergehende Lösung für ein tieferes Problem, und das ist Ihre Speicherverwaltung. Wenn Sie die Bitmap selbst löschen wollen, dann versuchen Sie, 'onViewRecycled (View View)' zu überschreiben. Ich würde empfehlen, Glide oder Picasso in Kombination mit 'onViewRecycled (View view)' zu verwenden. – tricknology

+0

Ja, ich stimme zu, dass Picasso und Glide oder eine andere ähnliche Bibliothek immer toll ist, wenn viele Bilder beteiligt sind – user49557

Verwandte Themen