Autore Topic: Problema listview  (Letto 557 volte)

Offline Dr.Joek

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Emulatore a gogo
  • Sistema operativo:
    Windows7, Windows8.1, Ubuntu15.3, Windows10
Problema listview
« il: 01 Ottobre 2015, 13:51:48 CEST »
0
Ciao, il problema è che io ho fatto una listview e un'adapter, e al click del bottone per ogni elemento dell'adapter, l'adapter deve restituire il nome dell'utente (in bianco), il problema è che quando si cliccano gli elementi che all'avvio non sono visualizzati nella listview, lui assegna il nome da capo come se il settimo fosse il primo l'ottavo fosse il secondo, qualche modo per risolvere?

Ecco dei pratici esempi:
come funziona quando un elemento è tra i primi 6: https://gyazo.com/9173b8ffd9e42ebb772724ef4ff039a0
come funziona quando un elemento non è tra i primi 6: https://gyazo.com/0066e15a4dfa7460670275637077bac3

ADAPTER:
Codice (Java): [Seleziona]
package com.example.gioele.mathup;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;



/**
 * Created by Gioele on 24/09/2015.
 */


public class ListDataAdapter extends ArrayAdapter {
    List list = new ArrayList<>();
    public ListDataAdapter(Context context, int resource) {
        super(context, resource);
    }

static String nickname2 = "879410";

    String nick;
    final List nickname = new ArrayList<>();

    static class LayoutHandler
    {
        TextView user_figura1, user_figura2, user_nickname_problem;
        Button user_apri;
    }
    @Override
    public void add(Object object) {
        super.add(object);
        list.add(object);
    }

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

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View tabella2 = convertView;
        LayoutHandler layoutHandler;
        if(tabella2 == null){
            LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            tabella2 = layoutInflater.inflate(R.layout.tabella2,parent,false);
            layoutHandler = new LayoutHandler();
            layoutHandler.user_figura1 = (TextView)tabella2.findViewById(R.id.figura11);
            layoutHandler.user_figura2 = (TextView)tabella2.findViewById(R.id.figura22);
            layoutHandler.user_nickname_problem = (TextView)tabella2.findViewById(R.id.nominativo);

            DataProvider dataProvider = (DataProvider)this.getItem(position);
            layoutHandler.user_nickname_problem.setText(dataProvider.getUser_nickname_problem());
            nick = layoutHandler.user_nickname_problem.getText().toString();
            nickname.add(nick);

            layoutHandler.user_apri = (Button)tabella2.findViewById(R.id.apri1);
            layoutHandler.user_apri.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getContext(), "Item: " + nickname.get(position), Toast.LENGTH_SHORT).show();
                    nickname2 = (String) nickname.get(position);
                    //nickname2 = "45454545676767676";
                    cambio3.cambio cambio2 = new cambio3.cambio();
                    Timer myTimer3 = new Timer();
                    myTimer3.schedule(cambio2, 2000);


                }
            });
            tabella2.setTag(layoutHandler);
        }
        else{
            layoutHandler = (LayoutHandler) tabella2.getTag();

        }

        DataProvider dataProvider = (DataProvider)this.getItem(position);
        layoutHandler.user_figura1.setText(dataProvider.getUser_figura1());
        layoutHandler.user_figura2.setText(dataProvider.getUser_figura2());
        layoutHandler.user_nickname_problem.setText(dataProvider.getUser_nickname_problem());

        return tabella2;

    }

     static public class cambio3 extends Activity {



         static public class cambio extends TimerTask {



            public void run() {



                nickname2 = "879410";
            }
        }

    }

}


Codice cml schermata:
Codice (XML): [Seleziona]
<FrameLayout 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:background="#0099cc"
   tools:context="com.example.gioele.mathup.seleziona1">


    <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"
       android:fitsSystemWindows="true"
       android:clickable="true">

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

            <ListView
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:id="@+id/listview2"
               android:layout_marginTop="52dp"
               android:headerDividersEnabled="false"
               android:clickable="true" />
        </LinearLayout>
</FrameLayout>
</FrameLayout>
« Ultima modifica: 01 Ottobre 2015, 14:36:30 CEST da Dr.Joek »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1231
  • Respect: +60
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Problema scrollview
« Risposta #1 il: 01 Ottobre 2015, 14:09:55 CEST »
0
Crea classi diverse. Un activity un adapter e basta. E non devi fare override del metodo add e remove. Devi solo fare override di getview e creare il tuo adapter passandogli una lista

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 763
  • Respect: +159
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Problema listview
« Risposta #2 il: 02 Ottobre 2015, 13:02:49 CEST »
+1
Credo il problema sia qui:

Codice (Java): [Seleziona]
layoutHandler.user_apri = (Button)tabella2.findViewById(R.id.apri1);
            layoutHandler.user_apri.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getContext(), "Item: " + nickname.get(position), Toast.LENGTH_SHORT).show();
                    nickname2 = (String) nickname.get(position);
                    //nickname2 = "45454545676767676";
                    cambio3.cambio cambio2 = new cambio3.cambio();
                    Timer myTimer3 = new Timer();
                    myTimer3.schedule(cambio2, 2000);


                }
            }

prova invece

Codice (Java): [Seleziona]
layoutHandler.user_apri = (Button)tabella2.findViewById(R.id.apri1);
layoutHandler.user_apri.setTag(position); //Salvo la posizione nella view;
            layoutHandler.user_apri.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
int position = (Integer)v.getTag(); //Ricarico la posizione dalla view
                    Toast.makeText(getContext(), "Item: " + nickname.get(position), Toast.LENGTH_SHORT).show();
                    nickname2 = (String) nickname.get(position);
                    //nickname2 = "45454545676767676";
                    cambio3.cambio cambio2 = new cambio3.cambio();
                    Timer myTimer3 = new Timer();
                    myTimer3.schedule(cambio2, 2000);


                }
            }
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Dr.Joek

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Emulatore a gogo
  • Sistema operativo:
    Windows7, Windows8.1, Ubuntu15.3, Windows10
Re:Problema listview
« Risposta #3 il: 02 Ottobre 2015, 14:06:51 CEST »
0
Credo il problema sia qui:

Codice (Java): [Seleziona]
layoutHandler.user_apri = (Button)tabella2.findViewById(R.id.apri1);
            layoutHandler.user_apri.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getContext(), "Item: " + nickname.get(position), Toast.LENGTH_SHORT).show();
                    nickname2 = (String) nickname.get(position);
                    //nickname2 = "45454545676767676";
                    cambio3.cambio cambio2 = new cambio3.cambio();
                    Timer myTimer3 = new Timer();
                    myTimer3.schedule(cambio2, 2000);


                }
            }

prova invece

Codice (Java): [Seleziona]
layoutHandler.user_apri = (Button)tabella2.findViewById(R.id.apri1);
layoutHandler.user_apri.setTag(position); //Salvo la posizione nella view;
            layoutHandler.user_apri.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
int position = (Integer)v.getTag(); //Ricarico la posizione dalla view
                    Toast.makeText(getContext(), "Item: " + nickname.get(position), Toast.LENGTH_SHORT).show();
                    nickname2 = (String) nickname.get(position);
                    //nickname2 = "45454545676767676";
                    cambio3.cambio cambio2 = new cambio3.cambio();
                    Timer myTimer3 = new Timer();
                    myTimer3.schedule(cambio2, 2000);


                }
            }
Grazie  della  risposta  Omnibus, ma provando quel che dici  restituisce questo  errore , che significa ?
Codice: [Seleziona]
10-02 08:01:49.098    2529-2529/com.example.gioele.mathup E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.gioele.mathup, PID: 2529
    java.lang.NullPointerException
            at com.example.gioele.mathup.ListDataAdapter$1.onClick(ListDataAdapter.java:81)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 763
  • Respect: +159
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Problema listview
« Risposta #4 il: 02 Ottobre 2015, 16:11:30 CEST »
+1

Cosa c'è alla riga 81 di ListDataAdapter.java?

Post unito: 02 Ottobre 2015, 16:22:42 CEST
Ho capito dov'è il problema (oltre al fatto che il codice è un disastro).

Cambia la onClick in:

Codice (Java): [Seleziona]
                int position = (Integer)v.getTag();
                DataProvider dataProvider = (DataProvider)ListDataAdapter.this.getItem(position);
                nickname2 = dataProvider.getUser_nickname_problem();
                Toast.makeText(getContext(), "Item: " + nickname2, Toast.LENGTH_SHORT).show();
                cambio3.cambio cambio2 = new cambio3.cambio();
                Timer myTimer3 = new Timer();
                myTimer3.schedule(cambio2, 2000);

dovrebbe funzionare
« Ultima modifica: 02 Ottobre 2015, 16:22:42 CEST da Ohmnibus, Reason: Merged DoublePost »
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Dr.Joek

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Emulatore a gogo
  • Sistema operativo:
    Windows7, Windows8.1, Ubuntu15.3, Windows10
Re:Problema listview
« Risposta #5 il: 02 Ottobre 2015, 17:58:04 CEST »
0
Ho provato il codice che mi hai dato, e non funzionato dando lo stesso errore di prima causato dalla riga 81 cioè:
Codice (Java): [Seleziona]
int position = (Integer)v.getTag();Il problema sta nel fatto che la listview legge solo gli elementi a schermo e non quelli momentaneamente invisibili, c'è un modo per risolvere?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 763
  • Respect: +159
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Problema listview
« Risposta #6 il: 02 Ottobre 2015, 22:24:26 CEST »
+1
Prova a mettere

Codice (Java): [Seleziona]
layoutHandler.user_apri.setTag(position);
prima di

Codice (Java): [Seleziona]
return tabella2;
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Dr.Joek

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Emulatore a gogo
  • Sistema operativo:
    Windows7, Windows8.1, Ubuntu15.3, Windows10
Re:Problema listview
« Risposta #7 il: 02 Ottobre 2015, 23:16:04 CEST »
0
Prova a mettere

Codice (Java): [Seleziona]
layoutHandler.user_apri.setTag(position);
prima di

Codice (Java): [Seleziona]
return tabella2;
Ho fatto quel che dici e adesso mi restituisce questo errore

Codice: [Seleziona]
10-02 17:11:48.566    2542-2542/com.example.gioele.mathup E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.gioele.mathup, PID: 2542
    java.lang.IndexOutOfBoundsException: Invalid index 8, size is 7
            at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
            at java.util.ArrayList.get(ArrayList.java:308)
            at com.example.gioele.mathup.ListDataAdapter$1.onClick(ListDataAdapter.java:80)

Codice attuale solo on click:
Codice (Java): [Seleziona]
 @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View tabella2 = convertView;
        LayoutHandler layoutHandler;
        if(tabella2 == null){
            LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            tabella2 = layoutInflater.inflate(R.layout.tabella2,parent,false);
            layoutHandler = new LayoutHandler();
            layoutHandler.user_figura1 = (TextView)tabella2.findViewById(R.id.figura11);
            layoutHandler.user_figura2 = (TextView)tabella2.findViewById(R.id.figura22);
            layoutHandler.user_nickname_problem = (TextView)tabella2.findViewById(R.id.nominativo);

            DataProvider dataProvider = (DataProvider)this.getItem(position);
            layoutHandler.user_nickname_problem.setText(dataProvider.getUser_nickname_problem());
            nick = layoutHandler.user_nickname_problem.getText().toString();
            nickname.add(nick);

            layoutHandler.user_apri = (Button)tabella2.findViewById(R.id.apri1);
            layoutHandler.user_apri.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getContext(), "Item: " + nickname.get(position), Toast.LENGTH_SHORT).show();
                    nickname2 = (String) nickname.get(position);
                    //nickname2 = "45454545676767676";
                    cambio3.cambio cambio2 = new cambio3.cambio();
                    Timer myTimer3 = new Timer();
                    myTimer3.schedule(cambio2, 2000);


                }
            });
            tabella2.setTag(layoutHandler);
        }
        else{
            layoutHandler = (LayoutHandler) tabella2.getTag();

        }

        DataProvider dataProvider = (DataProvider)this.getItem(position);
        layoutHandler.user_figura1.setText(dataProvider.getUser_figura1());
        layoutHandler.user_figura2.setText(dataProvider.getUser_figura2());
        layoutHandler.user_nickname_problem.setText(dataProvider.getUser_nickname_problem());

        layoutHandler.user_apri.setTag(position);
        return tabella2;

    }
   
C'è una soluzione?
Comunque per il tuo aiuto ti meriti dei thanks.Grazie.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 763
  • Respect: +159
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Problema listview
« Risposta #8 il: 03 Ottobre 2015, 02:01:53 CEST »
+1
Perché hai cambiato il codice della onClick.
Usa il codice che ti ho dato prima:

Codice (Java): [Seleziona]
                int position = (Integer)v.getTag();
                DataProvider dataProvider = (DataProvider)ListDataAdapter.this.getItem(position);
                nickname2 = dataProvider.getUser_nickname_problem();
                Toast.makeText(getContext(), "Item: " + nickname2, Toast.LENGTH_SHORT).show();
                cambio3.cambio cambio2 = new cambio3.cambio();
                Timer myTimer3 = new Timer();
                myTimer3.schedule(cambio2, 2000);
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Dr.Joek

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Emulatore a gogo
  • Sistema operativo:
    Windows7, Windows8.1, Ubuntu15.3, Windows10
Re:Problema listview
« Risposta #9 il: 03 Ottobre 2015, 09:50:00 CEST »
0
Perché hai cambiato il codice della onClick.
Usa il codice che ti ho dato prima:

Codice (Java): [Seleziona]
                int position = (Integer)v.getTag();
                DataProvider dataProvider = (DataProvider)ListDataAdapter.this.getItem(position);
                nickname2 = dataProvider.getUser_nickname_problem();
                Toast.makeText(getContext(), "Item: " + nickname2, Toast.LENGTH_SHORT).show();
                cambio3.cambio cambio2 = new cambio3.cambio();
                Timer myTimer3 = new Timer();
                myTimer3.schedule(cambio2, 2000);
Grazie mille, questo post lo avevo messo anche nei forum inglesi ma la avevano dato soluzioni in cui dovevo mettere circa 500-600 stringhe di codice, invece con il tuo aiuto con 4 stringhe si è ottenuto lo stesso risultato.Grazie.
Codice corretto:
Codice (Java): [Seleziona]
package com.example.gioele.mathup;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;



/**
 * Created by Gioele on 24/09/2015.
 */


public class ListDataAdapter extends ArrayAdapter {
    List list = new ArrayList<>();
    public ListDataAdapter(Context context, int resource) {
        super(context, resource);
    }

static String nickname2 = "879410";

    String nick;
    final List nickname = new ArrayList<>();

    static class LayoutHandler
    {
        TextView user_figura1, user_figura2, user_nickname_problem;
        Button user_apri;
    }
    @Override
    public void add(Object object) {
        super.add(object);
        list.add(object);
    }

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

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View tabella2 = convertView;
        LayoutHandler layoutHandler;
        if(tabella2 == null){
            LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            tabella2 = layoutInflater.inflate(R.layout.tabella2,parent,false);
            layoutHandler = new LayoutHandler();
            layoutHandler.user_figura1 = (TextView)tabella2.findViewById(R.id.figura11);
            layoutHandler.user_figura2 = (TextView)tabella2.findViewById(R.id.figura22);
            layoutHandler.user_nickname_problem = (TextView)tabella2.findViewById(R.id.nominativo);

            DataProvider dataProvider = (DataProvider)this.getItem(position);
            layoutHandler.user_nickname_problem.setText(dataProvider.getUser_nickname_problem());
            nick = layoutHandler.user_nickname_problem.getText().toString();
            nickname.add(nick);

            layoutHandler.user_apri = (Button)tabella2.findViewById(R.id.apri1);
            layoutHandler.user_apri.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {


                    int position = (Integer)v.getTag();
                    DataProvider dataProvider = (DataProvider)ListDataAdapter.this.getItem(position);
                    nickname2 = dataProvider.getUser_nickname_problem();
                    Toast.makeText(getContext(), "Item: " + nickname2, Toast.LENGTH_SHORT).show();
                    cambio3.cambio cambio2 = new cambio3.cambio();
                    Timer myTimer3 = new Timer();
                    myTimer3.schedule(cambio2, 2000);


                }
            });
            tabella2.setTag(layoutHandler);
        }
        else{
            layoutHandler = (LayoutHandler) tabella2.getTag();

        }

        DataProvider dataProvider = (DataProvider)this.getItem(position);
        layoutHandler.user_figura1.setText(dataProvider.getUser_figura1());
        layoutHandler.user_figura2.setText(dataProvider.getUser_figura2());
        layoutHandler.user_nickname_problem.setText(dataProvider.getUser_nickname_problem());

        layoutHandler.user_apri.setTag(position);
        return tabella2;

    }

     static public class cambio3 extends Activity {



         static public class cambio extends TimerTask {



            public void run() {



                nickname2 = "879410";
            }
        }

    }

}