2013-12-12 21 views
5

Android GridView khá thú vị, nó sẽ sử dụng lại chế độ xem con. Những người cuộn lên trở lại từ phía dưới. Vì vậy, không có phương pháp từ GridView để có được chế độ xem con theo vị trí của nó. Nhưng tôi thực sự cần phải xem xét vị trí của nó và làm một số công việc trên đó. Vì vậy, để làm điều đó, tôi đã tạo một SparseArray và đặt chế độ xem theo vị trí của chúng trong đó từ getView trong số BaseAdapter.GridView có chế độ xem theo vị trí, chế độ xem con đầu tiên khác nhau

SparseArray<View> ViewArray = new SparseArray<View>(); 

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView;  
    if (view == null) 
     view = li.inflate(layoutID, null); 
    ViewArray.put(position, view); 
} 

Bây giờ, tôi có thể xem tất cả các chế độ hiển thị theo vị trí của chúng. Tất cả mọi thứ hoạt động hoàn hảo như nó nên nhưng trong một số thiết bị, xem con đầu tiên (vị trí 0) không giống như một trong mảng. Tôi đã đăng nhập getView và thấy rằng đối với vị trí 0, getView được gọi nhiều lần và mỗi mảng thời gian được đặt với chế độ xem khác nhau. Tôi không có ý tưởng tại sao GridView đang gọi getView cho vị trí 0 nhiều lần và điều đó chỉ xảy ra trên một vài thiết bị. Bất kì giải pháp nào ?

Trả lời

5

Sau khi đọc nguồn getPositionForView, tôi đã viết ngày là phương pháp trong GridView của riêng mình, hoạt động hoàn hảo theo API 18

public View GetViewByPosition(int position) { 
    int firstPosition = this.getFirstVisiblePosition(); 
    int lastPosition = this.getLastVisiblePosition(); 

    if ((position < firstPosition) || (position > lastPosition)) 
     return null; 

    return this.getChildAt(position - firstPosition); 
} 
1

Bạn không thể truy cập trực tiếp vào chế độ xem do tái chế. Chế độ xem tại vị trí 0 có thể được sử dụng lại cho vị trí 10, vì vậy bạn không thể chắc chắn dữ liệu có trong một chế độ xem cụ thể.

Cách cần thực hiện là sử dụng dữ liệu cơ bản. Nếu bạn cần sửa đổi dữ liệu tại vị trí 10, sau đó thực hiện điều đó trong Danh sách hoặc mảng dưới bộ điều hợp của bạn và gọi notifyDataSetChanged() trên bộ điều hợp.

nếu bạn cần phải có quan điểm khác nhau để phân nhóm dữ liệu khác nhau, bạn có thể ghi đè lên hai phương pháp sau đây trong bộ chuyển đổi của bạn: getItemViewType()getViewTypeCount()

Sau đó, trong getView() bạn có thể 1) quyết định bố trí để thổi phồng 2) biết loại xem tái chế sử dụng getItemViewType()

Bạn có thể tìm thấy một ví dụ ở đây: https://stackoverflow.com/a/5301093/990616

0

Đã xảy ra sự cố. Đây là link. Vấn đề này đã bị đóng như WorkingAsIntended. Ước muốn có nghĩa là chúng ta có thể mong đợi GridView gọi getView() trên pos 0 nhiều lần.

Công việc của tôi xung quanh là như sau:

public class GridAdapter extends BaseAdapter { 
    ... 
    int previouslyDisplayedPosition = -1; 
    ... 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    if(previouslyDisplayedPosition != position) { 
     .... 

     previouslyDisplayedPosition = position; 
    } 

    return convertedView; 
    } 

Những gì tôi đang cố gắng để làm ở đây đang trở lại cùng 'convertView' nếu cùng pos được gọi là một lần nữa và một lần nữa. Có bằng cách ngăn chặn bất kỳ logic nào trong phạm vi getView() (ví dụ như cài đặt xem hình ảnh, v.v.) để được thực hiện lặp đi lặp lại.

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