2013-06-17 7 views
7

Ich arbeite mit benutzerdefinierten Adapter einer ListView, in der ich eine TextView und einen Spinner habe. Nach Auswahl der Werte aus einem Drehfeld wird der Wert nach dem Kopieren in die Textansicht der jeweiligen gleichen Zeile der Liste kopiert.TextView in Listenansichtszeilen mit wiederholten Werten beim Blättern in Android?

Problem ist, wie ich mehr als 40 Elemente in der ListView, wenn ich den ersten Spinner auswählen und den Wert auf die entsprechende TextView, beim Blättern, der gleiche Wert wird in der 10. Zeile TextView gesehen.

Werte werden vom ersten TextView bis zum 10. TextView auf Bildlauf kopiert.

Unten ist der Code, die ich verwende:

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

Wird der Titel für holder.offtext nicht richtig eingestellt? Wenn ja, sehe ich Sie Titel nicht jedes Mal, wenn Sie in getView-Methode erhalten. Sie tun dies nur in Ihrem OnItemSelectedListener. Aufgrund dessen würde es irgendwann veraltete Daten zeigen. –

+0

Werfen Sie einen Blick auf meine Ansicht http://StackOverflow.com/Questions/6470089/Why-Did-the-Listview-Repeated-Every-6th-item/41900575#41900575 – Sam

Antwort

2

bekam ich die Lösung für das Problem. Ich habe eine dialogList() eingeführt, in der ich mit einer ArrayList arbeite. Im Folgenden habe ich den Code meiner Adapter-Klasse erwähnt.

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

Dank Sam, ich war auch mit dem Problem konfrontiert. Es half mir, dieses Problem loszuwerden. –

+0

All mein Vergnügen ... in die Community :) –

+0

Danke Sam, es hilft wirklich ..... –

1

Dies liegt daran, ListView alle bisherigen Views Wiederverwendung, die (nicht sichtbar) gescrollt werden.

Bitte überprüfen Sie this Thema.

+0

Ja ... Ich bin fertig mit diesem Problem. Ich habe großes Wissen über die Listenansichtseigenschaften. Danke übrigens. –

1

ändern

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

TO

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

Jetzt können Sie sehen, dass alles richtig funktioniert. Dies ist nicht der beste Weg, um das Problem zu beheben !, um den Zustand Ihrer Elemente zu verwalten, wenn Sie die Ansicht zum Recyceln von Ansichten verwenden.

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

Ich habe die Änderung vorgenommen, aber wenn ich nach unten und wieder nach oben blicke, wird der Wert auf None zurückgesetzt. –

+0

Sie müssen Ihre Werte in eine Array-Liste oder an anderer Stelle speichern und dann getView() in die OffTxt-Textansicht zurückschreiben. –

+0

Es funktioniert immer noch nicht ... Zuerst stürzte ich in der Arraylist, nach dem Absturz, das Problem bleibt das gleiche. –