2017-05-25 1 views
-3

Ich versuche, Sichtbarkeit von zwei Bildansichten in einem benutzerdefinierten Listenansicht basierend auf den Wert in einem TextView in der gleichen Listenansicht festzulegen. Aber ich bin immer einen NullpointerNull-Zeiger-Ausnahme bei Einstellung Sichtbarkeit von ImageView

Verursacht durch: java.lang.NullPointerException: Der Versuch, auf einer Null-Objekt Referenz virtuelle Methode 'Leerer android.widget.ImageView.setVisibility (int)' aufzurufen

auf der Linie

iv_in_time.setVisibility(View.INVISIBLE); 

Meine Java-Datei ist:

public class Attendance extends AppCompatActivity { 

ImageButton ib_clear_srch; 
EditText et_srch; 
TextView tv_emp_name, tv_emp_status, tv_emp_in_time, tv_emp_out_time; 
ImageView iv_in_time, iv_out_time, iv_pop_down, iv_emp_img; 
ArrayList<EmpAttenModel> empAttenModelArrayList; 
private EmpAttenAdapter empAttenAdapter; 
ListView lv_emp_attendance; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_attendance); 

    et_srch = (EditText)findViewById(R.id.et_srch); 
    ib_clear_srch = (ImageButton)findViewById(R.id.ib_clear_srch); 

    ib_clear_srch.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      et_srch.setText(null); 
     } 
    }); 

    View v; 

    tv_emp_name = (TextView)findViewById(R.id.tv_emp_name); 
    tv_emp_status = (TextView)findViewById(R.id.tv_emp_status); 
    tv_emp_in_time = (TextView)findViewById(R.id.tv_emp_in_time); 
    tv_emp_out_time = (TextView)findViewById(R.id.tv_emp_out_time); 
    iv_in_time = (ImageView)findViewById(R.id.iv_in_time); 
    iv_out_time = (ImageView)findViewById(R.id.iv_out_time); 
    iv_pop_down = (ImageView)findViewById(R.id.iv_pop_down); 
    iv_emp_img = (ImageView)findViewById(R.id.iv_emp_img); 

    lv_emp_attendance = (ListView)findViewById(R.id.lv_emp_atten); 

    empAttenModelArrayList = new ArrayList<>(); 

    empAttenModelArrayList.add(new EmpAttenModel("Ravi Sharma", "Status-Absent","In time", "Out time")); 
    empAttenModelArrayList.add(new EmpAttenModel("Ravi Sharma", "Status-Working","9:30 AM", "Out time")); 
    empAttenModelArrayList.add(new EmpAttenModel("Ravi Sharma", "Status-Present","9:30 AM", "5:00 PM")); 

    empAttenAdapter = new EmpAttenAdapter(empAttenModelArrayList,getApplicationContext()); 

    lv_emp_attendance.setAdapter(empAttenAdapter); 

    TextView tv1; 

    for (int i = 0; i < lv_emp_attendance.getCount(); i++){ 
     v = lv_emp_attendance.getAdapter().getView(i, null, null); 

     tv1 = (TextView)v.findViewById(R.id.tv_emp_status); 

     if(tv1.getText().toString().equals("Status-Absent")){ 
      iv_in_time.setVisibility(View.INVISIBLE); 
      iv_out_time.setVisibility(View.INVISIBLE); 
      tv_emp_in_time.setVisibility(View.INVISIBLE); 
      tv_emp_out_time.setText("In time"); 
     } 

     if(tv1.getText().toString().equals("Status-Working")){ 
      iv_out_time.setVisibility(View.INVISIBLE); 

     } 
    } 
} 
} 

Kann mir jemand sagen, wie ich dieses Problem lösen kann?

+0

Sie versuchen, ListView-Elemente auf Aktivität mithilfe eines Adapters durchzulaufen, und das ist schrecklich falsch. Ich schlage vor, dass Sie die Recycling-Ansicht verwenden, indem Sie die Best Practices anwenden. hier ist die Referenz; https://developer.android.com/training/material/lists-cards.html –

Antwort

1

Es scheint es die Sicht nicht finden mit der ID Sie bieten und so Ihre Ansicht null zu sein und Sie können keine Operationen machen darauf (außer zu überprüfen, ob es null ist oder nicht).

Wenn sowohl die Bildansichten als auch die Textansicht, an denen Sie arbeiten möchten, Teil des Layouts der Zeile Ihres Listview sind, glaube ich, dass es einfacher wäre, direkt im Adapter nachzusehen, wo Sie das erstellen Anzeigen und setzen Sie die richtigen Werte.

Die Überprüfung der Werte und Ansichten in der Aktivität verkompliziert nur die Dinge. Sie können die Überprüfung durchführen, die Sie bereits in dem Adapter durchführen, in dem alle Ihre Ansichten korrekt initialisiert worden sind.

0

sollten Sie die Imageview überprüfen

if(iv_in_time != null){ 
iv_in_time.setVisibility(View.INVISIBLE); 

}

Verwandte Themen