Exibir a activity de detalhes do item RecyclerView
E ae pessoal, gostaria de uma orientação sobre um erro que estou tomando e não consegui contornar corretamente, meu conhecimento com android é de basico autodidata.
Bom o cenário é eu ger uma lista vinda de uma api que traz dados do banco de dados , imagem, nome de cidade e descrição.
Quero que ao clicar seja aberta uma activity onde a mesma exiba os dados da cidade selecionada exibindo a imagem maior, nome cidade, descrição e data de saida do turismo.
Pois bem quando eu clico num item da lista tomo o erro:
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.content.ComponentName.<init>(ComponentName.java:77)
at android.content.Intent.<init>(Intent.java:4280)
at garagetalke.com.laftturismo.adaptador.GramadoAdapter$GramadoHolder.onClick(GramadoAdapter.java:97)
Eu uso fragmento para gerar a lista no recyclerView e criei um activity DetalhesLugares com o seu xml certinho para exibir os dados da cidade que eu cliquei, o meu fragmento que gera a lista de itens esta abaixo:
***fragment_lista_lugares_gramado.java***
public class fragment_lista_lugares_gramado extends Fragment implements Response.Listener<JSONObject>, Response.ErrorListener{
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
RecyclerView recyclerAnuncio;
ArrayList<Lugares> listaLugares;
ProgressDialog progresso;
RequestQueue request;
JsonObjectRequest jsonObjectReq;
private fragment_lista_lugares_gramado.OnFragmentInteractionListener mListener;
public fragment_lista_lugares_gramado() {
// Required empty public constructor
}
public static fragment_lista_lugares_gramado newInstance(String param1, String param2) {
fragment_lista_lugares_gramado fragment = new fragment_lista_lugares_gramado();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View vista = inflater.inflate(R.layout.places_recycler_list, container, false);
listaLugares=new ArrayList<>();
recyclerAnuncio= (RecyclerView) vista.findViewById(R.id.listRecycler);
recyclerAnuncio.setLayoutManager(new LinearLayoutManager(this.getContext()));
recyclerAnuncio.setHasFixedSize(true);
request= Volley.newRequestQueue(getContext());
carregarWEBService(); //aqui chamo minha API que me traz os dados do banco corretamente e exibe no App
return vista;
}
private void carregarWEBService() {
....minha API que faz a busca
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
@Override
public void onErrorResponse(VolleyError error) {
progresso.hide();
Toast.makeText(getContext(), "Não foi possível listar os lugares " +error.toString() , Toast.LENGTH_SHORT).show();
Log.i("ERROR", error.toString());
}
@Override
public void onResponse(JSONObject response) {
progresso.hide();
Lugares lugares = null;
Retorno do meu json da API - OK
try {
for(int i=0; i<json.length();i++){
lugares = new Lugares();
JSONObject jsonObject = null;
jsonObject = json.getJSONObject(i);
lugares.setId(jsonObject.optString("id"));
//seto todos os dados de retorno - OK
listaLugares.add(lugares);
}
progresso.hide();
GramadoAdapter adapter = new GramadoAdapter(listaLugares, fragment_lista_lugares_gramado.this);
recyclerAnuncio.setAdapter(adapter);
}catch (JSONException e){
e.printStackTrace();
progresso.hide();
Toast.makeText(getContext(), "Não foi possível listar os lugares " +response , Toast.LENGTH_SHORT).show();
}
}
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
Aqui esta meu Adapter : ***GramadoAdapter.java***
public class GramadoAdapter extends RecyclerView.Adapter<GramadoAdapter.GramadoHolder> {
ArrayList<Lugares> listaLugares = new ArrayList<>();
fragment_lista_lugares_gramado ctx;
Context fragment_lista_lugares_gramado;
public GramadoAdapter(ArrayList<Lugares> listaLugares, fragment_lista_lugares_gramado ctx ){
this.listaLugares = listaLugares;
this.ctx = ctx;
}
@NonNull
@Override
public GramadoHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_lugares,parent,false);
GramadoHolder gramadoViewHolder = new GramadoHolder(view, fragment_lista_lugares_gramado,listaLugares);
return gramadoViewHolder;
}
@Override
public void onBindViewHolder(@NonNull GramadoHolder holder, int position) {
Lugares LUG = listaLugares.get(position);
holder.id.setText(LUG.getId().toString());
holder.cidade.setText(LUG.getCidade());
holder.descricao.setText(LUG.getDescricao());
holder.dataSaida.setText("Quando? "+(LUG.getDataSaida()));
if(listaLugares.get(position).getImagem() != null){
holder.idImagem.setImageBitmap(LUG.getImagem());
}else{
holder.idImagem.setImageResource(R.drawable.publicacao_sem_foto);
}
}
@Override
public int getItemCount() { return listaLugares.size(); }
public class GramadoHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView id, cidade, descricao, dataSaida, lugaresOnibus, valor, rating;
ImageView idImagem;
ArrayList<Lugares> listaLugares = new ArrayList<Lugares>();
Context ctx;
Context fragment_lista_lugares_gramado;
public GramadoHolder(View view, Context fragment_lista_lugares_gramado, ArrayList<Lugares> listaLugares) {
super(view);
this.listaLugares = listaLugares;
view.setOnClickListener(this);
id = (TextView) view.findViewById(R.id.id_place);
cidade = (TextView) view.findViewById(R.id.cidade_place);
descricao = (TextView) view.findViewById(R.id.descricao_place);
dataSaida = (TextView) view.findViewById(R.id.datasaida_place);
idImagem = view.findViewById(R.id.place_image);
}
@Override
public void onClick(View v) {
int position = getAdapterPosition();
Lugares lugares = this.listaLugares.get(position);
//Eu acho que aqui esta meu problema mas nao sei o que pode ser...tipo nao abre a activity detalhes
//ja tentei getActivity(), getApplication() e outras coisas tb, como é o fragmento que gera a lista
//então nao o que fazer pra instanciar
Intent intent = new Intent(fragment_lista_lugares_gramado, DetalhesLugares.class);
intent.putExtra("tvImagem",lugares.getImagem());
intent.putExtra("tvCidade",lugares.getCidade());
intent.putExtra("tvdescricao",lugares.getDescricao());
this.fragment_lista_lugares_gramado.startActivity(intent);
}
}
}
**DetalhesActivity.java**
ImageView imageView;
TextView text_Cidade, text_Descricao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detalhes_lugares);
imageView = (ImageView) findViewById(R.id.tvImagem);
text_Cidade = (TextView) findViewById(R.id.tvCidade);
text_Descricao = (TextView) findViewById(R.id.tvDesricao);
imageView.setImageResource(getIntent().getIntExtra("tvImagem",00));
text_Cidade.setText("Cidade: "+getIntent().getStringExtra("tvCidade"));
text_Descricao.setText("Descrição: "+getIntent().getStringExtra("tvdescricao"));
}
Alguém sabe me orientar do que fazer pra conseguir?Discussão (0)
Carregando comentários...