David David - 13 days ago 7
Java Question

Logcat Error Constructor DataAdapter in class DataAdapter canot be appied

Logcat:

required:Context, ArrayList<AndroidVersion>
found: ArrayList<AndroidVersion>
reason:actual and formal argument lists differ in length


ArrayList in my DataAdapter cannot be applied to my array list in Android Version

I believe this is about context, but I am unclear what line needs to be amended.

MainActivity.java where the word 'data' is throwing the error.

package davidfoale.info.relativelayout_json;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;

import android.util.Log;
import java.util.Arrays;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends AppCompatActivity {

private final String android_image_urls[] = {
"http://davidfoale.info/images/app_images/vetsurgeon.jpg",
"http://davidfoale.info/images/app_images/hairdresser.jpg",
"http://davidfoale.info/images/app_images/vetsurgeon.jpg",
"http://davidfoale.info/images/app_images/hairdresser.jpg",
"http://davidfoale.info/images/app_images/vetsurgeon.jpg",
"http://davidfoale.info/images/app_images/hairdresser.jpg",
"http://davidfoale.info/images/app_images/vetsurgeon.jpg",
"http://davidfoale.info/images/app_images/hairdresser.jpg",
"http://davidfoale.info/images/app_images/vetsurgeon.jpg",
"http://davidfoale.info/images/app_images/hairdresser.jpg",

};

private RecyclerView recyclerView;
private ArrayList<AndroidVersion> data;
private DataAdapter adapter;


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

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}


private void initViews() {
recyclerView = (RecyclerView) findViewById(R.id.card_recycler_view);
recyclerView.setHasFixedSize(true);

RecyclerView.LayoutManager layoutManager
= new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);

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

loadJSON();
}

private void loadJSON(){
Retrofit retrofit = new Retrofit.Builder()

.baseUrl("http://davidfoale.info/")
.addConverterFactory(GsonConverterFactory.create())
.build();

RequestInterface request = retrofit.create(RequestInterface.class);

Call<JSONResponse> call = request.getJSON();
call.enqueue(new Callback<JSONResponse>() {

@Override
public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) {

JSONResponse jsonResponse = response.body();
data = new ArrayList<>(Arrays.asList(jsonResponse.getAndroid()));
adapter = new DataAdapter(data);
recyclerView.setAdapter(adapter);
}

@Override
public void onFailure(Call<JSONResponse> call, Throwable t) {
Log.d("Error",t.getMessage());
}
});
}

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


DataAdapter.java

package davidfoale.info.relativelayout_json;

import android.content.Context;
import android.support.v4.view.ScrollingView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.content.Intent;

import android.widget.TextView;

import com.squareup.picasso.Picasso;
import java.util.ArrayList;




public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
private ArrayList<AndroidVersion> android_versions, android;
private Context context;

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




@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) {
Picasso.with(context).load(android_versions.get(i).getAndroid_image_url()).resize(61, 65).into
(viewHolder.img_android);

// added from MySQL-Retrofit NOT Picasso
viewHolder.job_desc.setText(android.get(i).getDesc());
// end of added
viewHolder.img_android.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View view) {
// Intent intent = new Intent(DataAdapter.this, GetDetails.class);
Intent intent = new Intent (context, SecondActivity.class);
// in.putExtra("USE_A_CONSTANT_HERE_AS_KEY", ?);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
}




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




public class ViewHolder extends RecyclerView.ViewHolder{
private TextView job_desc;
ImageView img_android;
public ViewHolder(View view) {
super(view);
img_android = (ImageView)view.findViewById(R.id.img_android);
job_desc = (TextView)view.findViewById(R.id.job_desc);
}
}
}


AndroidVersion.java

package davidfoale.info.relativelayout_json;

public class AndroidVersion {

private String android_image_url;

public String getAndroid_image_url() {
return android_image_url;
}
public void setAndroid_image_url(String android_image_url) {
this.android_image_url = android_image_url;
}

// added in to get desc data
private String job_desc;

public String getDesc() {
return job_desc;
}
// end
}

Answer

Your DataAdapter class does NOT have the constructor to create the object like new DataAdapter(data);, so inside onResponse() method you need to change from adapter = new DataAdapter(data); to adapter = new DataAdapter(getApplicationContext(), data); or else provide a constructor in your DataAdapter class.