Autore Topic: Cambiare immagine di una singola riga di una ListView  (Letto 1310 volte)

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Cambiare immagine di una singola riga di una ListView
« il: 10 Dicembre 2012, 23:51:51 CET »
0
Salve a tutti,
vorrei modificare una singola immagine di una riga della mia ListView.
Ci sono riuscito all'interno dell' onItemClick(AdapterView<?> parent, View view, int position, long id) inserendo:

Codice (Java): [Seleziona]
                                        ImageView icon = (ImageView) findViewById(R.id.icon);
                                        icon.setVisibility(View.INVISIBLE);

In quel modo effettivamente se la posizione è 0 mi rende invisibile la mia View. Il problema è se voglio fare la stessa cosa nel mio Oncreate non me lo fa fare e mi crasha con un bel NullPointExecption. Probabilmente perchè non trova la View. Come posso fare? L'obbiettivo è rendere invisibile una singola icona della mia lista nell'onCreate.

Questo è il mio BaseAdapter:

Codice (Java): [Seleziona]
public class CustomBaseAdapter extends BaseAdapter {
    Context context;
    List<RowItem> rowItems;

    public CustomBaseAdapter(Context context, List<RowItem> items) {
        this.context = context;
        this.rowItems = items;

    }
 
    /*private view holder class*/
    private class ViewHolder {
        ImageView imageView;
        TextView txtQuestion;
        TextView txtDesc;
    }
 
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        LayoutInflater mInflater = (LayoutInflater)
            context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item, null);
            holder = new ViewHolder();
            holder.txtDesc = (TextView) convertView.findViewById(R.id.desc);
            holder.txtQuestion = (TextView) convertView.findViewById(R.id.question);
            holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
            convertView.setTag(holder);
        }
        else {
           holder = (ViewHolder) convertView.getTag();

        }
 
        RowItem rowItem = (RowItem) getItem(position);
 
        holder.txtDesc.setText(rowItem.getDesc());
        holder.txtQuestion.setText(rowItem.getQuestion());
        holder.imageView.setImageResource(rowItem.getImageId());
//        holder.answer1.setText(rowItem.getAnswer1());
 
        return convertView;
    }
 
    @Override
    public int getCount() {
        return rowItems.size();
    }
   
   
 
    @Override
        public boolean isEnabled(int position) {
                // TODO Auto-generated method stub
                return super.isEnabled(position);
        }

        @Override
    public Object getItem(int position) {
        return rowItems.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return rowItems.indexOf(getItem(position));
    }



   
}

Questi sono gli item associati alla riga:

Codice (Java): [Seleziona]
package ray13.tryquiz;

import java.io.Serializable;

public class RowItem implements Serializable {
        private static final long serialVersionUID = -3743551576302006362L;
       
    private int imageId;
    private String question;
    private String desc;
    private String answer1;
    private String answer2;
    private String answer3;
    private String answer4;
    private String correctAnswer;
 
    public RowItem(int imageId, String question, String desc, String answer1, String answer2, String answer3, String answer4, String correctAnswer) {
        this.imageId = imageId;

        this.question = question;
        this.desc = desc;

        this.answer1 = answer1;
        this.answer2 = answer2;

        this.answer3 = answer3;
        this.answer4 = answer4;
        this.correctAnswer = correctAnswer;
    }
    public int getImageId() {
        return imageId;
    }
    public void setImageId(int imageId) {
        this.imageId = imageId;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public String getQuestion() {
        return question;
    }
    public void setQuestion(String question) {
        this.question = question;
    }
    public String getAnswer1() {
        return answer1;
    }
    public void setAnswer1(String answer1) {
        this.answer1 = answer1;
    }
    public String getAnswer2() {
        return answer2;
    }
    public void setAnswer2(String answer2) {
        this.answer2 = answer2;
    }
    public String getAnswer3() {
        return answer3;
    }
    public void setAnswer3(String answer3) {
        this.answer3 = answer3;
    }
    public String getAnswer4() {
        return answer4;
    }
    public void setAnswer4(String answer4) {
        this.answer4 = answer4;
    }
    public String getCorrectAnswer() {
        return correctAnswer;
    }
    public void setCorrectAnswer(String correctAnswer) {
        this.correctAnswer = correctAnswer;
    }
    @Override
    public String toString() {
        return question + "\n" + desc;
    }




}

Ed infine parte della mia activity principale dove gestisco l'onCreate e dove vorrei rendere invisibile la mia Images

Codice (Java): [Seleziona]
                    public static final Integer[] images = {
                R.drawable.straw,
                R.drawable.banana,
                R.drawable.orange,
                R.drawable.mixed,
                R.drawable.mixed,
                R.drawable.straw,
                R.drawable.banana,
                R.drawable.orange,
                R.drawable.mixed,
                R.drawable.mixed,
                R.drawable.straw,
                R.drawable.banana,
                R.drawable.orange,
                R.drawable.mixed,
                R.drawable.mixed,
                R.drawable.straw,
                R.drawable.banana,
                R.drawable.orange,
                R.drawable.mixed,
                R.drawable.mixed
                };
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                rowItems = new ArrayList<RowItem>();
                for(int i = 0; i < question.length; i++)
                    question[i] = "Domanda " + (i+1);
                for (int i = 0; i < question.length; i++) {
                    RowItem item = new RowItem(images[i], question[i], descriptions[i], answer1[i], answer2[i], answer3[i], answer4[i], correctAnswer[i]);
                    rowItems.add(item);
                   
                        tv_nomegiocatore = (TextView)findViewById(R.id.tv_nomegiocatore);


                        listView = (ListView) findViewById(R.id.list);

                        CustomBaseAdapter adapter = new CustomBaseAdapter(this, rowItems);
                        listView.setAdapter(adapter);
                        listView.setOnItemClickListener(this);
                       
                       
//              ImageView icon = (ImageView) findViewById(R.id.icon);
//              adapter.getView(0, icon, listView);  
//                      icon.setVisibility(View.INVISIBLE);

                       

                }
            }

Grazie e scusate se non mi sono spiegato bene

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #1 il: 11 Dicembre 2012, 15:48:27 CET »
0
UP giornaliero :P

A nessuno viene in mente nulla?

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #2 il: 12 Dicembre 2012, 16:40:15 CET »
0
Up up up  :-[ :-[ :-[ :-[


Offline uandev

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus Dual - Nexus 7
  • Sistema operativo:
    Ubuntu 12.10
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #3 il: 12 Dicembre 2012, 21:45:35 CET »
0
Io proverei a creare una lista di ViewHolder oltre alla lista di RowItem e farei in modo che il metodo getView la utilizzi per gestire le righe della ListView. Così facendo ti basta, nel tuo caso, prelevare il ViewHolder in posizione 0 della lista, accedere all'ImageView tramite il FindViewById  settarla invisibile e richiamare il metodo notifyDataSetChanged dell'adapter.  :-P

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #4 il: 12 Dicembre 2012, 22:17:27 CET »
0
Ci provo da subito. Potresti provare a scriverlo? Programmo da molto poco e credo di non riuscire eheh

Soprattutto non capisco come: "che il metodo getView la utilizzi per gestire le righe della ListView"
« Ultima modifica: 12 Dicembre 2012, 22:20:33 CET da Ray13 »

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #5 il: 12 Dicembre 2012, 22:31:05 CET »
0
ma vuoi solo rendere invisibile un'immagine in base alla posizione, nella getView dell'adapter quando fai:
Codice (Java): [Seleziona]
holder.imageView.setImageResource(rowItem.getImageId());fai:
Codice (Java): [Seleziona]
holder.imageView.setImageResource(rowItem.getImageId());
if (position == POSIZIONE_DA_NASCONDERE) {
holder.imageView.setVisibility(View.INVISIBLE);
}
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #6 il: 12 Dicembre 2012, 22:45:08 CET »
0
No magari, purtroppo non voglio renderla invisibile sempre. La vorrei rendere invisibile solo in determinate condizioni nel metodo onCreate/onResume. Ovvero esempio: if(un contatore x va oltre il numero 100) { rendi invisibile la view della riga} Mi serve questa cosa nel metodo Oncreate e quindi ad ogni volta che si fa partire quell'activity

Offline uandev

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus Dual - Nexus 7
  • Sistema operativo:
    Ubuntu 12.10
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #7 il: 13 Dicembre 2012, 00:12:37 CET »
0
Potresti postare per favore il contenuto di list_item.xml?

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #8 il: 13 Dicembre 2012, 03:16:12 CET »
0
Questo è il codice della list_item.xml

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:background="@drawable/sfondorigaa">
 
    <ImageView
       android:id="@+id/icon"
       android:layout_width="60dp"
       android:layout_height= "60dp"
       android:contentDescription="@string/image"
       android:paddingLeft="10dp"
       android:paddingRight="10dp" />
 
    <TextView
       android:id="@+id/question"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_toRightOf="@+id/icon"
       android:paddingBottom="10dp"
       android:textColor="#000000"
       android:textSize="16sp"
       android:shadowColor="#a223b1"
        android:shadowDx="1.5"
        android:shadowDy="1.5"
        android:shadowRadius="1.5" />
 
    <TextView
       android:id="@+id/desc"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_below="@+id/question"
       android:layout_toRightOf="@+id/icon"
       android:singleLine="true"
       android:ellipsize="end"
       android:paddingLeft="10dp"
       android:textColor="#000000"
       android:textSize="14sp" />

 
</RelativeLayout>

Nel frattempo un ringraziamento sincero anticipato a chi si interessa al problema ^__^

Offline uandev

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus Dual - Nexus 7
  • Sistema operativo:
    Ubuntu 12.10
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #9 il: 13 Dicembre 2012, 18:07:26 CET »
0
Allora io farei così:
Codice (Java): [Seleziona]
public class CustomBaseAdapter extends BaseAdapter {
    Context context;
    List<RowItem> rowItems;
    ArrayList<RelativeLayout> rows = new ArrayList<RelativeLayout>();

    public CustomBaseAdapter(Context context, List<RowItem> items) {
        this.context = context;
        this.rowItems = items;

    }
   
    // Aggiungo questi due metodi
    public void addView(RelativeLayout layout) {
         rows.add(layout);
    }

    public RelativeLayout getView(int position) {
         return rows.get(position);
    }
 
//    Non serve più

    /*private view holder class*/
//    private class ViewHolder {
//        ImageView imageView;
//        TextView txtQuestion;
//        TextView txtDesc;
//    }
 
    public View getView(int position, View convertView, ViewGroup parent) {
//        ViewHolder holder = null;
        ImageView icon;
        TextView desc;
        TextView question;
        LayoutInflater mInflater = (LayoutInflater)
            context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item, null);
//            holder = new ViewHolder();
//            holder.txtDesc = (TextView) convertView.findViewById(R.id.desc);
//            holder.txtQuestion = (TextView) convertView.findViewById(R.id.question);
//            holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
//            convertView.setTag(holder);
               icon = (ImageView) convertView.findViewById(R.id.icon);
               desc = (TextView) convertView.findViewById(R.id.desc);
               question = (TextView) convertView.findViewById(R.id.question);
               RowItem rowItem = (RowItem) getItem(position);
               desc.setText(rowItem.getDesc());
               question.setText(rowItem.getQuestion());
               icon.setImageResource(rowItem.getImageId());
               
               rows.add(convertView);
               return convertView;
         }
        else {
//           holder = (ViewHolder) convertView.getTag();
              return convertView;
        }
 
//        RowItem rowItem = (RowItem) getItem(position);
 
//        holder.txtDesc.setText(rowItem.getDesc());
//        holder.txtQuestion.setText(rowItem.getQuestion());
//        holder.imageView.setImageResource(rowItem.getImageId());
//        holder.answer1.setText(rowItem.getAnswer1());
 
//        return convertView;
    }
 
    @Override
    public int getCount() {
        return rowItems.size();
    }
   
   
 
    @Override
        public boolean isEnabled(int position) {
                // TODO Auto-generated method stub
                return super.isEnabled(position);
        }

        @Override
    public Object getItem(int position) {
        return rowItems.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        return rowItems.indexOf(getItem(position));
    }

}

Invece nell' onCreate() per accedere ad un elemento della ListView usi:
Codice (Java): [Seleziona]
RelativeLayout rl = adapter.getView(0); // se devi modificare il primo elemento della lista
ImageView image = (ImageView)rl.findViewById(R.id.icon);
image.setVisibility(View.INVISIBLE);
adapter.notifyDataSetChanged();

così dovrebbe funzionare!  :D

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #10 il: 13 Dicembre 2012, 18:23:17 CET »
0
Allora ho sostituito il mio CustomBaseAdapter con il tuo e mi ha chiesto di castare così;

Codice (Java): [Seleziona]
rows.add((RelativeLayout) convertView);
Poi ho aggiunto il codice dell'onCreate al fine del mio OnCreate e mi riporta questo errore nel log e crasha l'applicazione quando faccio partire l'activity dell'onCreate:

IndexOutOfBoundsException: Invalid index 0, size is 0 ecc......

e il problema sembra si riferisca alla riga:

Codice (Java): [Seleziona]
RelativeLayout rl = adapter.getView(0); // se devi modificare il primo elemento della lista

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #11 il: 13 Dicembre 2012, 18:32:51 CET »
0
Si, decisamente anche con il Cast del relative layout il problema è che non aggiunge la View ConvertView al layout e quindi quando la richiami dall'oncreate ti dice che l'array è vuoto...  Idee per risolvere? Ci sto smanettando ma mi dice sempre che è vuoto.

Offline uandev

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus Dual - Nexus 7
  • Sistema operativo:
    Ubuntu 12.10
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #12 il: 13 Dicembre 2012, 18:34:37 CET »
0
Scusami nel getView(int position, View convertView, ......) inserisci alposto di rows.add(convertView);  questo:
rows.addView(convertView); se lo richiede fai anche il cast e vedi crasha lo stesso.

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #13 il: 13 Dicembre 2012, 18:43:03 CET »
0
Ci siamo quasi ma continua a dare problemi. Il metodo addView non esiste proprio per row.

Infatti quando faccio:

Codice (Java): [Seleziona]
row.add.......
Esce solamente add add o addall addll con le varie opzioni. Faccio il cast così:

Codice (Java): [Seleziona]
               ((ViewGroup) rows).addView(convertView);
ma dice errore x rossa con:
Cannot cast from arraylist <relativeLayout> to Viewgroup

Offline uandev

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus Dual - Nexus 7
  • Sistema operativo:
    Ubuntu 12.10
Re:Cambiare immagine di una singola riga di una ListView
« Risposta #14 il: 13 Dicembre 2012, 18:51:59 CET »
0
No no aspetta non è row.add ma rows.add e togli anche il vast a ViewGroup perchè rows è un ArrayList  :-P