2010-11-10 31 views
11

tôi đang sử dụng trình xem để hiển thị từ mảng dynamicadapter.it động nhưng dữ liệu được hiển thị thay đổi bất thường khi tôi cuộn Danh sách. tôi muốn Chế độ xem danh sách của mình chỉ được điền một lần, Không phải lúc nào tôi cũng cuộn danh sách của mình. Bất kỳ đề xuất nào? Đây là Mã của tôiCách triển khai trình giữ chế độ xem?

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

    // A ViewHolder keeps references to children views to avoid unneccessary calls    
    // to findViewById() on each row.    
    ViewHolder holder;    
    // When convertView is not null, we can reuse it directly, there is no need    
    // to reinflate it. We only inflate a new View when the convertView supplied    
    // by ListView is null.    

    if (convertView == null) {     

    convertView = mInflater.inflate(R.layout.sample, null); 
    // Creates a ViewHolder and store references to the two children views     
    // we want to bind data to.    
    holder = new ViewHolder();     
    holder.name = (TextView) convertView.findViewById(R.id.text);    
    holder.icon = (ImageView) convertView.findViewById(R.id.icon);     
    convertView.setTag(holder);    
    } else {     
    // Get the ViewHolder back to get fast access to the TextView     
    // and the ImageView. 


    holder = (ViewHolder) convertView.getTag(); 

    }    


    // Bind the data efficiently with the holder. 
    if(_first==true) 
    { 
    if(id<myElements.size()) 
    { 
     holder.name.setText(myElements.get(id)); 
    holder.icon.setImageBitmap(mIcon1); 
    id++; 
    } 
    else 
    { 
    _first=false; 
    } 
    } 
    //holder.icon.setImageBitmap(mIcon2); 
    /*try{ 
    if(id<myElements.size()) 
    id++; 
    else 
    { 
     id--; 
    } 
    } 
    catch(Exception e) 
    { 
    android.util.Log.i("callRestService",e.getMessage()); 
    }*/ 



    return convertView; 

    }   
static class ViewHolder {    
TextView name;    
ImageView icon;   
} 

khi danh sách được nạp nó trông như thế này: http://i.stack.imgur.com/NrGhR.pngalt text sau khi di chuyển một số dữ liệu http://i.stack.imgur.com/sMbAD.pngalt text nó trông như thế này, và một lần nữa nếu tôi di chuyển đến đầu nó trông http://i.stack.imgur.com/0KjMa.pngalt text

PS: danh sách của tôi phải theo thứ tự chữ cái

+0

u có thể đăng ảnh chụp màn hình đầu ra của bạn không? –

+0

@Tilsan The Fighter: đã đăng các ảnh chụp nhanh. – Ads

Trả lời

5

Bạn cần phải viết phiên bản riêng của mình là ListView để thực hiện điều đó (điều đó là xấu). Nếu ListView không hoạt động đúng cách, điều đó có thể có nghĩa là bạn đang làm điều gì đó sai.

Phần tử id xuất phát từ đâu? Bạn đang nhận được vị trí trong phương thức getView() của mình, vì vậy bạn không cần phải lo lắng về việc vượt quá giới hạn danh sách. Vị trí có liên quan đến vị trí phần tử trong danh sách của bạn, vì vậy bạn có thể nhận được các yếu tố đúng như thế này:

myElements.get(position); 

Khi dữ liệu trong những thay đổi danh sách của bạn, bạn có thể gọi đây là:

yourAdapter.notifyDataSetChanged() 

Đó sẽ xây dựng lại danh sách của bạn với dữ liệu mới (trong khi vẫn giữ cuộn và nội dung của bạn).

27

Bạn đã thử cái này chưa?

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

    // A ViewHolder keeps references to children views to avoid unneccessary calls    
    // to findViewById() on each row.    
    ViewHolder holder;    
    // When convertView is not null, we can reuse it directly, there is no need    
    // to reinflate it. We only inflate a new View when the convertView supplied    
    // by ListView is null.    

    if (convertView == null) {     

    convertView = mInflater.inflate(R.layout.sample, null); 
    // Creates a ViewHolder and store references to the two children views     
    // we want to bind data to.    
    holder = new ViewHolder();     
    holder.name = (TextView) convertView.findViewById(R.id.text);    
    holder.icon = (ImageView) convertView.findViewById(R.id.icon);     
    convertView.setTag(holder);    
    } else {     
    // Get the ViewHolder back to get fast access to the TextView     
    // and the ImageView. 


    holder = (ViewHolder) convertView.getTag(); 

    }    


    // Bind the data efficiently with the holder. 
    holder.name.setText(myElements.get(id)); 
    holder.icon.setImageBitmap(mIcon1); 

    return convertView; 
    } 

static class ViewHolder {    
    TextView name;    
    ImageView icon;   
} 

Nếu có, có vấn đề gì?

Tôi không nghĩ rằng việc tải tất cả các hàng cùng một lúc là một ý tưởng hay. Bạn sẽ có rất nhiều lượt xem vô ích trong bộ nhớ sẽ làm chậm ứng dụng xuống vì không có gì. Lượt xem và hoạt động trên các chế độ xem (như thổi phồng, findViewById, getChild ..) rất tốn kém, bạn nên cố gắng sử dụng lại chúng càng nhiều càng tốt. Đó là lý do tại sao chúng tôi sử dụng ViewHolders.

+0

có! tôi đã thử. Khi tôi di chuyển đến Element cuối (> 92) nó không thể tải các phần tử trong listview! myElement là một arrayList với sự trợ giúp của id, tôi nhận được mọi phần tử để hiển thị trong dạng xem văn bản. vâng, có vẻ như tôi đang tải tất cả dữ liệu một lần nhưng tôi không biết cách sử dụng lại dữ liệu, bạn có thể vui lòng trợ giúp trong việc này không – Ads

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