2013-06-17 12 views
7

Sto lavorando con l'adattatore personalizzato di un ListView in cui ho un TextView e uno Spinner. Dopo aver selezionato i valori da uno Spinner, il valore dopo averlo copiato nel TextView della rispettiva stessa Riga di lista.TextView in righe di listview che mostrano valori ripetuti sullo scroll in Android?

Il problema è che, poiché ho più di 40 elementi in ListView, quando seleziono il primo spinner e imposto il valore sul rispettivo TextView, sullo scroll, lo stesso valore è visualizzato nel 10 ° Row TextView.

I valori vengono copiati dal 1 ° TextView al 10 ° TextView su scroll.

Di seguito è il codice che sto usando:

public class AppListAdapter extends BaseAdapter { 

    private LayoutInflater mInflater; 
    private List<App> mApps = Constants.list; 
    private Context _activity; 
    ArrayList<String> months=null; 
    ArrayAdapter<String> dataAdapter =null; 
    int spinerposition; 
    int viewposition; 

    int temp=0; 
    private int screenWidth; 


    /** 
    * Constructor. 
    * 
    * @param context the application context which is needed for the layout inflater 
    * @param screenWidth 
    */ 
    public AppListAdapter(Context context, int screenWidth) { 
     // Cache the LayoutInflate to avoid asking for a new one each time. 
     mInflater = LayoutInflater.from(context); 
     this._activity=context; 
     this.screenWidth = screenWidth; 

     months = new ArrayList<String>(); 
     months.add("No Item Selected"); 
     months.add("None"); 
     months.add("Entertainment"); 
     months.add("Games"); 
     months.add("News/Books"); 
     months.add("Social Networking"); 
     months.add("Utilities"); 
     months.add("Texting"); 
     months.add("Web Browsers"); 


     // Creating adapter for spinner 
     dataAdapter = new ArrayAdapter<String>(_activity, 
       android.R.layout.simple_spinner_item, months); 

     // Drop down layout style - list view with radio button 
     dataAdapter.setDropDownViewResource(android.R.layout.select_dialog_singlechoice); 


    } 

    public int getCount() { 

     return mApps.size(); 
    } 

    public Object getItem(int position) { 
     return mApps.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 

     final AppViewHolder holder; 

     viewposition=position; 
     if(convertView == null) { 
      convertView = mInflater.inflate(R.layout.row, null); 
      // creates a ViewHolder and stores a reference to the children view we want to bind data to 
      holder = new AppViewHolder(); 

      holder.spiner=(Spinner)convertView.findViewById(R.id.spinner); 
      holder.offtext=(TextView)convertView.findViewById(R.id.off_txt); 


      holder.offTxt = (TextView) convertView.findViewById(R.id.off_txt); 
      holder.apptitleTxt = (TextView) convertView.findViewById(R.id.apptitle_txt); 
      Typeface typeface = Typeface.createFromAsset(_activity.getAssets(),"CHICM___.TTF"); 
      holder.apptitleTxt.setTypeface(typeface); 
      holder.offTxt.setTypeface(typeface); 

      if(screenWidth>480){ 
       holder.offTxt.setTextSize(30); 
       holder.apptitleTxt.setTextSize(30); 
      } 
      convertView.setTag(holder); 
     } else { 
      holder = (AppViewHolder) convertView.getTag(); 
     } 

     holder.setTitle(mApps.get(position).getTitle(),mApps.get(position).getVersionName()); 

     notifyDataSetChanged(); 

     holder.offTxt.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       holder.spiner.performClick(); 

      } 
     }); 

     holder.spiner.setAdapter(dataAdapter); 
     holder.spiner.setOnItemSelectedListener(new OnItemSelectedListener() { 
      public void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) { 
       spinerposition=arg2; 
       switch (spinerposition) 
       { 
       case 1: 

        holder.offtext.setText("None"); 
        break; 
       case 2: 

        holder.offtext.setText("Entertainment"); 
        break; 
       case 3: 

        holder.offtext.setText("Games"); 
        break; 
       case 4: 

        holder.offtext.setText("News/Books"); 
        break; 
       case 5: 

        holder.offtext.setText("Social Networking"); 
        break; 
       case 6: 

        holder.offtext.setText("Utilities"); 
        break; 
       case 7: 

        holder.offtext.setText("Texting"); 
        break; 
       case 8: 

        holder.offtext.setText("Web Browsers"); 
        break; 
       } 
      } 
      public void onNothingSelected(AdapterView<?> arg0) { 
      } 
     }); 
     return convertView; 
    } 



    /** 
    * Sets the list of apps to be displayed. 
    * 
    * @param list the list of apps to be displayed 
    */ 
    public void setListItems(List<App> list) { 
     mApps = list; 
    } 

    /** 
    * A view holder which is used to re/use views inside a list. 
    */ 
    public class AppViewHolder { 

     private TextView mTitle = null; 
     private TextView apptitleTxt = null; 
     private TextView offTxt = null; 
     private Spinner spiner=null; 
     public TextView offtext; 
     /** 
     * Sets the text to be shown as the app's title 
     * 
     * @param title the text to be shown inside the list row 
     */ 
     public void setTitle(String title,String category) { 
      apptitleTxt.setText(title); 
//   offtext.setText(category); 
     } 
    } 

} 
+0

Il titolo per holder.offtext non viene impostato correttamente? Se è così non vedo il tuo titolo ogni volta che ottieni il metodo getView. Lo fai solo nel tuo OnItemSelectedListener. A causa del quale mostrerebbe dati obsoleti in un dato momento. –

+0

dai un'occhiata alla mia vista http://stackoverflow.com/questions/6470089/why-did-the-listview-repeated-every-6th-item/41900575#41900575 – Sam

risposta

2

ho ottenuto la soluzione per il problema. Ho introdotto uno dialogList() in cui sto lavorando con un ArrayList. Di seguito ho menzionato il codice della mia classe Adapter.

public class AppListAdapter extends BaseAdapter { 

    private LayoutInflater mInflater; 
    private List<App> mApps = Constants.list; 
    private Context _activity; 
    ArrayList<String> months=null; 
    ArrayAdapter<String> dataAdapter =null; 
    int spinerposition; 
    Context contextfordatabase=null; 

    int temp=0; 
    private int screenWidth; 


    /** 
    * Constructor. 
    * 
    * @param context the application context which is needed for the layout inflater 
    * @param screenWidth 
    */ 
    public AppListAdapter(Context context, int screenWidth) { 
     contextfordatabase=context; 
     // Cache the LayoutInflate to avoid asking for a new one each time. 
     mInflater = LayoutInflater.from(context); 
     this._activity=context; 
     this.screenWidth = screenWidth; 

     months = new ArrayList<String>(); 
     months.add("No Item Selected"); 
     months.add("None"); 
     months.add("Entertainment"); 
     months.add("Games"); 
     months.add("News/Books"); 
     months.add("Social Networking"); 
     months.add("Utilities"); 
     months.add("Texting"); 
     months.add("Web Browsers"); 
    } 

    public int getCount() { 

     return mApps.size(); 
    } 

    public Object getItem(int position) { 
     return mApps.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public class AppViewHolder { 

     private TextView mTitle = null; 
     private TextView apptitleTxt = null; 
     private TextView offTxt = null; 
     private Spinner spiner=null; 
     public TextView offtext; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 

     final AppViewHolder holder; 
     if(convertView == null) { 
      convertView = mInflater.inflate(R.layout.row, null); 
      // creates a ViewHolder and stores a reference to the children view we want to bind data to 
      holder = new AppViewHolder(); 

      holder.spiner=(Spinner)convertView.findViewById(R.id.spinner); 
      holder.offtext=(TextView)convertView.findViewById(R.id.off_txt); 

      holder.apptitleTxt = (TextView) convertView.findViewById(R.id.apptitle_txt); 
      Typeface typeface = Typeface.createFromAsset(_activity.getAssets(),"CHICM___.TTF"); 
      holder.apptitleTxt.setTypeface(typeface); 
      holder.offtext.setTypeface(typeface); 

      if(screenWidth>480){ 
       holder.offtext.setTextSize(30); 
       holder.apptitleTxt.setTextSize(30); 
      } 
      convertView.setTag(holder); 
     } else { 
      holder = (AppViewHolder) convertView.getTag(); 
     } 

     holder.offtext.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       dialogList(holder.offtext, position); 
      } 
     }); 

     holder.apptitleTxt.setText(mApps.get(position).getTitle()); 
     holder.offtext.setText(mApps.get(position).getVersionName()); 

     return convertView; 
    } 

    /** 
    * Sets the list of apps to be displayed. 
    * 
    * @param list the list of apps to be displayed 
    */ 
    public void setListItems(List<App> list) { 
     mApps = list; 
    } 

    public void dialogList(final TextView textView, final int clickedPosition){ 
     Builder builder = new AlertDialog.Builder(_activity); 
     builder.setTitle("Select Category"); 
     builder.setItems(R.array.category_list, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) 
      { 
       textView.setText(months.get(which+1)); 
       App app = new App(); 
       app.setTitle(mApps.get(clickedPosition).getTitle()); 
       app.setPackageName(mApps.get(clickedPosition).getPackageName()); 
       app.setVersionName(months.get(which+1)); 
       app.setVersionCode(mApps.get(clickedPosition).getVersionCode()); 
       mApps.set(clickedPosition, app); 
       System.out.println(clickedPosition+" : "+months.get(which+1)); 


       update_database(mApps.get(clickedPosition).getPackageName(),months.get(which+1)); 


       AppListAdapter.this.notifyDataSetChanged(); 
      } 

     }); 
     builder.create(); 
     builder.show(); 
    } 

    public void update_database(String packageName, String string) { 
     CallBackDatabase callback = new CallBackDatabase(contextfordatabase); 
     callback.open(); 
     Cursor cursor =callback.getAll(packageName); 
     int y=cursor.getCount(); 
     int j=0; 
     if(y!=0) 
     { 
      callback.UpdateCategory(packageName, string); 
     } 
     else 
     { 
      callback.InsertAppInfo(null, packageName, "0", "0", "0", "null", string); 
     } 
     cursor.deactivate(); 
     cursor.close(); 
     callback.close(); 
    } 

} 
+0

Grazie Sam, ero anche di fronte al problema. Mi ha aiutato a liberarmi di quel problema. –

+0

Tutto il mio piacere ... per la Comunità :) –

+0

Grazie Sam è davvero di aiuto ..... –

1

Questo perché ListView è il riutilizzo di tutti i precedenti Views, che sono scorrere (non visibile).

Verificare l'argomento this.

+0

Sì ... ho finito con questo problema. ha una conoscenza enorme delle proprietà della visualizzazione elenco. grazie a proposito. –

1

Change

if(convertView == null) { 
      convertView = mInflater.inflate(R.layout.row, null); 
      // creates a ViewHolder and stores a reference to the children view we want to bind data to 
      holder = new AppViewHolder(); 

      holder.spiner=(Spinner)convertView.findViewById(R.id.spinner); 
      holder.offtext=(TextView)convertView.findViewById(R.id.off_txt); 


      holder.offTxt = (TextView) convertView.findViewById(R.id.off_txt); 
      holder.apptitleTxt = (TextView) convertView.findViewById(R.id.apptitle_txt); 
      Typeface typeface = Typeface.createFromAsset(_activity.getAssets(),"CHICM___.TTF"); 
      holder.apptitleTxt.setTypeface(typeface); 
      holder.offTxt.setTypeface(typeface); 

      if(screenWidth>480){ 
       holder.offTxt.setTextSize(30); 
       holder.apptitleTxt.setTextSize(30); 
      } 
      convertView.setTag(holder); 
     } else { 
      holder = (AppViewHolder) convertView.getTag(); 
     } 

PER

convertView = mInflater.inflate(R.layout.row, null); 
    // creates a ViewHolder and stores a reference to the children view we want to bind data to 
    holder = new AppViewHolder(); 

    holder.spiner=(Spinner)convertView.findViewById(R.id.spinner); 
    holder.offtext=(TextView)convertView.findViewById(R.id.off_txt); 


    holder.offTxt = (TextView) convertView.findViewById(R.id.off_txt); 
    holder.apptitleTxt = (TextView) convertView.findViewById(R.id.apptitle_txt); 
    Typeface typeface = Typeface.createFromAsset(_activity.getAssets(),"CHICM___.TTF"); 
    holder.apptitleTxt.setTypeface(typeface); 
    holder.offTxt.setTypeface(typeface); 

    if(screenWidth>480){ 
     holder.offTxt.setTextSize(30); 
     holder.apptitleTxt.setTextSize(30); 
    } 
    convertView.setTag(holder); 

Ora si può vedere che ogni cosa funzionerà correttamente. Questo non è il modo migliore per risolvere il problema !, necessario per gestire lo stato degli elementi quando si utilizza la visualizzazione convert per il riciclaggio delle viste.

EDIT

public class AppListAdapter extends BaseAdapter { 

    private LayoutInflater mInflater; 
    private List<App> mApps = Constants.list; 
    private Context _activity; 
    ArrayList<String> months=null; 
    ArrayAdapter<String> dataAdapter =null; 
    int spinerposition; 
    int viewposition; 

    int temp=0; 
    private int screenWidth; 


    ArrayList<String> vals=null; 


    /** 
    * Constructor. 
    * 
    * @param context the application context which is needed for the layout inflater 
    * @param screenWidth 
    */ 
    public AppListAdapter(Context context, int screenWidth) { 
     // Cache the LayoutInflate to avoid asking for a new one each time. 
     mInflater = LayoutInflater.from(context); 
     this._activity=context; 
     this.screenWidth = screenWidth; 

     months = new ArrayList<String>(); 
     months.add("No Item Selected"); 
     months.add("None"); 
     months.add("Entertainment"); 
     months.add("Games"); 
     months.add("News/Books"); 
     months.add("Social Networking"); 
     months.add("Utilities"); 
     months.add("Texting"); 
     months.add("Web Browsers"); 

     vals = new ArrayList<String>(); 


     // Creating adapter for spinner 
     dataAdapter = new ArrayAdapter<String>(_activity, 
       android.R.layout.simple_spinner_item, months); 

     // Drop down layout style - list view with radio button 
     dataAdapter.setDropDownViewResource(android.R.layout.select_dialog_singlechoice); 


    } 

    public int getCount() { 

     return mApps.size(); 
    } 

    public Object getItem(int position) { 
     return mApps.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 

     final AppViewHolder holder; 

     viewposition=position; 

      convertView = mInflater.inflate(R.layout.row, null); 
      // creates a ViewHolder and stores a reference to the children view we want to bind data to 
      holder = new AppViewHolder(); 

      holder.spiner=(Spinner)convertView.findViewById(R.id.spinner); 
      holder.offtext=(TextView)convertView.findViewById(R.id.off_txt); 


      holder.offTxt = (TextView) convertView.findViewById(R.id.off_txt); 
      holder.apptitleTxt = (TextView) convertView.findViewById(R.id.apptitle_txt); 
      Typeface typeface = Typeface.createFromAsset(_activity.getAssets(),"CHICM___.TTF"); 
      holder.apptitleTxt.setTypeface(typeface); 
      holder.offTxt.setTypeface(typeface); 

      if(screenWidth>480){ 
       holder.offTxt.setTextSize(30); 
       holder.apptitleTxt.setTextSize(30); 
      } 
      convertView.setTag(holder); 


if(vals.get(position)!=null) 
{ 
holder.offtext.setText(vals.get(position)); 
} 


     holder.setTitle(mApps.get(position).getTitle(),mApps.get(position).getVersionName()); 

     notifyDataSetChanged(); 

     holder.offTxt.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       holder.spiner.performClick(); 

      } 
     }); 

     holder.spiner.setAdapter(dataAdapter); 
     holder.spiner.setOnItemSelectedListener(new OnItemSelectedListener() { 
      public void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) { 
       spinerposition=arg2; 
       switch (spinerposition) 
       { 
       case 1: 

        holder.offtext.setText("None"); 
        break; 
       case 2: 

        holder.offtext.setText("Entertainment"); 
        break; 
       case 3: 

        holder.offtext.setText("Games"); 
        break; 
       case 4: 

        holder.offtext.setText("News/Books"); 
        break; 
       case 5: 

        holder.offtext.setText("Social Networking"); 
        break; 
       case 6: 

        holder.offtext.setText("Utilities"); 
        break; 
       case 7: 

        holder.offtext.setText("Texting"); 
        break; 
       case 8: 

        holder.offtext.setText("Web Browsers"); 
        break; 
       } 
     vals.add(arg2,holder.offtext.getText()); 
      } 
      public void onNothingSelected(AdapterView<?> arg0) { 
      } 
     }); 
     return convertView; 
    } 



    /** 
    * Sets the list of apps to be displayed. 
    * 
    * @param list the list of apps to be displayed 
    */ 
    public void setListItems(List<App> list) { 
     mApps = list; 
    } 

    /** 
    * A view holder which is used to re/use views inside a list. 
    */ 
    public class AppViewHolder { 

     private TextView mTitle = null; 
     private TextView apptitleTxt = null; 
     private TextView offTxt = null; 
     private Spinner spiner=null; 
     public TextView offtext; 
     /** 
     * Sets the text to be shown as the app's title 
     * 
     * @param title the text to be shown inside the list row 
     */ 
     public void setTitle(String title,String category) { 
      apptitleTxt.setText(title); 
//   offtext.setText(category); 
     } 
    } 

} 
+0

Ho apportato la modifica, ma ogni volta che si scorre verso il basso e si torna al valore reinizializzato su Nessuno. –

+0

È necessario salvare i valori in un elenco di array o in un altro in cui archiviare e quindi ripristinarlo getView() nella vista testo offTxt. –

+0

Ancora non funziona ... In primo luogo stavo andando in crash nel Arraylist, dopo aver gestito l'incidente, il problema rimane lo stesso. –

Problemi correlati