Olá, faz pouco tempo que começei a trabalhar com java e android e nunca postei uma dúvida antes, mas devido a necessidade e dificuldade em resolve-la resolvi postar
desculpas sérias se eu disser alguma bobagem, pois realmente sou leigo quando o assunto é java e android!!
tenho uma aplicação que faz a inserção, alteração e exclusão de um dado chamado FASE, utilizo sqlite como bd, eis o problema, ao listá-las, começei utilizando o ArrayAdapter<FASE>, listando todas as minhas fases com o xml padrão do android(android.R.layout.simple_list_item_1) e a partir da mesma utilizei o método onItemClickListener da listView para alterar a fase respectiva, carregando outro xml com o SetContentView, mas como desejo um botão de exclusão por indice na listView, customizei o adapter da mesma com um xml próprio,o mesmo contém 3 textviews e 1 imagebutton, porém ao defini-lo, meu evento onItemClickListener parou de funcionar, ao pesquisar, descobri que o imagebutton tira o foco da minha view impossibilitando de reconhecer o evento onclick, segue abaixo o código para a listagem simples:
principal.java
ArrayAdapter<Fase> adapter = new ArrayAdapter<Fase>(cxt, android.R.layout.simple_list_item_1, dbHelper.getArrayTodasFases());
//DEFINE ADAPTER PARA EXIBIR LISTVIEW
lstFase.setAdapter(adapter);
lstFase.setItemsCanFocus(true);
lstFase.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Fase fase = (Fase) parent.getItemAtPosition(position);
int indice = fase.getID();
//Toast.makeText(cxt, indice+"", Toast.LENGTH_SHORT).show();
carregaCadastro(indice);
//CarregaCadastro();
}
});
enfim criei a listagem da minha listView customizada, e criei uma classe FaseAdapter que herda a classe BaseAdapter, a solução que encontrei em um fórum norte-americano, foi editar os eventos diretamente no método getView da minha classe FaseAdapter, eis o grande problema, ao migrar do onItemClickListener que estava na minha classe principal.java para manipular a view diretamente no onClickListener dentro da minha classe FaseAdapter, não consigo mais chamar o método da minha activity principal.java onde chamo o método carregaCadastro()!! não consigo achá-la, não do jeito certo pelo menos, resumidamente, não consigo executar um método da minha activity Principal.java, dentro da minha classe FaseAdapter, mais especificamente dentro dos eventos onClick de seus botões, segue o código:
principal.java(trecho da minha activity onde defino o adapter)
FaseAdapter adapter = new FaseAdapter(cxt, dbHelper.getArrayTodasFases());
//DEFINE ADAPTER PARA EXIBIR LISTVIEW
lstFase.setAdapter(adapter);
lstFase.setItemsCanFocus(true);
lista_fase.xml(xml onde customizo a listView)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+lstFase/mainLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<TextView
android:id="@+lstFase/lblID"
android:layout_width="50px"
android:layout_height="wrap_content"
android:gravity="center"
>
</TextView>
<TextView
android:id="@+lstFase/lblBarra"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="|"
>
</TextView>
<TextView
android:id="@+lstFase/lblNome"
android:layout_width="165px"
android:layout_height="fill_parent"
android:gravity="center"
>
</TextView>
<ImageButton
android:id="@+lstFase/btDeletar"
android:layout_width="20px"
android:layout_height="20px"
android:src="@drawable/cancelar"
>
</ImageButton>
</LinearLayout>
FaseAdapter.java
public class FaseAdapter extends BaseAdapter{
private List<Fase> listaFase;
private Context cxt;
public FaseAdapter(Context cxt, List<Fase> listaFase) {
this.listaFase = listaFase;
this.cxt = cxt;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listaFase.size();
}
@Override
public Object getItem(int position) {
Fase fase = listaFase.get(position);
return fase;
}
@Override
public long getItemId(int position) {
Fase fase = listaFase.get(position);
return fase.getCodigo();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//INSTANCIA RESPECTIVA FASE
final Fase fase = listaFase.get(position);
//CRIA INSTANCIA XML PARA OBJETOS NA VIEW
View view;
if (convertView != null) {
view = convertView;
}
else {
LayoutInflater inflater = (LayoutInflater) cxt.getSystemService(cxt.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.lista_fase, null);
}
view.setClickable(true);
view.setFocusable(true);
//Layout listagem
//instancia objetos xml
TextView lblID = (TextView) view.findViewById(R.lstFase.lblID);
TextView lblNome = (TextView) view.findViewById(R.lstFase.lblNome);
ImageButton btDeletar = (ImageButton) view.findViewById(R.lstFase.btDeletar);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//CARREGA REGISTRO DE ACORDO COM O ITEM SELECIONADO
int indice = fase.getID();
//new Inicio().carregaCadastro(indice); FAIL - FORCE CLOSE
//Inicio in = new Inicio().carregaCadastro(indice); - FAIL - FORCE CLOSE
//in.carregaCadastro(indice); - FAIL - FORCE CLOSE
carregaCadastro(indice);//MÉTODO NÃO ENCONTRADO
}
});
btDeletar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog alertDialog = new AlertDialog.Builder(cxt).create();
alertDialog.setTitle("Deseja realmente excluir?");
alertDialog.setIcon(R.drawable.icon);
alertDialog.setMessage("Ao clicar em 'sim' a fase "+fase.getNome()+" será excluído permanentemente!");
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
FaseDAO dbHelper = new FaseDAO(cxt);
dbHelper.deletaFase(fase);
dbHelper.close();
Toast.makeText(cxt, "A fase '"+fase.getNome()+"' foi excluída!", Toast.LENGTH_SHORT).show();
carregaCadastro(indice);//MÉTODO NÃO ENCONTRADO
}
});
alertDialog.setButton2("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
return;
}
});
alertDialog.show();
}
});
//aplica efeitos nos objetos do xml correspondente
lblID.setText(String.valueOf(fase.getCodigo()));
lblNome.setText(fase.getNome());
return view;
}
}
Grato pela atenção e desculpe se falei alguma bobagem
Atenciosamente
