Manipulating buttons on list items

Asked

Viewed 92 times

3

Guys I’m having a problem on my list.

In my list is equal to the image below:

inserir a descrição da imagem aqui

Arrows should consider the number of goals of the corresponding textView, but this is not the case. Regardless of the item I clicked on the arrow the increased value is always that of the last item. For example if I click on the arrow to increase the number of goals of Palmeiras, I end up increasing that of Paraná.

I think the problem is that I am not able to resume the list item on which the button was clicked and so the problem can only be in my Adapter.

Follows:

public class AdaptadorLista extends BaseAdapter {
    private LayoutInflater mInflater;
    private List<Jogo> itens;
    private View viewSelecionada;
    private int golsMandante=0;
    private int golsVisitante=0;
    private int gols=0;
    private boolean btMaisPressionado = false;
    private boolean btMenosPressionado = false;
    private ItemSuporte itemSuporte;
    private int posicaoNaLista;

    public AdaptadorLista(Context context, List<Jogo> itens) {
        this.mInflater = LayoutInflater.from(context);
        this.itens = itens;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return itens.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return itens.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

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

        // TODO Auto-generated method stub

        if(view == null){
            itemSuporte = new ItemSuporte();
            view = mInflater.inflate(R.layout.item_lista, null);
            itemSuporte.btMaisGolsMandante=((ImageButton) view.findViewById(R.id.btMaisGolsMandante));

            itemSuporte.btMaisGolsVisitante=((ImageButton) view.findViewById(R.id.btMaisGolsVisitante));

            itemSuporte.btMenosGolsMandante=((ImageButton) view.findViewById(R.id.btMenosGolsMandante));

            itemSuporte.btMenosGolsVisitante=((ImageButton) view.findViewById(R.id.btMenosGolsVisitante));

            itemSuporte.txtPlacarMandante=((TextView) view.findViewById(R.id.txtPlacarMandante));
            itemSuporte.txtPlacarVisitante=((TextView) view.findViewById(R.id.txtPlacarVistante));
            itemSuporte.txtNomeMandante=((TextView) view.findViewById(R.id.txtSimboloMandante));
            itemSuporte.txtNomeVisitante=((TextView) view.findViewById(R.id.txtSimboloVisitante));
            itemSuporte.txtDataJogo=((TextView) view.findViewById(R.id.txtDataJogo));
            itemSuporte.txtLocalJogo=((TextView) view.findViewById(R.id.txtLocalJogo));
            itemSuporte.simboloMandante=((ImageView) view.findViewById(R.id.imgMandante));
            itemSuporte.simboloVisitante=((ImageView) view.findViewById(R.id.imgVisitante));
            view.setTag(itemSuporte);

        } else {
            itemSuporte= (ItemSuporte)view.getTag();
        }

        Jogo jogo = itens.get(position);
        itemSuporte.simboloMandante.setImageResource(jogo.getTimeMandante().getCodigoImagemSimbolo());
        itemSuporte.simboloVisitante.setImageResource(jogo.getTimeVisitante().getCodigoImagemSimbolo());
        itemSuporte.txtNomeMandante.setText(jogo.getTimeMandante().getSigla());
        itemSuporte.txtNomeVisitante.setText(jogo.getTimeVisitante().getSigla());
        itemSuporte.txtPlacarMandante.setText(Integer.toString(jogo.getGolsMandante()));
        itemSuporte.txtPlacarVisitante.setText(Integer.toString(jogo.getGolsVisitante()));
        itemSuporte.txtDataJogo.setText(jogo.getData());
        itemSuporte.txtLocalJogo.setText(jogo.getLocal());

        itemSuporte.btMaisGolsMandante.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                viewSelecionada = v;

                if(event.getAction() == MotionEvent.ACTION_DOWN){
                    btMaisPressionado=true;
                    new AumentaGols().execute();
                }else if(event.getAction() == MotionEvent.ACTION_UP){
                    btMaisPressionado = false;
                }
                return true;
            }
        });


        itemSuporte.btMenosGolsMandante.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                viewSelecionada = v;

                if(event.getAction() == MotionEvent.ACTION_DOWN){
                    btMenosPressionado = true;
                    new DiminuiGols().execute();
                }else if(event.getAction() == MotionEvent.ACTION_UP){
                    btMenosPressionado = false;
                }
                return true;
            }

        });


        itemSuporte.btMaisGolsVisitante.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                viewSelecionada = v;

                if(event.getAction() == MotionEvent.ACTION_DOWN){
                    btMaisPressionado = true;
                    new AumentaGols().execute();
                }else if(event.getAction() == MotionEvent.ACTION_UP){
                    btMaisPressionado = false;
                }
                return true;
            }
        });

        itemSuporte.btMenosGolsVisitante.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                viewSelecionada = v;

                if(event.getAction() == MotionEvent.ACTION_DOWN){
                    btMenosPressionado=true;
                    new DiminuiGols().execute();
                }else if(event.getAction() == MotionEvent.ACTION_UP){

                    btMenosPressionado = false;

                }
                return true;
            }

        });

        return view;
    }

    public void setGols(){
        switch (viewSelecionada.getId()) {
            case R.id.btMaisGolsMandante:
            gols = golsMandante;            
            break;

            case R.id.btMenosGolsMandante:
            gols = golsMandante;
            break;

            default:
            gols = golsVisitante;
            break;
        }
    }

    private class ItemSuporte {
        ImageView simboloMandante;
        ImageView simboloVisitante;
        TextView txtPlacarMandante;
        TextView txtPlacarVisitante;
        TextView txtNomeMandante;
        TextView txtNomeVisitante;
        TextView txtDataJogo;
        TextView txtLocalJogo;
        ImageButton btMaisGolsMandante;
        ImageButton btMaisGolsVisitante;
        ImageButton btMenosGolsMandante;
        ImageButton btMenosGolsVisitante;

    }

    class AumentaGols extends AsyncTask<Void, Integer, Void>{

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub

            while (btMaisPressionado) {
                setGols();
                if(gols<9){
                    gols++;
                    publishProgress(gols);
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }


            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);
            if(viewSelecionada.getId()== R.id.btMaisGolsMandante){
                itemSuporte.txtPlacarMandante.setText(String.valueOf(gols));
                golsMandante=gols;
            }
            if(viewSelecionada.getId()== R.id.btMaisGolsVisitante){
                itemSuporte.txtPlacarVisitante.setText(String.valueOf(gols));
                golsVisitante=gols;
            }

        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            if(viewSelecionada.getId() == R.id.btMaisGolsMandante){
                itemSuporte.txtPlacarMandante.setText(String.valueOf(gols));
                golsMandante=gols;
            }
            if(viewSelecionada.getId() == R.id.btMaisGolsVisitante){
                itemSuporte.txtPlacarVisitante.setText(String.valueOf(gols));
                golsVisitante=gols;
            }
        }

    }

    class DiminuiGols extends AsyncTask<Void, Integer, Void>{

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            while (btMenosPressionado) {
                if(gols>0){
                    gols--;
                    publishProgress(gols);
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }


            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);
            if(viewSelecionada.getId() == R.id.btMenosGolsMandante){
                itemSuporte.txtPlacarMandante.setText(String.valueOf(gols));
                golsMandante=gols;
            }
            if(viewSelecionada.getId() == R.id.btMenosGolsVisitante){
                itemSuporte.txtPlacarVisitante.setText(String.valueOf(gols));
            }

        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            if(viewSelecionada.getId() == R.id.btMenosGolsMandante){
                itemSuporte.txtPlacarMandante.setText(String.valueOf(gols));
                golsMandante=gols;
            }
            if(viewSelecionada.getId() == R.id.btMenosGolsVisitante){
                itemSuporte.txtPlacarVisitante.setText(String.valueOf(gols));
                golsVisitante=gols;
            }
        }

    }
}

Layout of each item_list.xml item:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/txtDataJogo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="10/11 - 21:00" />

    </LinearLayout>

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

        <ImageView
            android:id="@+id/imgMandante"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_gravity="center_vertical"
            android:layout_weight="7"
            android:src="@drawable/parana2" />

        <TextView
            android:id="@+id/txtSimboloMandante"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal"
            android:layout_weight="1"
            android:text="PAR"
            android:textSize="20sp" />

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

            <ImageButton
                android:id="@+id/btMaisGolsMandante"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|center_horizontal"
                android:layout_weight="4"
                android:background="@drawable/setaparacima" />

            <TextView
                android:id="@+id/txtPlacarMandante"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|center_horizontal"
                android:layout_weight="1"
                android:gravity="center_vertical|center_horizontal"
                android:text="2"
                android:textSize="50sp" />

            <ImageButton
                android:id="@+id/btMenosGolsMandante"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|center_horizontal"
                android:layout_weight="4"
                android:background="@drawable/setaparabaixo" />

        </LinearLayout>

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:gravity="center_vertical|center_horizontal"
            android:text="x"
            android:textSize="40sp" />

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

            <ImageButton
                android:id="@+id/btMaisGolsVisitante"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|center_horizontal"
                android:layout_weight="4"
                android:background="@drawable/setaparacima" />

            <TextView
                android:id="@+id/txtPlacarVistante"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|center_horizontal"
                android:layout_weight="1"
                android:gravity="center_vertical|center_horizontal"
                android:text="1"
                android:textSize="50sp" />

            <ImageButton
                android:id="@+id/btMenosGolsVisitante"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|center_horizontal"
                android:layout_weight="4"
                android:background="@drawable/setaparabaixo" />

        </LinearLayout>

        	<TextView
        	    android:id="@+id/txtSimboloVisitante"
        	    android:layout_width="wrap_content"
        	    android:layout_height="wrap_content"
        	    android:layout_gravity="center_vertical|center_horizontal"
        	    android:layout_weight="1"
        	    android:text="AVA"
        	    android:textSize="20sp" />

        <ImageView
            android:id="@+id/imgVisitante"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_gravity="center_vertical"
            android:layout_weight="7"
            android:src="@drawable/avai2" />

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

        <TextView
            android:id="@+id/txtLocalJogo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="Allianz Parque" />

    </LinearLayout>



</LinearLayout>

1 answer

4


Your Adapter sounds good to me.
The problem is in the use of itemSuporte. Note that the itemSuporte is used whenever a line listView needs to be designed.
At the end of the entire list will be displayed it will point to the layout/view last-line.

You must use another variable to store which the layout/view to which button is pressed. It has to be initialized in each method onTouch.

I don’t know what the layout of the line of listView.
Assuming that all elements are included in one layout, that layout/view may be obtained in the onTouch using the method getParent() of view past tense.
Then just use findViewById to get the others views of the line.

EDIT (After seeing xml)

It seems that the button and the text you want to change are in the same LinearLayout.
So do the following:

private LinearLayout linhaLista;  

In each onTouch:

@Override
public boolean onTouch(View v, MotionEvent event) {
    viewSelecionada = v;
    linhaLista = (LinearLayout)v.getParent();
    ...
    ...
}  

In the methods onProgressUpdate() and onPostExecute() utilize linhaLista to obtain the textView:

TextView txtPlacarMandante = (TextView)linhaLista.findViewById(R.id.txtPlacarMandante)
TextView txtPlacarVistante = (TextView)linhaLista.findViewById(R.id.txtPlacarVistante)
  • Includes the Layout of the items. It would be like taking the view of the item containing the button and the text I want to change?

  • @Caezar I edited my answer.

  • Perfect @ramaral, too bad I still have no points to be able to evaluate your answer!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.