2009-02-16 4 views
2

Я так смущен, когда мой список с использованием BaseAdapter отключается от экрана, каждая строка больше не поддерживает последовательную позицию. Я не знаю, как объяснить это иначе.Android BaseAdapter: позиция не совсем позиция?

Если мой BA/LV показывает 4 элемента на экране, и я добавляю представление, которое отображает TextView каждой строки, оно показывает 0,1,2,3 для номеров строк (что является правильным). Но как только я прокручиваю список до нижних 4 пунктов (пункты 5-8), он показывает их как 4,5,0,1 ?? Зачем?? Я так смущен:/Я пытался делать всевозможные вещи (даже некоторые нетрадиционные вещи, но это последнее, что у меня есть, что не работает).

** EDIT ** Я обнаружил, что если я изменю rv = (RowView) convertView; до

rv = new RowView(mContext,(cursor.getString(2)), 
         (cursor.getString(5)), 
         cursor.getString(cursor.getColumnIndex(DBHelper.KEY_IMAGEFILENAME)), 
         cursor.getString(cursor.getColumnIndex(DBHelper.KEY_CITY)),position); 

что он работает, но тогда он не использует код повторно. Поэтому я думаю, что я на правильном пути. Я попробовал некоторые удобные методы, но это не помогло мне слишком много, потому что мне нужно было установить эти значения перед тем, как сработал конструктор. Нужно ли мне создать новый метод и запустить его в конце? Например, метод addRow? Это также заставляет его прокручивать VERY Slow.

  @Override 
       public void onCreate(Bundle bundle) 
       { 
       super.onCreate(bundle); 
       //setContentView(R.layout.findlist); 
       //getListView().setEmptyView(findViewById(R.id.empty)); 
       mDbHelper = new DBHelper(this); 
       mDbHelper.open(); 
       cursor = mDbHelper.fetchAllLocations(); 
       startManagingCursor(cursor); 
       mAdapter = new myListAdapter(this); 
       setListAdapter(mAdapter); 

       } 
    public class myListAdapter extends BaseAdapter { 
      public String testing; 
      public myListAdapter(Context c) { 
       mContext = c; 
       // TODO Auto-generated constructor stub 
      } 

      @Override 
      public int getCount() { 
       // TODO Auto-generated method stub 
       return cursor.getCount(); 
      } 

      @Override 
      public Object getItem(int position) { 
       // TODO Auto-generated method stub 
       return position; 
      } 

      @Override 
      public long getItemId(int position) { 
       // TODO Auto-generated method stub 
       return position; 
      } 

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


       cursor.moveToPosition(position); 
       RowView rv; 


       if (convertView == null) { 
         rv = new RowView(mContext,(cursor.getString(2)), 
           (cursor.getString(5)), 
           cursor.getString(cursor.getColumnIndex(DBHelper.KEY_IMAGEFILENAME)), 
           cursor.getString(cursor.getColumnIndex(DBHelper.KEY_CITY)),position); 
        } else { 
         rv = (RowView) convertView; 
         try { 
       // I KNOW THIS SECTION IS NOT RIGHT, BUT I HAVE BEEN MESSING IN HERE   
         rv.setAddress(cursor.getString(2)); 
         rv.setCity(cursor.getString(5)); 
         rv.setFocusable(true); 
         rv.setClickable(true); } 
         catch (Exception e) { 
          rv = (RowView) convertView; 
          rv.setAddress(cursor.getString(2)); 
          rv.setCity(cursor.getString(5)); 
          rv.setFocusable(true); 
          rv.setClickable(true); 
          Toast mToast; 
          mToast = Toast.makeText(FindList.this, "Error :" + e.toString() , 
            Toast.LENGTH_LONG); 
          mToast.show(); 
         } 
        } 

       return rv; 
      } 

      public void addItems() { 

       //String[] from = new String[] { DBHelper.KEY_BUSINESSNAME, DBHelper.KEY_ADDRESS, DBHelper.KEY_CITY, DBHelper.KEY_GPSLONG, DBHelper.KEY_GPSLAT, DBHelper.KEY_IMAGEFILENAME + ""}; 
       // create array of values of widgits 
       //to = new int[] { R.id.businessname, R.id.address, R.id.city, R.id.gpslong, R.id.gpslat, R.id.preview}; 
       // Now create an array adapter and set it to display using our row from notes_row.xml 


      } 



     } 


private class RowView extends LinearLayout { 
     private TextView mAddress; 
     private TextView mCity; 
     public ImageView mArrow; 
     public ImageView mPicture; 
     public String mPathName; 
     public String mDateTime; 
     public RowView(Context context, String title, String words, String pathName, String city, int position) { 
      super(context); 

      this.setOrientation(HORIZONTAL); 
      this.setVerticalGravity(16); //CENTER_VERTICAL 

      // Here we build the child views in code. They could also have 
      // been specified in an XML file. 

      //DISPLAY DELETE BUTTON 
      Button mButton = new Button(context); 
      mButton.setFocusable(false); 
      mButton.setId(position); 
      mButton.setBackgroundResource(R.drawable.delete3); 
      addView(mButton, new LinearLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

      TextView mTitle; 
      mTitle = new TextView(context); 
      mTitle.setText(Integer.toString(position)); 
      addView(mTitle, new LinearLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

      this.setOrientation(HORIZONTAL);  

      try { 
      Bitmap bm = Bitmap.createScaledBitmap(BitmapFactory.decodeFile(cursor.getString(cursor.getColumnIndex(DBHelper.KEY_IMAGEFILENAME))),100, 100, true); 
       mPicture = new ImageView(context); 
       mPicture.setImageBitmap(bm);  
      } catch (Exception e) { 
       mPicture = new ImageView(context); 
       mPicture.setImageResource(R.drawable.noimage); 
      }  

      addView(mPicture, new LinearLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

      mArrow = new ImageView(context); 
      mArrow.setBackgroundResource(R.drawable.arrowleft3); 
      addView(mArrow, new LinearLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

      currentPosition = position; 
      Button button = (Button)findViewById(position); 
      button.setOnClickListener(mCorkyListener); 

     } 

ответ

2

При использовании convertView вам предоставляется представление, которое ранее использовалось, но которое больше не отображается. Вы должны позаботиться о том, чтобы сбросить ВСЕ его атрибуты со значением текущего элемента. В противном случае все значения, которые вы установили в конструкторе RowView, будут сохраняться со значением, которое вы дали этому представлению при первом его создании.

Чтобы лучше понять ListViews, вы должны понимать, что он использует только ограниченный набор RowViews, просто количество, достаточное для заполнения дисплея, и еще несколько, которые будут заполнены вашими данными перед их отображением ,