2017-04-09 4 views
0

Ich habe eine Listview, die zwei Bildschaltflächen in der Zeile hat. Durch Antippen der Bildschaltfläche wird die Hintergrundfarbe geändert. Wenn ich auf das erste Listenelement tippe, ändert sich der Hintergrund der Bildschaltfläche und die Ansicht wird gespeichert, aber während der Bildlauf unten in der Listenansicht ändert sich auch die Hintergrundfarbe der Bildschaltfläche eines anderen Listenelements. Unten ist das getView von Custom Adapter. Wie kann ich dieses Problem vermeiden?Verwechslung mit getview android imagebuttons

public View getView(final int i, View view, ViewGroup viewGroup) { 
    ViewHolder holder = new ViewHolder(); 
    holder = null; 

    //view=null; 
    if (inflater == null) { 
     inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 
    if (view == null) { 
     view = inflater.inflate(R.layout.student_list, null); 

     holder = new ViewHolder(); 

     holder.presentButton = (ImageButton) view.findViewById(R.id.imageView); 
     holder.absentButton = (ImageButton) view.findViewById(R.id.imageView2); 
     holder.presentButton.setBackgroundColor(0); 
     holder.absentButton.setBackgroundColor(0); 


     view.setTag(holder); 

    } 
    else { 
     holder = (ViewHolder) view.getTag(); 

    } 

    final SQLiteStudents db1 = new SQLiteStudents(activity.getApplicationContext()); 
    final TextView tvName = (TextView) view.findViewById(R.id.tv_name); 
    final TextView tvRoll = (TextView) view.findViewById(R.id.tv_roll); 
    final studentInfo s = students.get(i); 
    tvRoll.setText(s.getRoll() + "."); 
    tvName.setText(s.getName()); 
    final Integer roll = Integer.parseInt(s.getRoll()); 
    //ivpresent.setBackgroundColor(0); 
    final ViewHolder finalHolder1 = holder; 
    //final ViewHolder finalHolder = holder; 
    holder.presentButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      db1.updateUser(roll,"present"); 


      finalHolder1.presentButton.setBackgroundColor(GREEN); 
      finalHolder1.absentButton.setBackgroundColor(0); 
      //v1.setTag(v.getTag()); 
      //Log.d("present","Roll No: "+String.valueOf(roll)); 
      finalHolder1.presentButton.setTag(Integer.toString(i)); 
      notifyDataSetChanged(); 

     } 
    }); 
    holder.absentButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      db1.updateUser(roll,"absent"); 
      finalHolder1.presentButton.setBackgroundColor(0); 
      finalHolder1.absentButton.setBackgroundColor(RED); 
      //view=null; 
      //Log.d("absent","Roll No: "+String.valueOf(roll)); 
      finalHolder1.presentButton.setTag(Integer.toString(i)); 
      notifyDataSetChanged(); 
     } 
    }); 


    return view; 

} 
public static class ViewHolder { 
    public ImageButton presentButton; 
    public ImageButton absentButton; 
} 

Antwort

0
public class CustomListAdapter extends BaseAdapter { 
    private Activity activity; 
    private LayoutInflater inflater; 
    private List<studentInfo> students; 
    private boolean presentButton = false; 
    private boolean absentButton = false; 

Sie benötigen ein anderes entsprechend in Ihrem Code hinzufügen, finden Sie unter:

public View getView(final int i, View view, ViewGroup viewGroup) { 
    ViewHolder holder = new ViewHolder(); 
    holder = null; 

    //view=null; 
    if (inflater == null) { 
     inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 
    if (view == null) { 
     view = inflater.inflate(R.layout.student_list, null); 

     holder = new ViewHolder(); 

     holder.presentButton = (ImageButton) view.findViewById(R.id.imageView); 
     holder.absentButton = (ImageButton) view.findViewById(R.id.imageView2); 
     holder.presentButton.setBackgroundColor(0); 
     holder.absentButton.setBackgroundColor(0); 


     view.setTag(holder); 

    } 
    else { 
     holder = (ViewHolder) view.getTag(); 

    } 

    final SQLiteStudents db1 = new SQLiteStudents(activity.getApplicationContext()); 
    final TextView tvName = (TextView) view.findViewById(R.id.tv_name); 
    final TextView tvRoll = (TextView) view.findViewById(R.id.tv_roll); 
    final studentInfo s = students.get(i); 
    tvRoll.setText(s.getRoll() + "."); 
    tvName.setText(s.getName()); 
    final Integer roll = Integer.parseInt(s.getRoll()); 
    //ivpresent.setBackgroundColor(0); 
    final ViewHolder finalHolder1 = holder; 
    //final ViewHolder finalHolder = holder; 
    holder.presentButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      db1.updateUser(roll,"present"); 
      presentButton = true; 
     } 
    }); 
    holder.absentButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      db1.updateUser(roll,"absent"); 
      absentButton = true; 

     } 
    }); 

    if(presentButton){ 
    finalHolder1.presentButton.setBackgroundColor(GREEN); 
      finalHolder1.absentButton.setBackgroundColor(0); 
      //v1.setTag(v.getTag()); 
      //Log.d("present","Roll No: "+String.valueOf(roll)); 
      finalHolder1.presentButton.setTag(Integer.toString(i)); 
      notifyDataSetChanged(); 
    } else { 
    //set button to some default button like black 
    } 

    if(absentButton){ 
    finalHolder1.presentButton.setBackgroundColor(0); 
      finalHolder1.absentButton.setBackgroundColor(RED); 
      //view=null; 
      //Log.d("absent","Roll No: "+String.valueOf(roll)); 
      finalHolder1.presentButton.setTag(Integer.toString(i)); 
      notifyDataSetChanged(); 
    } else { 
    //set button to some default button like black 
    } 


    return view; 

} 
+0

Hinzufügen von Code in anderen Abschnitt meiner Anwendung abstürzt. Die Standardfarbe ist null für beide Bildtasten. Ich möchte nur die gedrückte Taste und nicht andere Tasten in der Listenansicht hervorheben. Meine listview Reihe besteht aus textview und 2 imagebuttons. Vollen code von customadapter in: [link] (https://pastebin.com/SbTKWKLB) –

+0

Ich bekomme die Idee von Ihrem Code, aber immer noch ungelöst Problem .. Der obige Code zurück error und erwartet: 'final boolean [] presentButton = new boolean [1];' und wenn ich imagebutton bool zum letzten Array deklariere, wird nach dem Klick keine Schaltfläche hervorgehoben .. :( –

+0

Danke, dass du mich unterstützt hast, Ich bekomme immer noch Probleme mit der Anleitung, die Sie zur Verfügung gestellt haben.Ein BildButton auf allen Listeneinträgen wurde aufScroll ausgewählt.Ich habe die Zeilen auf dem [code] geändert (https://pastebin.com/Uupxwt0q) .aber es gibt mir denselben Fehler wie Bisherige. –