2012-06-20 13 views
5

Câu hỏi này hơi khác so với những người khác có tên tương tự. Tôi không cố gắng cập nhật dữ liệu trong danh sách, tôi đang cố gắng cập nhật xem của danh sách.Làm cách nào để buộc vẽ lại danh sách xem?

Ứng dụng của tôi là phân đoạn dựa trên thư viện hỗ trợ. Tôi có một PreferenceActivity nơi tôi cho phép người dùng thiết lập các màu sắc mà họ muốn cho văn bản trong một danh sách (bộ điều hợp đọc sở thích và thiết lập màu sắc). Điều này làm việc như mong đợi cho hầu hết các phần.

Sự cố tôi gặp phải là như sau. Khi tôi có danh sách trên màn hình (nó là một ListFragment) và kéo lên trình đơn, chọn Preferences và thực hiện một sự thay đổi để sở thích màu sắc. Khi trở về danh sách từ PreferenceActivity, tôi dường như không thể lấy danh sách để vẽ lại chính nó với màu mới được chỉ định.

Nếu tôi điều hướng khỏi danh sách và quay trở lại, danh sách sẽ được tạo lại bằng màu mới.

Tôi đang cố gắng sử dụng onResume để thực hiện thay đổi. Mã Tôi hiện có (không xuất hiện để làm bất cứ điều gì vào danh sách, nhưng thay đổi màu sắc tiêu đề như mong muốn):

@Override 
public void onResume() { 
    super.onResume(); 
    header.setTextColor(MyApplication.header); 
    line.setBackgroundColor(MyApplication.header_line); 
    subheader.setTextColor(MyApplication.header); 
    getListView().invalidateViews(); 
} 

Tôi đã thử invalidateViewsinvalidate. Trong tuyệt vọng, tôi đã thử gọi notifyDataSetChanged trên bộ điều hợp mặc dù không có thay đổi nào đối với dữ liệu. Không có gì có vẻ hiệu quả.

Tôi có thiếu điều gì đó hiển nhiên hay không có cách nào để thực hiện việc này?

EDIT

Các 'getView` phương pháp từ bộ chuyển đổi của tôi:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) 
     convertView = View.inflate(context, layout, null); 
    View row = convertView; 
    c.moveToPosition(position); 
    TextView first = (TextView) convertView.findViewById(R.id.ListItem1); 
    TextView second = (TextView) convertView.findViewById(R.id.ListItem2); 
    TextView third = (TextView) convertView.findViewById(R.id.ListItem3); 
    TextView fourth = (TextView) convertView.findViewById(R.id.ListItem4); 

    DecimalFormat df = new DecimalFormat("0.00"); 
    Double hold = Double.valueOf(c.getString(3)); 
    Double qty = Double.valueOf(c.getString(1)); 
    Double total = hold * qty; 

    String color = "#FF00FF"; 
    first.setText(c.getString(2)); 
    first.setTextColor(MyApplication.shoplistitem_name); 
    second.setText(c.getString(4)); 
    second.setTextColor(MyApplication.shoplistitem_desc); 
    third.setText(c.getString(1)); 
    third.setTextColor(MyApplication.shoplistitem_qty); 
    fourth.setText("$" + df.format(total)); 
    fourth.setTextColor(MyApplication.shoplistitem_desc); 

    if (strikethroughState[position] == 1) { 
     first.setPaintFlags(first.getPaintFlags() 
       | Paint.STRIKE_THRU_TEXT_FLAG); 
     second.setPaintFlags(second.getPaintFlags() 
       | Paint.STRIKE_THRU_TEXT_FLAG); 
     third.setPaintFlags(third.getPaintFlags() 
       | Paint.STRIKE_THRU_TEXT_FLAG); 
     fourth.setPaintFlags(third.getPaintFlags() 
       | Paint.STRIKE_THRU_TEXT_FLAG); 
     row.setBackgroundColor(MyApplication.shoplistitem_checked); 
    } else { 
     first.setPaintFlags(first.getPaintFlags() 
       & ~Paint.STRIKE_THRU_TEXT_FLAG); 
     second.setPaintFlags(second.getPaintFlags() 
       & ~Paint.STRIKE_THRU_TEXT_FLAG); 
     third.setPaintFlags(third.getPaintFlags() 
       & ~Paint.STRIKE_THRU_TEXT_FLAG); 
     fourth.setPaintFlags(third.getPaintFlags() 
       & ~Paint.STRIKE_THRU_TEXT_FLAG); 
     row.setBackgroundResource(R.color.black); 
    } 
    return (row); 
} 

Trả lời

7

notifyDataSetChanged() chắc chắn sẽ hoạt động cho bạn. Bạn xử lý thay đổi tùy chọn như thế nào? Nếu bạn chỉ cam kết sở thích với SharedPreferences thì nó sẽ không bao giờ cập nhật biến MyApplication tĩnh. Bạn có thể đăng mã bạn đang sử dụng để đặt tùy chọn không? Nếu bạn không sử dụng, hãy đặt onPreferenceChangedListener() cho tùy chọn màu để đặt biến tĩnh đó khi biến được thay đổi.

+1

Vâng ... điều này đã chỉ ra cách tôi tìm ra vấn đề ... và tôi cảm thấy vô cùng ngu ngốc. Tôi đã gọi 'MyApplication.setPreferences'. Phương thức này là 'MyApplication.setPrefs'. *thở dài* – Barak

1

Bạn nên gọi notifyDataSetChanged() trên adapter của bạn.

+3

Bạn đã bỏ lỡ một phần trong bài đăng của tôi, nơi tôi nói rằng tôi đã thử điều đó và nó không hoạt động? Chỉ cần thử lại một lần nữa. Không vẽ lại các khung nhìn. – Barak

+0

bạn có thể đăng phương thức getView() từ bộ điều hợp không? – Gallal

+0

Câu hỏi được chỉnh sửa để thêm phương thức 'getView'. – Barak

0

Invalidate, invalidateviews, notifyDatasetChanged, nothin for me! Để chỉ cập nhật listview (với CursorAdapter) Tôi chỉ làm:

cur = db.rawQuery("SELECT * FROM ssnt WHERE mid = 1000"); //optional, initial query 
adapter.changeCursor(cur); // or swapCursor(), cur is the initial and the only cursor 

Tuy nhiên, để có nền đúng màu sắc, drawable, gạch dưới văn bản, tôi chỉ làm:

cur = db.rawQuery("SELECT * FROM ssnt WHERE mid = 1000"); 
adapter.changeCursor(cur); 
list.setAdapter(adapter); //just like I did oncreate 

Tôi không thích giải pháp Barak cos có vẻ như trọng lượng nặng và thực hiện mã khi không cần thiết.