2013-05-02 29 views
6

Tôi đang gặp nhiều sự cố khi làm mới chế độ xem danh sách bằng bộ điều hợp tùy chỉnh. Tôi đã tìm kiếm trực tuyến trong một giờ qua và tôi dường như không thể tìm thấy bất kỳ giải pháp nào giúp làm mới chế độ xem danh sách của tôi.Bộ điều hợp Android ListView sẽ không làm mới

Tôi đã thử notifyDataSetChanged và cũng listView.invalidate, nhưng dường như không có gì hoạt động. Mọi sự trợ giúp sẽ rất được trân trọng. Tôi có thể thấy dữ liệu đang được cập nhật bằng cách sử dụng logcat, nhưng nó không được làm mới trên màn hình và tôi không biết tại sao.

Dưới đây là mã.

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

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

Tuỳ chỉnh Adaptor

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

tôi cập nhật dữ liệu sử dụng một sợi tất cả vì vậy thường xuyên.

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

cập nhật ui ui trên thread. gọi adapter.updateStudentTime(); sử dụng runonuithread – Raghunandan

Trả lời

5

Chế độ xem danh sách sẽ tái chế chế độ xem, vì vậy bạn phải đặt dữ liệu trong getView. và i f(row == null){ có nghĩa là dữ liệu sẽ không làm mới, chỉ sử dụng dữ liệu cũ.

bạn nên làm như thế này:

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

Điều này hoạt động, cảm ơn bạn! – SikhWarrior

0

Nghĩ đoạn code dưới đây ngăn cản bạn làm mới danh sách.

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

Mã cho biết khi danh sách làm mới. Nó sẽ được kiểm tra hàng là null (có nghĩa là hiển thị hàng trong màn hình được tạo ra hay không). Khi bạn làm mới danh sách, hàng đã được tạo. Vì vậy, nó không phải là NULL, dữ liệu mới sẽ không được thiết lập!

Bạn nên thay đổi một cái gì đó như thế này:

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

} 
Các vấn đề liên quan