2013-06-17 8 views
7

Pracuję z niestandardowym adapterem ListView, w którym mam TextView i Spinner. Po wybraniu wartości z Prządki, wartość po skopiowaniu do TextView na tym samym Wierszu listy.TextView w listviewview wierszy pokazujących wartości powtarzane podczas przewijania w systemie Android?

Problem polega na tym, jak mam więcej niż 40 elementów w ListView, kiedy wybieram pierwszy spinner i ustawię wartość odpowiedniego TextView, na przewijaniu, ta sama wartość jest widoczna w TextView 10th Row.

Wartości są kopiowane z 1. TextView do 10. TextView podczas przewijania.

Poniżej znajduje się kod, który używam:

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

Czy tytuł właściciela.offtext nie jest poprawnie ustawiony? Jeśli tak, to nie widzę tytułu za każdym razem, gdy dostaniesz metodę getView. Robisz to tylko w swoim OnItemSelectedListener. Z tego powodu w pewnym momencie pokazywałoby nieaktualne dane. –

+0

Spójrz na mój widok http://stackoverflow.com/questions/6470089/why-did-tview-repeated-every-6th-item/41900575#41900575 – Sam

Odpowiedz

2

Mam rozwiązanie dla tego problemu. Wprowadziłem dialogList(), w którym pracuję z ArrayList. Poniżej wymieniłem kod mojej klasy adaptera.

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

Dzięki Sam, stanąłem również przed problemem. Pomogło mi to pozbyć się tego problemu. –

+0

Cała moja przyjemność ... dla Wspólnoty :) –

+0

Dzięki Sam to naprawdę pomaga ..... –

1

To dlatego ListView jest ponowne wszystkie poprzednie Views, które są przewijane (niewidoczny).

Proszę sprawdzić temat this.

+0

Tak ... skończyłem z tym problemem. Ma ogromną wiedzę na temat właściwości widoku listy. dzięki przy okazji. –

1

Zmień

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(); 
     } 

DO

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); 

teraz można zobaczyć, że każda rzecz będzie działać prawidłowo. To nie jest najlepszy sposób, aby rozwiązać problem !, aby zarządzać stanem przedmiotów podczas używania widoku konwersji do przeglądania widoku.

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

Dokonałem zmiany, ale za każdym razem, gdy przewijam w dół i wracam do wartości ponownie zainicjalizowanej na Brak. –

+0

Musisz zapisać wartości na liście tablic lub w innym miejscu, a następnie przywrócić metodę getView() do widoku tekstowego offTxt. –

+0

Nadal nie działa ... Po pierwsze, miałem awarię w Arraylist, po obsłudze awarii, problem pozostaje ten sam. –

Powiązane problemy