10 нояб. 2010 г., 15:41 от Ads

Как реализовать держатель вида?

Я использую видоискатель для отображения из динамического массиваadapter.it работает, но отображаемые данные изменяются нерегулярно, когда я прокручиваю Список.я хочу, чтобы мой список был заполнен только один раз, а не все время, когда я прокручиваю свой список. Любое предложение? Вот мой код

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

когда список загружен, это выглядит так:http://i.stack.imgur.com/NrGhR.png  после прокрутки некоторых данныхhttp://i.stack.imgur.com/sMbAD.png  это выглядит так, и снова, если я прокручиваю в начало, это выглядитhttp://i.stack.imgur.com/0KjMa.png

П.С .: мой список должен быть в алфавитном порядке

Ответы на вопрос (0)

10 нояб. 2010 г., 15:31 от 16.7k

ListView сделать это (что плохо). ЕслиListView не работает должным образом, это, вероятно, означает, что вы делаете что-то не так.

Гдеid элемент пришел? Вы получаете позицию в своемgetView() метод, так что вам не нужно беспокоиться о превышении границ списка. Позиция связана с позицией элемента в вашем списке, поэтому вы можете получить правильный элемент, например так:

myElements.get(position);

Когда данные в вашем списке меняются, вы можете вызвать это:

yourAdapter.notifyDataSetChanged()

Это восстановит ваш список с новыми данными (сохраняя при этом прокрутку и прочее).

10 нояб. 2010 г., 15:25 от nbarraille

Вы пробовали это?

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

Если да, что с ним не так?

Я не думаю, что загрузка всех строк одновременно - это хорошая идея. В результате у вас будет много бесполезных представлений в памяти, которые будут тормозить работу приложения ни за что. Представления и операции над представлениями (такие как inflate, findViewById, getChild ..) дороги, вы должны стараться использовать их как можно чаще. Вот почему мы используем ViewHolders.

ВАШ ОТВЕТ НА ВОПРОС