2016-11-29 8 views
0

私はRecyclerViewを持っています。シンプルなTextViewとImageViewは少しアイコン(国の旗)です。各アイコンは2kbから10kbの間にあります。これは私にとってはかなり小さいようです。アイコンはすべてドロウアブルフォルダに保存されています。RecyclerViewジャーキー、小さなPNGアイコン付き、Android

ただし、スクロールすると非常に滑らかではありません。それはかゆくなる。

私はこのコードを持っている:

search = (EditText) findViewById(R.id.search); 
    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview); 
    mRecyclerView.setHasFixedSize(true); 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
    mRecyclerView.setNestedScrollingEnabled(false); 

、ここでは私のアダプタです:

public class CountryAdapter extends RecyclerView.Adapter<CountryViewHolder> { 

    private ArrayList<Country> countryArrayList; 
    private Context context; 

    public CountryAdapter(ArrayList<Country> countryArrayList, Context context) { 
     this.countryArrayList = countryArrayList; 
     this.context = context; 
    } 

    @Override 
    public CountryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.country_item, parent, false); 

     return new CountryViewHolder(itemView); 

    } 

    @Override 
    public void onBindViewHolder(CountryViewHolder holder, int position) { 


     final Country currentCountry = countryArrayList.get(position); 

     holder.countryItemLinearLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(context, currentCountry.getCountry().toString(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     holder.countryTextView.setText(currentCountry.getCountry()); 
     holder.countryFlagImageView.setImageResource(currentCountry.getFlag()); 


    } 

    @Override 
    public int getItemCount() { 
     return countryArrayList.size(); 
    } 
} 
+0

時間を費やしている場所を特定するために、メソッドトレースを使用します。 – CommonsWare

+0

「私にはかなり小さいようですが」バイトのサイズは無関係ですが、ピクセル(幅、高さ)のサイズは何ですか? – Budius

+0

450ピクセル×300ピクセルですが、イメージビューは30dpだけ30dpです。 – RJB

答えて

1

を私も前にこの問題を持っていました。これを修正する方法は、ビットマップをリソースから非同期的にロードし、読み込みが完了したらイメージに設定することです。基本的に私のシステムです。

public class LoadImage extends AsyncTask<Void, Void, Bitmap> { 

    private Context context; 

    private ImageView imageView; 
    private int imageResource; 

    public LoadImage(Context context, ImageView imageView, int imageResource) { 
     this.context = context; 
     this.imageView = imageView; 
     this.imageResource = imageResource; 
    } 

    @Override 
    protected Bitmap doInBackground(Void... params) { 
     return BitmapFactory.decodeResource(context.getResources(), imageResource); 
    } 

    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     super.onPostExecute(bitmap); 

     imageView.setImageBitmap(bitmap); 
    } 
} 

そして、あなたはこのようにそれを呼び出す:

new LoadImage(context, holder.countryFlagImageView, currentCountry.getFlag()).execute(); 

それはあなたのRecyclerViewを保持していないように、これは、別のスレッドへのビットマップのデコードを移動します。

このクラスをholderクラスに入れ、それを呼び出すときに変数に設定すると、タスクが終了する前にそのビューがリサイクルされると、プロセスをキャンセルできます。

Holderクラス

public class CountryViewHolder extends RecyclerView.ViewHolder { 

    public AsyncTask imageLoadTask; 

    public void setImage(Context context, ImageView imageView, int resource){ 
     imageLoadTask = new LoadImage(context, imageView, resource); 
     imageLoadTask.execute(); 
    } 

} 

上記
@Override 
public void onBindViewHolder(CountryViewHolder holder, int position) { 

    final Country currentCountry = countryArrayList.get(position); 

    holder.setImage(holder.countryFlagImageView.getContext(), holder.countryFlagImageView, currentCountry.getFlag()); 

} 

からそれを呼び出すと、あなたのアダプタでは、あなたがこのオーバーライドを追加します:

@Override 
public void onViewRecycled(FeedHolder holder) { 
    super.onViewRecycled(holder); 
    holder.imageLoadTask.cancel(true); 
} 

この本のように基本的な現在は画面上のビューのリソースをデコードするだけです。

希望すると助かります!

+0

ありがとうございます。よく働く。 – RJB

関連する問題