setOnItemClickListener不使用自定义布局的ListViewAdapter

时间:2015-07-13 23:06:39

标签: android

我有onItemClickListener事件的问题,它没有做任何事情,我花了3个晚上试图解决问题而我什么都没有,我希望有人可以帮助我。

我需要控制列表视图中每一行的位置,例如更改TextView的值或更改所需位置上RadioButton的已检查状态,例如NameOfRadioButon(atPosition).setChecked(true)TxtArticulo(atPosition).setText("it works")

代码如下:

Activity.java:

package com.example.ernesto.mitienditapuntodeventa;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


public class CatArticulosActivity extends ActionBarActivity {
    //Declaracion de Objetos
    //Declare
    Button BtnAgregar,BtnEditar,BtnEliminar;
    ImageView IvWipe;
    ListViewAdapter_CatArticulos adapterCatArticulos;
    EditText TxtFiltro;
    String[] nomArticulo;
    String[] unidad;
    String[] precio;
    Integer[] idArticulo;

    public static EditText HayCambio;
    public String cadenaSQL,conteoSQL;


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

        //Creacion de tabla
        //Creatin Table
        SQLiteDatabase db=getApplicationContext().openOrCreateDatabase("DB", Context.MODE_PRIVATE,null);
        db.execSQL("Create Table if not exists Articulos(ID int,Articulo Varchar,Unidad Varchar," +
                "Precio Double,Existencia Double,ExisMax Double,ExisMin Double);");

        //Enlace con el Layout
        //Link with the Layout
        BtnAgregar=(Button)findViewById(R.id.btnAgregar);
        BtnEditar=(Button)findViewById(R.id.btnEditar);
        BtnEliminar=(Button)findViewById(R.id.btnEliminar);
        IvWipe=(ImageView)findViewById(R.id.ivWipe);
        TxtFiltro=(EditText)findViewById(R.id.txtFiltrar);
        HayCambio=(EditText)findViewById(R.id.txtHayCambio);
        HayCambio.setEnabled(false);
        HayCambio.setVisibility(View.INVISIBLE);

        //Boton agregar
        //Add Button
        BtnAgregar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                edit_articulo_Dialogo dialogFragment = new edit_articulo_Dialogo();
                dialogFragment.show(getFragmentManager(), "");
            }
        });

        //Boton agregar
        //Edit Button
        BtnEditar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //TODO Abrir Dialogo para abrir el seleccionado
                //TODO Refrescar Lista
            }
        });

        //Boton eliminar
        //Delete Button
        BtnEliminar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //TODO Eliminar el seleccionado
                //TODO Refrescar lista
            }
        });

        //Lo que se escribe en el EditText muestra coincidencias en el ListView
        //Text in the EditText refresh the ListView content with the filter
        TxtFiltro.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
            @Override
            public void afterTextChanged(Editable editable) {
                inicializaAdaptador();
            }
        });

        //Detecta cuando hay un cambio en el EditText y refresca el contenido del ListView
        //Detecs changes in table and refresh ListView content
        HayCambio.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
            @Override
            public void afterTextChanged(Editable editable) {
                inicializaAdaptador();
            }
        });

        //Reinicia el filtro
        //Reset the filter
        IvWipe.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TxtFiltro.setText("");
                inicializaAdaptador();
            }
        });

        //Primer llenado del ListView en el onCreate
        //First load to ListView on onCreate
        inicializaAdaptador();
    }

    //Esta clase asigna los valores al adapter
    //This class send the values to the adapter
    public void inicializaAdaptador(){

        if (TxtFiltro.getText().toString().equals("")){
            conteoSQL="Select Count(*) From Articulos;";
            cadenaSQL="Select Articulo,Unidad,Precio,ID from Articulos Order By Articulo;";
        }else {
            conteoSQL="Select Count(*) From Articulos Where Articulo like '%"+
                    TxtFiltro.getText().toString()+"%';";
            cadenaSQL="Select Articulo,Unidad,Precio,ID from Articulos Where Articulo like '%"+
                    TxtFiltro.getText().toString()+"%' Order By Articulo;";
        }

        SQLiteDatabase db=getApplicationContext().openOrCreateDatabase("DB", Context.MODE_PRIVATE,null);
        int NumeroRegistros=0,Pila=0;

        Cursor cVerificaNumeroRegistro=db.rawQuery(conteoSQL,null);
        if (cVerificaNumeroRegistro.moveToFirst()){
            NumeroRegistros=cVerificaNumeroRegistro.getInt(0);
        }else {NumeroRegistros=0;}
        cVerificaNumeroRegistro.close();

        if (NumeroRegistros>=1){
            nomArticulo=new String[NumeroRegistros];
            unidad=new String[NumeroRegistros];
            precio=new String[NumeroRegistros];
            idArticulo=new Integer[NumeroRegistros];

            Cursor cAgregaValPilas = db.rawQuery(cadenaSQL,null);
            if (cAgregaValPilas.moveToFirst()){
                do {
                    nomArticulo[Pila]=cAgregaValPilas.getString(0);
                    unidad[Pila]=cAgregaValPilas.getString(1);
                    precio[Pila]=String.valueOf(cAgregaValPilas.getDouble(2));
                    idArticulo[Pila]=cAgregaValPilas.getInt(3);
                    Pila+=1;
                }while (cAgregaValPilas.moveToNext());
            }
            cAgregaValPilas.close();

            final ListView listaArticulos=(ListView)findViewById(R.id.lvArticulos);
            adapterCatArticulos=new ListViewAdapter_CatArticulos(this,nomArticulo,unidad,precio,idArticulo);
            listaArticulos.setAdapter(adapterCatArticulos);

            listaArticulos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    final TextView txt =(TextView) view.findViewById(R.id.txtArticulo);
                    Tostadora(txt.getText().toString());
                }
            });
        }else {
            if (TxtFiltro.getText().toString().equals("")){
                Tostadora("No hay registros para presentar");
            }else {
                Tostadora("La busqueda no permite filtar mas registros");
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_cat_articulos, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void Tostadora(String mensaje){
        Toast.makeText(getApplicationContext(),mensaje,Toast.LENGTH_SHORT).show();
    }
}

Layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.example.ernesto.mitienditapuntodeventa.CatArticulosActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Catálogo de Artículos"
        android:id="@+id/textView12"
        android:layout_gravity="center_horizontal" />

    <EditText
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:id="@+id/txtHayCambio"
        android:text="1" />

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/txtFiltrar"
            android:hint="Filtrar"
            android:layout_weight="1"
            android:layout_marginTop="7dp" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/ivWipe"
            android:src="@drawable/wipe" />
    </LinearLayout>

    <ListView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:id="@+id/lvArticulos"
        android:layout_weight=".99"
        android:choiceMode="singleChoice"
        android:layout_marginTop="7dp"
        android:descendantFocusability="blocksDescendants"/>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Agregar"
            android:id="@+id/btnAgregar"
            android:layout_weight=".333" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Editar"
            android:id="@+id/btnEditar"
            android:layout_weight=".333" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Eliminar"
            android:id="@+id/btnEliminar"
            android:layout_weight=".333" />
    </LinearLayout>
</LinearLayout>

ListViewAdapter_CatArticulos.java:

package com.example.ernesto.mitienditapuntodeventa;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.RadioButton;
import android.widget.TextView;

/**
 * Created by Ernesto on 10/07/2015.
 */
public class ListViewAdapter_CatArticulos extends BaseAdapter {

    Context context;
    String[] NomArticulo;
    String[] Unidad;
    String[] Precio;
    Integer[] IdArticulo;
    LayoutInflater inflater;

    public ListViewAdapter_CatArticulos(Context context,String[] NomArticulo,String[] Unidad,
                                        String[] Precio, Integer[] IdArticulo){
        this.context=context;
        this.NomArticulo=NomArticulo;
        this.Unidad=Unidad;
        this.Precio=Precio;
        this.IdArticulo=IdArticulo;
    }

    @Override
    public int getCount() {
        return NomArticulo.length;
    }

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

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

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) {

        final TextView TvNomArticulo,TvUnidad,TvPrecio,TvIdArticulo;
        final RadioButton rBtnSeleccionado;
        inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View itemView=inflater.inflate(R.layout.lista_catalogoarticulos,viewGroup,false);

        TvNomArticulo=(TextView)itemView.findViewById(R.id.tvNomArticulo);
        TvUnidad=(TextView)itemView.findViewById(R.id.tvUnidad);
        TvPrecio=(TextView)itemView.findViewById(R.id.tvPrecio);
        TvIdArticulo=(TextView)itemView.findViewById(R.id.tvID);
        rBtnSeleccionado=(RadioButton)itemView.findViewById(R.id.rbtnArtSeleccionado);

        TvNomArticulo.setText(NomArticulo[i]);
        TvUnidad.setText(TvUnidad.getText().toString() + Unidad[i]);
        TvPrecio.setText(TvPrecio.getText().toString() + Precio[i]);
        TvIdArticulo.setText(IdArticulo[i].toString());
        rBtnSeleccionado.setText(null);

        return itemView;
    }
}

lista_catalogoarticulos.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp">

        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/rbtnArtSeleccionado"
            android:checked="false"
            android:layout_gravity="center"
            android:layout_margin="5dp" />

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:text="Nombre de Articulo"
                android:id="@+id/tvNomArticulo" />

            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:layout_width="0dp"
                    android:layout_height="0dp"
                    android:text="ID"
                    android:id="@+id/tvID"
                    android:layout_weight="0" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceSmall"
                    android:text="Unidad: "
                    android:id="@+id/tvUnidad"
                    android:layout_weight=".333" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceSmall"
                    android:text="Precio: "
                    android:id="@+id/tvPrecio"
                    android:layout_weight=".33" />

            </LinearLayout>
        </LinearLayout>

    </LinearLayout>
</LinearLayout>

3 个答案:

答案 0 :(得分:0)

我不认为您的编辑文本更改时更新列表。您需要通知适配器数据已更改。 adapterCatArticulos.notifyDataSetChanged();

    final ListView listaArticulos=(ListView)findViewById(R.id.lvArticulos);
        adapterCatArticulos=new ListViewAdapter_CatArticulos(this,nomArticulo,unidad,precio,idArticulo);
        listaArticulos.setAdapter(adapterCatArticulos);

        listaArticulos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                final TextView txt =(TextView) view.findViewById(R.id.txtArticulo);
                Tostadora(txt.getText().toString());
            }
        });
    adapterCatArticulos.notifyDataSetChanged();
    }else {
        if (TxtFiltro.getText().toString().equals("")){
            Tostadora("No hay registros para presentar");
        }else {
            Tostadora("La busqueda no permite filtar mas registros");
        }
    }

答案 1 :(得分:0)

final TextView txt =(TextView) view.findViewById(R.id.txtArticulo);
                Tostadora(txt.getText().toString());

id txtArticulo TextView 在哪里

答案 2 :(得分:0)

<强>解决

只是尝试了很多观点,我终于找到了问题的解决方案。

这对我有用

ListViewAdapter_CatArticulos.java

package com.example.ernesto.mitienditapuntodeventa;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Created by Ernesto on 10/07/2015.
 */
public class ListViewAdapter_CatArticulos extends BaseAdapter {

    Context context;
    String[] NomArticulo;
    String[] Unidad;
    String[] Precio;
    Integer[] IdArticulo;
    LayoutInflater inflater;
    static int rBtnAnterior=-1;
    //Declaro el RadioButton para que sea siempre accesible
    //Declare the RadioBurron to always accesible
    public static RadioButton rBtnSeleccionado[]=new RadioButton[100000];


    public ListViewAdapter_CatArticulos(Context context,String[] NomArticulo,String[] Unidad,
                                        String[] Precio, Integer[] IdArticulo){
        this.context=context;
        this.NomArticulo=NomArticulo;
        this.Unidad=Unidad;
        this.Precio=Precio;
        this.IdArticulo=IdArticulo;
    }

    @Override
    public int getCount() {
        return NomArticulo.length;
    }

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

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

    @Override
    public View getView(final int i, View view, final ViewGroup viewGroup) {
        final TextView TvNomArticulo,TvUnidad,TvPrecio,TvIdArticulo;
        final LinearLayout LayOut;
        inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        final View itemView=inflater.inflate(R.layout.lista_catalogoarticulos,viewGroup,false);

        TvNomArticulo=(TextView)itemView.findViewById(R.id.tvNomArticulo);
        TvUnidad=(TextView)itemView.findViewById(R.id.tvUnidad);
        TvPrecio=(TextView)itemView.findViewById(R.id.tvPrecio);
        TvIdArticulo=(TextView)itemView.findViewById(R.id.tvID);

        //Asigna un idenficador unico basado en un arreglo para poder llamarlo despues
        //Asign a unique id of a Arrar to call later
        rBtnSeleccionado[IdArticulo[i]]=(RadioButton)itemView.findViewById(R.id.rbtnArtSeleccionado);

        LayOut=(LinearLayout)itemView.findViewById(R.id.lRow);

        TvNomArticulo.setText(NomArticulo[i]);
        TvUnidad.setText(TvUnidad.getText().toString() + Unidad[i]);
        TvPrecio.setText(TvPrecio.getText().toString() + Precio[i]);
        TvIdArticulo.setText(IdArticulo[i].toString());

        //Simplemente ya se conoce que valor se tiene en la pila
        //Simple, we know the value of the array
        rBtnSeleccionado[IdArticulo[i]].setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (rBtnAnterior == -1) {
                    rBtnAnterior = IdArticulo[i];
                    rBtnSeleccionado[IdArticulo[i]].setChecked(true);
                } else {
                    rBtnSeleccionado[rBtnAnterior].setChecked(false);
                    rBtnSeleccionado[IdArticulo[i]].setChecked(true);
                    rBtnAnterior=IdArticulo[i];
                }
            }
        });

        LayOut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (rBtnAnterior == -1) {
                    rBtnAnterior = IdArticulo[i];
                    rBtnSeleccionado[IdArticulo[i]].setChecked(true);
                } else {
                    rBtnSeleccionado[rBtnAnterior].setChecked(false);
                    rBtnSeleccionado[IdArticulo[i]].setChecked(true);
                    rBtnAnterior=IdArticulo[i];
                }
            }
        });
        LayOut.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                return false;
            }
        });

        return itemView;
    }
}

感谢每个人帮助我找到解决方案!!!!