Tecnologia do Blogger.
RSS

[androidbrasil-dev] Re: Custom Adapter e onClickListener abrindo objeto errado

Complementando a resposta do Lúcio: uma forma de resolver, seria vc passar o indice do item selecionado como um tag para a view que dispara o evento:


  holder.titulo.setTag(position)
....
public void onClick(View v) {
  int position = v.getTag();
  notificacao = notificacoes.get(position);
 .....


Em quinta-feira, 5 de dezembro de 2013 23h59min53s UTC-2, Douglas Cerqueira escreveu:
O que eu tenho, tenho um customadapter, e em alguns views tenho onclicks, por exemplo, no view da foto do usuario, tenho um onclick para abrir o perfil do usuario, no view da foto da postagem tenho um onclick para abrir a postagem.

Qual o problema?

Na listview, quando click em um view, os dados abertos são os do proximo item do listview.

O código pra terem uma ideia


import java.text.SimpleDateFormat;
import java.util.List;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.dice.R;
import com.niners.dice.model.Notificacao;
import com.niners.dice.util.VisualizarPerfilAsyncTask;

public class AdapterResumoNotificacao extends BaseAdapter {

private List<Notificacao> notificacoes;
private LayoutInflater mInflater;
private ViewHolder holder;
private Context mContext;
private Notificacao notificacao;

static class ViewHolder {
private TextView titulo;
private TextView status;
private TextView endereco;
private ImageView midias;
private TextView apoio;
private TextView comentario;
private TextView data;
private ImageView fotoUser;
private TextView nomeUser;
private LinearLayout perfil;
}

public AdapterResumoNotificacao(Context context,
List<Notificacao> notificacoes) {
this.mInflater = LayoutInflater.from(context);
this.notificacoes = notificacoes;
this.mContext = context;
}

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

@Override
public Notificacao getItem(int position) {
return notificacoes.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.adapter_notif, null);
holder = new ViewHolder();

holder.titulo = (TextView) convertView
.findViewById(R.id.resumoNotifTitulo);
holder.status = (TextView) convertView
.findViewById(R.id.resumoNotifStatus);
holder.endereco = (TextView) convertView
.findViewById(R.id.resumoNotifLocal);
holder.midias = (ImageView) convertView
.findViewById(R.id.resumoNotifImage);
holder.apoio = (TextView) convertView
.findViewById(R.id.resumoNotificacaoNumeroApoio);
holder.comentario = (TextView) convertView
.findViewById(R.id.resumoNotifNumeroComent);
holder.data = (TextView) convertView
.findViewById(R.id.resumoNotifHorario);
holder.fotoUser = (ImageView) convertView
.findViewById(R.id.resumoNotifImagerUser);
holder.nomeUser = (TextView) convertView
.findViewById(R.id.resumoNotifNomeUser);
holder.perfil = (LinearLayout) convertView
.findViewById(R.id.resumoNotifPerfilUser);

convertView.setTag(holder);

} else {
holder = (ViewHolder) convertView.getTag();
}

notificacao = notificacoes.get(position);
holder.titulo.setText(notificacao.getTitulo());
holder.status.setText(mContext.getString(R.string.notificacao_status)
+ ": " + notificacao.getStatus());
// holder.endereco.setText(n.endereco());
holder.apoio.setText(notificacao.getNumeroApoios() + " "
+ mContext.getString(R.string.notificacao_apoio));
holder.comentario.setText(notificacao.getNumeroComentarios() + " "
+ mContext.getString(R.string.notificacao_comentarios));
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
holder.data.setText(sdf.format(notificacao.getData()));
// holder.midias.setImageBitmap(n.midiaPrincipal());
// holder.fotoUser.setImageBitmap(n.getAutor().getFoto());
holder.nomeUser.setText(notificacao.getAutor().getNome().toUpperCase());

holder.titulo.setOnClickListener(abrirNotificacao);
holder.midias.setOnClickListener(abrirNotificacao);
holder.fotoUser.setOnClickListener(abrirPerfil);
holder.nomeUser.setOnClickListener(abrirPerfil);
holder.perfil.setOnClickListener(abrirPerfil);

return convertView;
}

private OnClickListener abrirPerfil = new OnClickListener() {

@Override
public void onClick(View v) {
new VisualizarPerfilAsyncTask(mContext)
+ notificacao.getAutor().getId());
}
};

private OnClickListener abrirNotificacao = new OnClickListener() {

@Override
public void onClick(View v) {
Intent it = new Intent(mContext, NotificacaoEscolhida.class);
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
it.putExtra("notificacao", notificacao);
mContext.startActivity(it);
}
};
}




Aqui é adicionado o evento click ao titulo
holder.titulo.setOnClickListener(abrirNotificacao);


E o evento implementado

Sempre que clico em um titulo abre o objeto errado :/

private OnClickListener abrirNotificacao = new OnClickListener() {


 
@Override
 
public void onClick(View v) {
 
Intent it = new Intent(mContext, NotificacaoEscolhida.class);
 it
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 it
.putExtra("notificacao", notificacao);
 mContext
.startActivity(it);
 
}
 
};


Já tentei muita coisa pra resolver isso e nada, alguma ideia?

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

0 comentários:

Postar um comentário