5

Chcę utworzyć bardzo prosty, niestandardowy adapter kursora kursora, aby ułatwić zmianę kolorów pozycji wiersza po kliknięciu. Korzystanie poniższy kodTworzenie niestandardowego adaptera prostego kursora

private static int save = -1; 

public void onListItemClick(ListView parent, View v, int position, long id) { 

    parent.getChildAt(position).setBackgroundColor(Color.BLUE); 

    if (save != -1 && save != position){ 
     parent.getChildAt(save).setBackgroundColor(Color.BLACK); 
    } 

    save = position;     

} 

mam kod z tego wątku https://stackoverflow.com/a/7649880/498449

bym użył prostego adaptera kursora i umieszcza kod w onClick, ale dlatego, że domyślna lista w ListFragment ponownie wykorzystuje widoki, podczas przewijania wiele widoków jest podświetlonych. Podczas rozmowy na IRC zasugerowano, że utworzę niestandardowy adapter kursora. Nie mogę jednak znaleźć najlepszej praktyki, jak to zrobić i gdzie pasowałby powyższy fragment kodu. Może bardzo docenić pomoc.

public class AreaCursorAdapter extends CursorAdapter { 
    private Context context; 


    public AreaCursorAdapter(Context context, Cursor c) { 
     super(context, c); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
public void bindView(View view, Context context, Cursor cursor) { 
    TextView list_item = (TextView)view.findViewById(android.R.id.text1); 
    list_item.setText(cursor.getString(cursor.getColumnIndex(INDICATOR_NAME))); 

} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    LayoutInflater inflater = LayoutInflater.from(context); 
    View v = inflater.inflate(android.R.layout.simple_list_item_1, parent, false); 
    bindView(v, context, cursor); 
    return v; 
} 

} 

Zaktualizowałem adapter kursora za pomocą kodu, który znalazłem online. Mam jednak dwa problemy. 1. Używam programu ładującego kursor, więc nie mam obiektu "kursora" do przekazania do konstruktora. 2. Otrzymuję ostrzeżenie od Eclipse, że konstruktor został wycofany.

+0

w NewView utworzyć widok z LayoutInflater.inflate w Bindview ustawienia treści i tła w zależności od wyboru int, w onclick ty jsut zmień zaznaczenie int i powiedz adapterowi, że nastąpiła zmiana w jego treści. – zapl

+0

@zapl możesz pokazać fragment kodu. Ponadto implementuję to za pomocą programu ładującego kursor, więc nie mam obiektu "kursora" do przekazania do konstruktora. –

+0

W tej chwili nie mam fragmentu kodu :(prawdopodobnie google.) Z ładowarkami wykonaj 'adapter.swapCursor()' w 'onLoadFinished'. – zapl

Odpowiedz

18

Powinieneś być w stanie zrobić to o tym tak:

class YourListFragment extends ListFragmentOrSomethingElse { 
    private AreaCursorAdapter mAdapter; 

    @Override  
    public void onCreate() { 
     mAdapter = new AreaCursorAdapter(this, null); 
     setListAdapter(mAdapter); 
    } 

    @Override 
    public void onListItemClick(ListView parent, View v, int position, long id) { 
     mAdapter.setSelectedPosition(position); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
     mAdapter.swapCursor(cursor); 
     // should reset that here maybe 
     mAdapter.setSelectedPosition(-1); 
    } 
} 

public class AreaCursorAdapter extends CursorAdapter { 
    private Context context; 
    private int mSelectedPosition; 
    LayoutInflater mInflater; 

    public AreaCursorAdapter(Context context, Cursor c) { 
     // that constructor should be used with loaders. 
     super(context, c, 0); 
     mInflater = LayoutInflater.from(context); 
    } 

    public void setSelectedPosition(int position) { 
     mSelectedPosition = position; 
     // something has changed. 
     notifyDataSetChanged(); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     TextView list_item = (TextView)view.findViewById(android.R.id.text1); 
     list_item.setText(cursor.getString(cursor.getColumnIndex(INDICATOR_NAME))); 
     int position = cursor.getPosition(); // that should be the same position 
     if (mSelectedPosition == position) { 
      view.setBackgroundColor(Color.RED); 
     } else { 
      view.setBackgroundColor(Color.WHITE); 
     } 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View v = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false); 
     // edit: no need to call bindView here. That's done automatically 
     return v; 
    } 

} 
+0

Jesteś ratownikiem! uzyskać go do pracy z powyższym kodem –

+0

gdzie i kwerendy dostawca w listfragment? – nia

+0

@nia To byłoby przy użyciu 'CursorLoader' .Zapytanie jest wewnątrz' onCreateLoader' (nie zobacz w powyższym kodzie) zobacz http://helpmeco.de/2012/3/using-an-android-cursor-loader-z-contact-provider na przykład – zapl