Bluecups Solution
Bluecups Solution

Reputation: 31

OnClick action gives error in recycler grid layout

This is My MainActivity Code.In this we get error in setOnItemClickListener as null pointer exception and it stops my app.give me some suggestions where am i wrong. I am trying to achieve custom grid with image on top and title next to it.

public class MainActivity extends AppCompatActivity  {

//RecyclerView recyclerView;
private static final String TAG = "MainActivity";

    private final String android_version_names[] = {
            "Donut",
            "Eclair",
            "Froyo",
            "Gingerbread",
            "Honeycomb",
            "Ice Cream Sandwich",
            "Jelly Bean",
            "KitKat",
            "Lollipop",
            "Marshmallow"
    };

    private final String android_image_urls[] = {
            "https://api.learn2crack.com/android/images/donut.png",
            "https://api.learn2crack.com/android/images/eclair.png",
            "https://api.learn2crack.com/android/images/froyo.png",
            "https://api.learn2crack.com/android/images/ginger.png",
            "https://api.learn2crack.com/android/images/honey.png",
            "https://api.learn2crack.com/android/images/icecream.png",
            "https://api.learn2crack.com/android/images/jellybean.png",
            "https://api.learn2crack.com/android/images/kitkat.png",
            "https://api.learn2crack.com/android/images/lollipop.png",
            "https://api.learn2crack.com/android/images/marshmallow.png"
    };

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


    initViews();


}

private void initViews(){
    RecyclerView recyclerView = (RecyclerView)findViewById(R.id.card_recycler_view);
    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(),2);
    recyclerView.setLayoutManager(layoutManager);

    ArrayList<AndroidVersion> androidVersions = prepareData();
    DataAdapter adapter = new DataAdapter(getApplicationContext(),androidVersions);
    recyclerView.setAdapter(adapter);

    DataAdapter mAdapter = null ;

    mAdapter.setOnItemClickListener(new DataAdapter.ClickListener() {
        @Override
        public void onItemClick(int position, View v) {

            Log.d(TAG, "onItemClick position: " + position);
        }

    });


}
private ArrayList<AndroidVersion> prepareData(){

    ArrayList<AndroidVersion> android_version = new ArrayList<>();
    for(int i=0;i<android_version_names.length;i++){
    AndroidVersion androidVersion = new AndroidVersion();
    androidVersion.setAndroid_version_name(android_version_names[i]);
    androidVersion.setAndroid_image_url(android_image_urls[i]);
    android_version.add(androidVersion);
    }
    return android_version;
    }

    }

This Is My Adapter Code.

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
private ArrayList<AndroidVersion> android;
private Context context;
private static ClickListener clickListener;

public DataAdapter(Context context,ArrayList<AndroidVersion> android) {
    this.android = android;
    this.context = context;
}

@Override
public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_layout, viewGroup, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(DataAdapter.ViewHolder viewHolder, int i) {

    viewHolder.tv_android.setText(android.get(i).getAndroid_version_name());
    Picasso.with(context).load(android.get(i).getAndroid_image_url()).resize(240, 120).into(viewHolder.img_android);
}

@Override
public int getItemCount() {
    return android.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    private TextView tv_android;
    private ImageView img_android;
    public ViewHolder(View view) {
        super(view);
        view.setOnClickListener(this);




        tv_android = (TextView)view.findViewById(R.id.tv_android);
        img_android = (ImageView) view.findViewById(R.id.img_android);
    }
    @Override
    public void onClick(View v) {
        clickListener.onItemClick(getAdapterPosition(), v);
    }
}
public void setOnItemClickListener(ClickListener clickListener) {
    DataAdapter.clickListener = clickListener;
}

public interface ClickListener {
    void onItemClick(int position, View v);

}

}

Upvotes: 0

Views: 168

Answers (2)

Darshan Gowda
Darshan Gowda

Reputation: 5216

Try this

DataAdapter adapter = new DataAdapter(getApplicationContext(),androidVersions);
recyclerView.setAdapter(adapter);


adapter.setOnItemClickListener(new DataAdapter.ClickListener() {
    @Override
    public void onItemClick(int position, View v) {

        Log.d(TAG, "onItemClick position: " + position);
    }

});

Upvotes: 0

Ravi
Ravi

Reputation: 35539

you are setting mAdapter = null before setting setOnItemClickListener, remove it

DataAdapter mAdapter = null ; //remove this line

adapter.setOnItemClickListener(new DataAdapter.ClickListener() {
    @Override
    public void onItemClick(int position, View v) {

        Log.d(TAG, "onItemClick position: " + position);
    }

});

you are calling wrong adapter, your actual variable is adapter and you are calling it with mAdapter, that also by setting its value to ull

Upvotes: 1

Related Questions