2013-05-02 2 views
6

맞춤 어댑터로 목록보기를 새로 고치는 데 많은 문제가 있습니다. 나는 지난 1 시간 동안 온라인으로 검색을 해왔고 목록보기를 새로 고칠 수있는 솔루션을 찾을 수없는 것 같습니다.Android ListView 어댑터가 새로 고침되지 않습니다.

notifyDataSetChanged 및 listView.invalidate를 시도했지만 아무 것도 작동하지 않는 것 같습니다. 어떤 도움이라도 대단히 감사하겠습니다. logcat을 사용하여 업데이트되는 데이터를 볼 수 있지만 화면에 새로 고침되지 않고 이유가 없습니다.

다음은 코드입니다.

ArrayList<Student> students = new ArrayList<Student>(); 

listview = (ListView) findViewById(R.id.listView); 
adapter = new StudentAdapter(this, R.layout.listitemlayout, students); 
listview.setAdapter(adapter); 

사용자 정의 어댑터

public class StudentAdapter extends ArrayAdapter<Student>{ 

    Context context; 
    int layoutResourceId;  
    ArrayList<Student> data = null; 

    public StudentAdapter(Context context, int layoutResourceId, ArrayList<Student> data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    public void updateStudentsList(ArrayList<Student> newlist){ 
     data.clear(); 
     data = newlist; 
     this.notifyDataSetChanged(); 
    } 

    public void updateStudentTime(){ 
     for (Student s : data) { 
      s.updateElapsedTime();   
     } 
     this.notifyDataSetChanged(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     if(row == null){ 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      Student student = data.get(position); 

      TextView title = (TextView)row.findViewById(R.id.txtTitle); 
      title.setText(student.getFirstname() + " " + student.getLastname()); 

      TextView subTitle = (TextView)row.findViewById(R.id.txtSubTitle); 
      subTitle.setText(student.getStudentID());  

      TextView duration = (TextView)row.findViewById(R.id.textDuration); 
      duration.setText(student.getElapsedTime()); 
     } 
     return row; 
    } 
} 

나는 모든 너무 자주 스레드를 사용하여 데이터를 업데이트 할 수 있습니다.

Runnable runnable = new Runnable() { 
      public void run() { 
       runOnUiThread(new Runnable() { 
        public void run() { 
         // Updates how long the student is in the centre. 
         adapter.updateStudentTime(); 
         adapter.notifyDataSetChanged(); 
         listview.invalidate(); 
         Log.i("Debug", "Running on UI Thread"); 
        } 
       }); 
       handler.postDelayed(this, 1000); 
      } 
     }; 
     handler.postDelayed(runnable, 1000); 
+0

업데이트 UI 스레드 :

당신이 뭔가를 변경해야합니다. adapter.updateStudentTime();을 호출하십시오. runonuithread를 사용하십시오 – Raghunandan

답변

5

ListView는 뷰를 재활용하므로 getView에서 데이터를 설정해야합니다. 및 i f(row == null){은 데이터가 새로 고침되지 않고 이전 데이터 만 사용한다는 것을 의미합니다.

이 같이해야한다는 :

Class ViewHolder { 
    TextView title; 
    TextView subTitle; 
    TextView duration; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    ViewHolder holder = null; 
    if(row == null){ 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     Student student = data.get(position); 
     holder = new ViewHolder(); 
     holder.title = (TextView)row.findViewById(R.id.txtTitle); 
     holder.subTitle = (TextView)row.findViewById(R.id.txtSubTitle); 
     holder.duration = (TextView)row.findViewById(R.id.textDuration); 
     row.setTag(holder); 
    } else { 
     holder = row.getTag(); 
    } 
    holder.title.setText(student.getFirstname() + " " + student.getLastname()); 
    holder.subTitle.setText(student.getStudentID()); 
    holder.duration.setText(student.getElapsedTime());  
    return row; 
} 
+0

이 작품, 고마워요! – SikhWarrior

0

는 아래의 코드를 사용하면 목록을 새로 고치 방지 생각.

if(row == null){  
... 
} 

코드가 새로 고침되었을 때. 행이 null인지 확인합니다 (화면의 행 표시가 작성되었는지 여부를 나타냄). 목록을 새로 고치면 이미 작성된 행이 표시됩니다. 따라서 NULL이 아니기 때문에 새 데이터가 설정되지 않습니다! UI에

public View getView(int position, View convertView, ViewGroup parent) { 

    View row = convertView; 

    if(row == null){ 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

    } 

    Student student = data.get(position); 
    ... 

} 
관련 문제