TextView in Listenansicht Zeilen mit wiederholten Werten auf Scroll in Android?

Ich arbeite mit kundenspezifischem Adapter eines ListView, in dem ich einen TextView und einen Spinner habe. Nach Auswahl der Werte aus einem Spinner, der Wert nach dem Kopieren in die TextView der jeweiligen Liste der Liste.

Problem ist, da ich mehr als 40 Elemente in der ListView habe, wenn ich den ersten Spinner auswähle und den Wert auf die jeweilige TextView setze, bei Scroll wird der gleiche Wert in der 10. Zeile TextView angezeigt.

Die Werte werden aus dem 1. TextViewto 10th TextView kopiert.

Unten ist der Code, den 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); } } } 

  • Wie kann ich einen einfachen Adapter auf Listenansicht setzen?
  • Android ListView mit CursorAdapter hat falsche Bildlaufposition, nachdem Requery aufgerufen wird, wenn neue Elemente hinzugefügt werden
  • ListFragment OnListItemClick wird nicht aufgerufen
  • ListView und variable Höhe Elemente verursacht Scroll-Probleme
  • Wie kann man für jede Zeile in einer ListView unterschiedliche Höhen einstellen?
  • Was ist die VerticalScrollExtent in Android ScrollView?
  • Bilder wurden beim Scrollen eines ListView mit einem ViewHolder gemischt
  • So verhindern, dass Gegenstände beim Scrollen der Recycler-Ansicht dupliziert werden
  • 3 Solutions collect form web for “TextView in Listenansicht Zeilen mit wiederholten Werten auf Scroll in Android?”

    Ich habe die Lösung für das Problem bekommen. Ich habe eine dialogList() in der ich mit einer ArrayList arbeite. Im Folgenden habe ich den Code meiner Adapterklasse 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(); } } 

    Dies ist, weil ListView alle vorherigen Views wiederverwendet, die ListView werden (nicht sichtbar).

    Bitte schau dir dieses Thema an.

    Veränderung

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

    NACH

     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 !, müssen Sie den Zustand der Elemente, wenn Sie konvertieren Ansicht für View Recycling zu verwalten.

    BEARBEITEN

     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); } } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.