Проблемы с адаптером Listview - PullRequest
0 голосов
/ 02 марта 2012

У меня есть приложение, которое использует Listview для отображения лекций. Лекции имеют цветовую кодировку в соответствии с их типом. Я использовал специальный адаптер для управления разными цветами каждой лекции. Я вызываю адаптер, используя код ниже -

    cursor = myDbHelper.getReadableDatabase().rawQuery(sql, null);       
    startManagingCursor(cursor);
    adapter = new Lectures_Adapter(this,R.layout.menu_item,cursor,FROM,TO);        
    menuList.setAdapter(adapter);

Это все работает нормально, пока я не переупорядочу Лекции, скажем, по Местоположению. Код, который я использую -

    Cursor newCursor = myDbHelper.getReadableDatabase().rawQuery(sqlStr, null);
    adapter.changeCursor(newCursor);

Код в моем пользовательском адаптере (Lectures_Adapter) приведен ниже, но не вызывается при переупорядочении лекций.

     public class Lectures_Adapter extends SimpleCursorAdapter {
         private Context appContext;
         private int layout;
         private Cursor mycursor;

         public Lectures_Adapter(Context context, int layout, Cursor c, String[] from,int[] to) {
              super(context, layout, c, from, to);
              this.appContext=context;
              this.layout=layout;
              this.mycursor=c;               
         }

         @Override
         public View getView(int position, View convertView, ViewGroup parent)     
         {   
              View view = super.getView(position, convertView, parent);   
              try {             
                 if (position > 0)
                 {               
                    RelativeLayout rowFill = (RelativeLayout) convertView.findViewById(R.id.rowFill);
                    String title = mycursor.getString(1);                
                    int myColor = 0;
                    int myPos = title.indexOf("Nursing");
                    int myPos2 = title.indexOf("Masterclass");
                    if (myPos >= 0)
                    {
                        myColor = Color.parseColor("#99FF66");
                    }
                    else if (myPos2  >= 0)
                    {
                        myColor = Color.parseColor("#FF99FF");
                    }
                    else
                    {
                        myColor = Color.parseColor("#FFFF66");
                    }
                    convertView.findViewById(R.id.rowFill).setBackgroundColor(myColor);                 
                  }         
               }catch(Exception e) {

               }

              if (convertView == null) {
                  LayoutInflater inflator = (LayoutInflater) this.appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                  convertView = inflator.inflate(this.layout,null);
              } else {
                  convertView = (View) convertView;
              }
              return view;  
          }

       }

Может кто-нибудь сказать мне, как я могу динамически переупорядочить свой Listview и каждый раз называть меня специальным адаптером.

Ответы [ 3 ]

1 голос
/ 02 марта 2012

Проблема в том, что ваш код в getView () получает свои данные из переменной класса mycursor, но когда вы вызываете changeCursor, переменная mycursor не обновляется, поэтому вы по-прежнему видите исходный список.Вместо того, чтобы использовать mycursor, вы должны вместо этого вызвать getCursor().

0 голосов
/ 02 марта 2012

Вместо использования getView вы можете вместо этого использовать методы newView и bindView ... вот пример из некоторого кода, который я написал.

private static class ViewHolder {
    HistoryRowView rowvw;
}

class ReportHistoryAdapter extends CursorAdapter {
    ViewHolder _holder;

    private static final String INFLATER_SVC = Context.LAYOUT_INFLATER_SERVICE;
    private LayoutInflater _inflater;

    public PostureReportAdapter( Context context, Cursor cursor ) {
        super( context, cursor );
        _inflater = (LayoutInflater) context.getSystemService(INFLATER_SVC);

    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View vw = _inflater.inflate( R.layout.reports_history_view, null );
        _holder = new ViewHolder();
        _holder.rowvw = (HistoryRowView)vw.findViewById( R.id.rhv_history_row_vw );
        vw.setTag( _holder );
        return vw;
    }

    @Override
    public void bindView(View vw, Context context, Cursor cursor) {
        _holder = (ViewHolder)vw.getTag();

        int poor = cursor.getInt( 0 );
        int fair = cursor.getInt( 1 );
        int good = cursor.getInt( 2 );
        int date = cursor.getInt( 3 );

        _holder.rowvw.setData( poor, fair, good, date );
    }
}
0 голосов
/ 02 марта 2012

Вы пробовали вызывать adapter.notifyDataSetChanged () после вызова changeCursor? Это должно заставить ваш menuList быть обновленным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...