I want to display card view but it doesnot display it shows fatal exception can any one solve this error with your programming skills.please see all layouts and classes?
public class MainActivity extends AppCompatActivity {
List<Person> persons;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView rv = (RecyclerView)findViewById(R.id.recycle);
rv.setHasFixedSize(true);
initializeData();
LinearLayoutManager ll = new LinearLayoutManager(this);
rv.setLayoutManager(ll);
RvAdapter rvAdapter = new RvAdapter(persons);
rv.setAdapter(rvAdapter);
}
private void initializeData() {
persons = new ArrayList<>();
persons.add(new Person("Anilkumar","23 years",R.drawable.anil));
persons.add(new Person("Prashanthi","21 years",R.drawable.inr));
}
}
Person class
public class Person
{
String name;
String age;
int photoId;
Person(String name,String age,int photoId)
{
this.name = name;
this.age = age;
this.photoId = photoId;
}
}
RVadapter class
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.PersonViewHolder>
{
private List<Person> persons;
RvAdapter(List<Person> persons)
{
this.persons = persons;
}
@Override
public PersonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardlayout,parent,false);
PersonViewHolder pvh = new PersonViewHolder(v);
return pvh;
}
@Override
public void onBindViewHolder(PersonViewHolder holder, int position) {
holder.personName.setText(persons.get(position).name);
holder.personName.setText(persons.get(position).age);
holder.personPhoto.setImageResource(persons.get(position).photoId);
}
@Override
public int getItemCount() {
return persons.size();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
public static class PersonViewHolder extends RecyclerView.ViewHolder
{
CardView cardView;
TextView personName;
TextView personAge;
ImageView personPhoto;
public PersonViewHolder(View itemView) {
super(itemView);
cardView = (CardView)itemView.findViewById(R.id.card);
personName = (TextView)itemView.findViewById(R.id.text);
personAge = (TextView)itemView.findViewById(R.id.text2);
personPhoto = (ImageView)itemView.findViewById(R.id.image);
}
}
}
Logcat error
06-20 22:51:57.126 5433-5433/com.example.anilkumar.recyclerview E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:483)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
at android.content.res.Resources.loadDrawable(Resources.java:1940)
at android.content.res.Resources.getDrawable(Resources.java:664)
at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:368)
at android.support.v7.internal.widget.TintManager.getDrawable(TintManager.java:177)
at android.support.v7.internal.widget.TintManager.getDrawable(TintManager.java:170)
at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:53)
at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:74)
at com.example.anilkumar.recyclerview.RvAdapter.onBindViewHolder(RvAdapter.java:49)
at com.example.anilkumar.recyclerview.RvAdapter.onBindViewHolder(RvAdapter.java:16)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5746)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5779)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5016)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4892)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2029)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1414)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1377)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:578)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3239)
at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2767)
at android.view.View.measure(View.java:12723)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:594)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:376)
at android.view.View.measure(View.java:12723)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
at android.view.View.measure(View.java:12723)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
You have big images you mentioned it, you must take care of memory issues when you handling too big sized images. You can use Picasso or Universal Image Loader or Glide
Theese libraries will load your images asynchronously , and you dont get any Memory issues.
One of my biggest image size till today is like (4560x5250)
and i didnt get any memory issues , but if you want smooth scroll you can decrease image size in Picasso
.
Currently im using Picasso
in my RecyclerView
.I can give example of Picasso
like :
In your onBindViewHolder
:
@Override
public void onBindViewHolder(PersonViewHolder holder, int position) {
holder.personName.setText(persons.get(position).name);
holder.personAge.setText(persons.get(position).age);
Picasso.with(context).load(persons.get(position).photoId).into(holder.personPhoto);
}
Also you can find comparison about theese libraries : picasso-vs-imageloader-vs-fresco-vs-glide
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.