-1

Here is the code from my app where i try to get venue list from the Foursquare API and display in a recyclerview

searchRetrofitAcitivity.java

public class searchRetrofitActivity extends AppCompatActivity {

    private static final String TAG = searchRetrofitActivity.class.getSimpleName();

    // TODO - insert your foursquare OAuth KEY here
    private final static String OAUTH_TOKEN = "L2GTUPPPWMEZ2HUT5D4HHYOOY5YNNNE1UVMJCZAOOFI2NNG3";
    private static final String LIMIT_VENUE_RESULT = "5";
    String latitudeLongitude = "40.7,-74";


    ArrayList<Venue> venues = new ArrayList<Venue>();
    String currentDate = searchRetrofitActivity.getCurrentDate();
    private RecyclerView recyclerView;


    public static String getCurrentDate() {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat mdformat = new SimpleDateFormat("yyyyMMdd");
        String formattedDate = mdformat.format(calendar.getTime());
        return formattedDate;
    }

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

        final VenuesAdapter vAdapter = new VenuesAdapter(venues, R.layout.list_venue, getApplicationContext());

        //method call to get data from api
        recyclerView = (RecyclerView) findViewById(R.id.venues_recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(vAdapter);


        ApiInterface apiService =
                FourSquareClient.getClient().create(ApiInterface.class);


        Call<VenueResponses> call = apiService.getExploredVenues(latitudeLongitude, OAUTH_TOKEN, currentDate);
        call.enqueue(new Callback<VenueResponses>() {
            @Override
            public void onResponse(Call<VenueResponses> call, Response<VenueResponses> response) {
                int statusCode = response.code();
                List<Item_> items;

                Venue tempVenue;
                items = response.body().getResponse().getGroups().get(0).getItems();


                for (int j = 0; j < items.size(); j++) {
                    tempVenue = new Venue();
                    tempVenue = items.get(j).getVenue();
                    venues.add(tempVenue);
                }
                recyclerView.setAdapter(new VenuesAdapter(venues, R.layout.list_venue, getApplicationContext()));
                Log.d(TAG, "No Of venues added " + venues.size());
            }

            @Override
            public void onFailure(Call<VenueResponses> call, Throwable t) {
                // Log error here since request failed
                Log.e(TAG, t.toString());
            }
        });
    }
}

VenuesAdapter.java

public class VenuesAdapter extends RecyclerView.Adapter<VenuesAdapter.VenueViewHolder> {

    private ArrayList<Venue> venues;
    private int rowLayout;
    private Context context;

    public VenuesAdapter(ArrayList<Venue> venues, int rowLayout, Context context) {
        this.venues = venues;
        this.rowLayout = rowLayout;
        this.context = context;
    }

    public static class VenueViewHolder extends RecyclerView.ViewHolder {
        LinearLayout venuesLayout;
        TextView venueName;
        TextView venueRating;
        TextView venueCategory;
        TextView venuePrice;
        TextView venueDistance;
        TextView venueAddress;

        public VenueViewHolder(View view) {
            super(view);
            venuesLayout = (LinearLayout) view.findViewById(R.id.venue_item);
            venueName = (TextView) view.findViewById(R.id.tv_venue_name);
            venueRating = (TextView) view.findViewById(R.id.tv_rating);
            venueCategory = (TextView) view.findViewById(R.id.tv_category);
            venuePrice = (TextView) view.findViewById(R.id.tv_price);
            venueDistance = (TextView) view.findViewById(R.id.tv_distance);
            venueAddress = (TextView) view.findViewById(R.id.tv_address);

        }
    }


    @Override
    public VenueViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(rowLayout,parent,false);
        return new VenueViewHolder(view);
    }

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

        holder.venueName.setText(venues.get(position).getName());
        // holder.venueRating.setText(venues.get(position).get);

    }

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

activity_search_retrofit.xml

<android.support.v7.widget.RecyclerView
    android:id="@+id/venues_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical" />

list_venue.xml

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="6dp">

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="113dp"
        android:layout_height="113dp" />

    <TextView
        android:id="@+id/venue_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@id/image_view"
        android:text="venue name"
        android:textColor="#1D1D26"
        android:textSize="16.88sp" />

    <TextView
        android:id="@+id/tv_rating"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/venue_name"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="30dp"
        android:layout_toRightOf="@id/image_view"
        android:padding="2dp"
        android:text="10.0"
        android:textSize="11.25dp"
        tools:background="#58FA58" />

    <TextView
        android:id="@+id/tv_category"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_rating"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="6dp"
        android:layout_toRightOf="@id/image_view"
        android:text="category"
        android:textColor="#000000"
        android:textSize="12.38sp" />

    <TextView
        android:id="@+id/tv_price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_rating"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="6dp"
        android:layout_toRightOf="@id/tv_category"
        android:text="price"
        android:textColor="#000000"
        android:textSize="12.38sp" />

    <TextView
        android:id="@+id/tv_distance"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_rating"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="6dp"
        android:layout_toRightOf="@id/tv_price"
        android:text="distance"
        android:textColor="#000000"
        android:textSize="12.38sp" />

    <TextView
        android:id="@+id/tv_address"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_category"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="6dp"
        android:layout_toRightOf="@id/image_view"
        android:textColor="#000000"
        android:textSize="12.38sp"
        tools:text="Enter the adress" />

    <Button
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_alignParentRight="true"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        tools:background="@drawable/close_icon_grey_hdpi" />
</RelativeLayout>

App gets crashed with following error

   05-20 12:31:55.213 2679-2679/com.example.android.foursquare_pammu 
    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.android.foursquare_pammu, PID: 2679
    java.lang.NullPointerException: Attempt to invoke virtual method 
    'void android.widget.TextView.setText(java.lang.CharSequence)' on a null  object reference
    at com.example.android.foursquare_pammu.adapter.VenuesAdapter.onBindViewHold
  er(VenuesAdapter.java:66)

2 Answers2

1

You should change

venueName = (TextView) view.findViewById(R.id.tv_venue_name);

to

venueName = (TextView) view.findViewById(R.id.venue_name);

Your TextView id is venue_name not tv_venue_name

M D
  • 47,665
  • 9
  • 93
  • 114
0

Venu View item don't have LinearLayout you have RelativeLayout change:

      venuesLayout = (LinearLayout) view.findViewById(R.id.venue_item);

To

    RelativeLayout venuesLayout;

       venuesLayout = (RelativeLayout) view.findViewById(R.id.venue_item);

inside View Holder class

add id to your item parent root layout in xml:

  <RelativeLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
       android:id="@+id/venue_item"
      android:layout_marginTop="6dp">
vivek mahajan
  • 521
  • 3
  • 16