简体   繁体   中英

Issues in Recycler view and Card View

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)

card layout recycle layout

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM