Failed with recyclerView instead of ListView?

0

The following code with ListView instead of RecyclerView let me compile and run but if I was not on a fault line:

recyclerview.setAdapter(new ImagenAdapter(getApplicationContext()));

and he tells me that:

  

setAdapter
  (android.support.v7.widget.RecyclerView.Adapter)
  in RecyclerView can not be applied

I've just changed where I put ListView - > RecyclerView changing the corresponding layout but nothing, I get that error and I can not solve it.

public class MainActivity extends AppCompatActivity {

private RecyclerView recyclerview;

ArrayList titulo = new ArrayList();
ArrayList descripcion = new ArrayList();
ArrayList imagen = new ArrayList();


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

    recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
    descargarImagen();
}

private void descargarImagen() {

    final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
    progressDialog.setMessage("Cargando Datos...");
    progressDialog.show();

    AsyncHttpClient client = new AsyncHttpClient();
    client.get("http://rudeboys.esy.es/valbit/query.php", new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            if (statusCode == 200) {
                progressDialog.dismiss();
                try {
                    JSONArray jsonArray = new JSONArray(new String(responseBody));
                    for (int i = 0; i < jsonArray.length(); i++) {
                        titulo.add(jsonArray.getJSONObject(i).getString("titulo"));
                        descripcion.add(jsonArray.getJSONObject(i).getString("descripcion"));
                        imagen.add(jsonArray.getJSONObject(i).getString("imagen"));
                    }

//////////En esta línea de bajo es EL FALLO/////////////
                    recyclerview.setAdapter(new ImagenAdapter(getApplicationContext()));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

        }
    });
}

private class ImagenAdapter extends BaseAdapter {

    Context ctx;
    LayoutInflater layoutInflater;
    SmartImageView smartImageView;
    TextView tvtitulo, tvdescripcion;

    public ImagenAdapter(Context applicationContext) {
        this.ctx = applicationContext;
        layoutInflater = (LayoutInflater) ctx.getSystemService(LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return imagen.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View converView, ViewGroup parent) {

        ViewGroup viewGroup = (ViewGroup) layoutInflater.inflate(R.layout.activity_main_item,null);

        smartImageView = (SmartImageView)viewGroup.findViewById(R.id.imagen1);
        tvtitulo = (TextView) viewGroup.findViewById(R.id.tvtitulo);
        tvdescripcion = (TextView) viewGroup.findViewById(R.id.tvDescripcion);

        String urlfinal ="http://rudeboys.esy.es/valbit/images/"+imagen.get(position).toString();
         Rect rect = new Rect(smartImageView.getLeft(), smartImageView.getTop(), smartImageView.getRight(), smartImageView.getBottom());

         smartImageView.setImageUrl(urlfinal,rect);

        return viewGroup;
    }

}
}
    
asked by Rf Mvs 04.03.2017 в 14:26
source

1 answer

1

The problem is in your ImagenAdapter . You are inheriting from BaseAdapter , and this worked for the ListView. When the RecyclerView was introduced, it changed to RecyclerView.Adapter<TestViewHolder> .

An example of an adapter for a RecyclerView would be adapted to your case:

private class ImagenAdapter extends RecyclerView.Adapter<ImagenAdapter.MyViewHolder> {

Context ctx;
ArrayList imagen = new ArrayList();

class MyViewHolder extends RecyclerView.ViewHolder {
    SmartImageView smartImageView;
    TextView tvtitulo, tvdescripcion;

    MyViewHolder(View view) {
        super(view);
        smartImageView = (SmartImageView)view.findViewById(R.id.imagen1);
        tvtitulo = (TextView) view.findViewById(R.id.tvtitulo);
        tvdescripcion = (TextView) view.findViewById(R.id.tvDescripcion);
    }
}

public ImagenAdapter(Context applicationContext) {
    this.ctx = applicationContext;
}

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

@Override
public ImagenAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.activity_main_item, parent, false);
    return new ImagenAdapter.MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(final ImagenAdapter.MyViewHolder holder, final int position) {

    String urlfinal ="http://rudeboys.esy.es/valbit/images/"+imagen.get(position).toString();
    Rect rect = new Rect(holder.smartImageView.getLeft(), holder.smartImageView.getTop(), holder.smartImageView.getRight(), holder.smartImageView.getBottom());
    holder.smartImageView.setImageUrl(urlfinal,rect);
}
}

Some of the changes were:

  • You declare a MyViewHolder to reuse views.

  • The recovery of view elements is done in the constructor of the MyViewHolder class.

  • In the onCreateViewHolder method is where you inflate the view for each position.

  • The onBindViewHolder method already has the loaded view and its function is to link the data of your list with the elements of the view according to the position.

This is a summary of the transition that was in ListView - > RecyclerView.

    
answered by 05.07.2017 в 22:31