2012-03-02 6 views
0

У меня есть приложение, которое использует Listview для отображения лекций. Лекции имеют цветовую кодировку в соответствии с их типом. Я использовал пользовательский адаптер для управления разными цветами каждой лекции. Я называю адаптер, используя приведенный ниже код -Проблемы с адаптером 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 динамически и позвонить мне пользовательского адаптера каждый раз.

+0

Как вы делаете повторный заказ? Является ли это одним щелчком мыши или? – kosa

+0

У меня есть диалоговое окно, которое дает пользователю возможность 4 способов упорядочивания данных. Как только они сделают свой выбор, я передаю новый запрос в код выше, (sql в курсе = myDbHelper.getReadableDatabase(). RawQuery (sql, null);) – user616076

ответ

1

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

+0

Я изменил код adapter.changeCursor (newCursor); к adapter.getCursor(); но код в getView никогда не используется. Должен ли я сделать что-нибудь еще? – user616076

+0

Вам нужно изменить код в getView func, чтобы вызвать getCursor(), а не заменять вызов на changeCursor – superfell

+0

Спасибо, что отлично работает сейчас. Есть еще одна небольшая проблема. На первой странице только первая строка окрашена, остальные - нет, кроме случаев, когда вы прокручиваете вниз и затем прокручиваете назад, тогда все строки окрашены. Когда я перехожу к использованию отладки, строкам присваивается цвет, но он, похоже, не применяется, когда экран сначала отображается. – user616076

0

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

+0

Спасибо за ответ. Я попытался добавить код, который вы так предположили, - adapter.changeCursor (newCursor); adapter.notifyDataSetChanged(); но хотя он теперь проходит через getView, я получаю сообщение об ошибке «staledataexception - доступ к закрытому курсору» – user616076

0

Вместо использования 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); 
    } 
} 
Смежные вопросы