This is my Product.java
import android.os.Parcel;
import android.os.Parcelable;
public class Product implements Parcelable {
private String name;
private String detail;
private String price;
private int photo;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public int getPhoto() {
return photo;
}
public void setPhoto(int photo) {
this.photo = photo;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
dest.writeString(this.detail);
dest.writeString(this.price);
dest.writeInt(this.photo);
}
public Product() {
}
protected Product(Parcel in) {
this.name = in.readString();
this.detail = in.readString();
this.photo = in.readInt();
this.price = in.readString();
}
public static final Parcelable.Creator<Product> CREATOR = new Parcelable.Creator<Product>() {
@Override
public Product createFromParcel(Parcel source) {
return new Product(source);
}
@Override
public Product[] newArray(int size) {
return new Product[size];
}
};
}
this is my adapter product
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import java.util.ArrayList;
public class productAdapter extends RecyclerView.Adapter<productAdapter.productViewHolder> {
private ArrayList<Product> listProduct;
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
private Context context;
public productAdapter(ArrayList<Product> listProduct) {
this.listProduct = listProduct;
}
@NonNull
@Override
public productViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_product, viewGroup, false);
return new productViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final productViewHolder holder, int position) {
final Product pd = listProduct.get(position);
Glide.with(holder.itemView.getContext())
.load(pd.getPhoto())
.override(400, 800)
.fitCenter()
.into(holder.imgPhoto);
holder.tvName.setText(pd.getName());
holder.tvPrice.setText(pd.getPrice());
holder.tvDetail.setText(pd.getDetail());
holder.btnDetail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(holder.itemView.getContext(), "Open details of " + listProduct.get(holder.getAdapterPosition()).getName(), Toast.LENGTH_SHORT).show();
Intent moveIntent = new Intent(v.getContext(), DetailActivity.class);
moveIntent.putExtra("img_item_photo",pd.getPhoto());
moveIntent.putExtra("tv_item_name",pd.getName());
moveIntent.putExtra("tv_Price",pd.getPrice());
moveIntent.putExtra("tv_item_detail",pd.getDetail());
v.getContext().startActivity(moveIntent);
}
});
holder.btnBuy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
@Override
public int getItemCount() {
return listProduct.size();
}
public class productViewHolder extends RecyclerView.ViewHolder {
ImageView imgPhoto;
TextView tvName, tvDetail,tvPrice;
Button btnDetail, btnBuy;
public productViewHolder(@NonNull View itemView) {
super(itemView);
imgPhoto = itemView.findViewById(R.id.img_item_photo);
tvName = itemView.findViewById(R.id.tv_item_name);
tvPrice = itemView.findViewById(R.id.tv_Price);
tvDetail = itemView.findViewById(R.id.tv_item_detail);
btnDetail = itemView.findViewById(R.id.btn_details);
btnBuy = itemView.findViewById(R.id.btn_buy);
}
}
}
this is my detailView
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/img_item_photo"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:adjustViewBounds="true"
android:scaleType="fitXY"
android:src="@drawable/shoes_03" />
<TextView
android:id="@+id/tv_item_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="8dp"
android:layout_toEndOf="@+id/img_item_photo"
android:layout_toRightOf="@+id/img_item_photo"
android:textSize="25sp"
android:textStyle="bold"
tools:text="@string/product_name" />
<TextView
android:id="@+id/tv_Price"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="8dp"
android:layout_toEndOf="@+id/img_item_photo"
android:layout_toRightOf="@+id/img_item_photo"
android:textSize="20sp"
android:textStyle="bold"
tools:text="@string/product_price" />
<TextView
android:id="@+id/tv_item_detail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="8dp"
android:layout_toEndOf="@+id/img_item_photo"
android:layout_toRightOf="@+id/img_item_photo"
android:textSize="16sp"
android:textStyle="bold"
tools:text="@string/detail" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp">
</RelativeLayout>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:id="@+id/btn_buy" />
</LinearLayout>
</ScrollView>
and this is my detailActivity
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
public class DetailActivity extends AppCompatActivity {
ImageView imgPhoto;
TextView tvName, tvDetail,tvPrice;
String productName,productDetail,productPrice;
int imgproduct;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
imgPhoto = findViewById(R.id.img_item_photo);
tvName = findViewById(R.id.tv_item_name);
tvPrice = findViewById(R.id.tv_Price);
tvDetail = findViewById(R.id.tv_item_detail);
imgproduct = getIntent().getIntExtra("img_item_photo",0);
productName = getIntent().getStringExtra("tv_item_name");
productPrice = getIntent().getStringExtra("tv_Price");
productDetail = getIntent().getStringExtra("tv_item_detail");
imgPhoto.setImageResource(imgproduct);
tvName.setText(productName);
tvPrice.setText(productPrice);
tvDetail.setText(productDetail);
}
}
what should I do to handle my problem, do you have some advice? Here my LogCat Details:
2019-09-05 13:07:34.727 16657-16657/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.submission_dicoding, PID: 16657 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference at com.example.submission_dicoding.productAdapter.onBindViewHolder(productAdapter.java:58) at com.example.submission_dicoding.productAdapter.onBindViewHolder(productAdapter.java:21) at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781) at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823) at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752) at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854) at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230) at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557) at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517) at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612) at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924) at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641) at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4194) at android.view.View.layout(View.java:19599) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080) at android.view.View.layout(View.java:19599) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) at android.widget.FrameLayout.onLayout(FrameLayout.java:261) at android.view.View.layout(View.java:19599) at android.view.ViewGroup.layout(ViewGroup.java:6053) at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:444) at android.view.View.layout(View.java:19599) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) at android.widget.FrameLayout.onLayout(FrameLayout.java:261) at android.view.View.layout(View.java:19599) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635) at android.widget.LinearLayout.onLayout(LinearLayout.java:1544) at android.view.View.layout(View.java:19599) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) at android.widget.FrameLayout.onLayout(FrameLayout.java:261) at com.android.internal.policy.DecorView.onLayout(DecorView.java:767) at android.view.View.layout(View.java:19599) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2488) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2204) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1390) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6754) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966) at android.view.Choreographer.doCallbacks(Choreographer.java:778) at android.view.Choreographer.doFrame(Choreographer.java:713) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:251) at android.app.ActivityThread.main(ActivityThread.java:6572) 2019-09-05 13:07:34.727 16657-16657/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)