2012-03-26 5 views
3

Ich habe eine ListView mit 10 Items darin, wenn ich das 4. Einzelteil in der ListView als vorgewähltes dann meine ListView erhält scrollte und 4. Einzelteil in ListView erhält platziert am oberen Rand des Bildschirms.Wie man ausgewähltes Element von ListView einstellt, ohne die Ansicht zu scrollen [Android]

Ich möchte die ListView nicht scrollen, wenn ich setSelected() für das Listenelement aufrufen, das nicht in der Ansicht ist.

Ich habe auch versucht, die ListView programmgesteuert mit scrollTo(0, 0); zu scrollen, aber es funktioniert nicht.

+0

List_View.setSelection (Position); .. verwenden Sie den Standardwert in der Listenansicht. –

+0

Mögliches Duplikat von [Programmatisch gesetzte Position in ListView ohne Scrollen] (http://stackoverflow.com/questions/29374894/programmatics-set-position-in-listview-without-scrolling) – user1806772

Antwort

1

Ich denke, es ist hartcodiert und damit nicht möglich, ohne

+1

gut das saugt große Zeit. – jrharshath

+0

suchen Sie nach http://stackoverflow.com/a/23688815/2835239. Sie können Daten aktualisieren, die Auswahl ändern und nichts wird gescrollt. (eigentlich nicht wirklich Auswahl. Das ist überprüft.) –

0

setSelection() kann von Ihrer Arbeit sein.

+0

Momentan verwende ich setSelection und es scrollt die Listenansicht. – User7723337

-1

Verwenden Sie setSelection(4), um die Auswahl ohne Scrollen festzulegen, wenn die neue Auswahl sichtbar ist.

+0

Momentan verwende ich setSelection und es scrollt die Listenansicht. – User7723337

0

Scrollen NICHT setSelection Verwenden Sie()!

Ich mache das auf andere Weise.

private AdapterView.OnItemClickListener oiclFolders = new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int posi, long id) { 
     // clear original selected item 
     if (mViewOrg!=null) mViewOrg.setBackgroundDrawable(null); 
     if (view!=null) { 
      // define your own drawable to set as background 
      view.setBackgroundResource(R.drawable.item_bg); 
      mViewOrg = view; 
     } 
     curSel = posi; // to store which one is selected 
     // Do NOT setSelection -> will auto scroll to top 
     // mlvFolders.setSelection(posi); 
    } 
}; 
0

Das ist für mich gearbeitet -

  1. Set CHOICE_MODE_SINGLE wenn die benutzerdefinierte Listenansicht der Einrichtung -
  2. Verwendung setSelected() innerhalb OnItemClickListener(), wie unter -

    private void setup_view(View rootView) { 
        listview = (ListView) rootView.findViewById(R.id.list); 
        if(listview != null) { 
         listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
         listview.setAdapter(new MyAdapter(getActivity().getApplicationContext())); 
         listview.setOnItemClickListener(onitemclicklistener); 
        } 
    } 
    
    private OnItemClickListener onitemclicklistener = new OnItemClickListener() { 
        public void onItemClick(AdapterView parent, View v, int position, 
          long id) { 
          v.setSelected(true); 
        } 
    }; 
    
+0

hat nicht für mich funktioniert – user1806772

1

können Sie listview.setChoiceMode (ListView.CHOIC E_MODE_SINGLE); Option mit

mListView.setItemChecked(pos, true); 

Setup einige Selektoren erforderlich sein. Auch für Google Beispiel IOSchedule App --Groß Beispiel über Listenansicht mit mehreren Auswahlsteuerung (haben ein paar Fehler :))

+0

hat nicht für mich funktioniert – user1806772

+0

Dann verwenden Sie wahrscheinlich benutzerdefinierte onClickListener. Haben Sie Google io Beispiel überprüft? es funktioniert gut –

0

Sie können requestChildRectangleOnScreen wie dies außer Kraft setzen des Scrollens loszuwerden:

@Override 
    public boolean requestChildRectangleOnScreen(View child, Rect rectangle, boolean immediate) { 
     return false; 
    } 
1

Ein altes Frage, aber es kann für jemanden nützlich sein. Sie können setSelectionFromTop verwenden. Es ist ziemlich smart, und man kann es zum Beispiel so verwenden:

getListView().setSelectionFromTop(selection, getListView().getHeight()/2); 

Es beginnt erst nach Mitte der Liste zu blättern:

setSelectionFromTop

+0

wird es auch die Liste scrollen, um es in der Ansicht zu machen. – User7723337

+0

Sie müssen mehr Logik hinzufügen, um kein Scrollen zu erreichen – user1806772

0

Hier ist, was ich getan habe:

int top = listView.getChildAt(fixedChildIndex).getTop(); 

//set selected item, keep scroll position 
listView.setSelectionFromTop(newIndex, top); 

Dies hält die ListViews Kind mit Ansicht Index (ListView wiederverwendet Ansichten!) FixedChildIndex an Ort und Stelle.

Zum Beispiel, wenn Sie wollen, dass die Hervorhebung dieses bleiben verwenden:

int first = listView.getFirstVisiblePosition(); 
int fixedChildIndex = listView.getSelectedItemPosition() - first; 
View newSelectedChild = listView.getChildAt(selectedViewIndex); 

Wenn Sie das ausgewählte Element sicher ist vollständig sichtbar Verwendung dieser Linie

//set selected item, keep scroll position and make sure it is completely visible 
listView.setSelectionFromTop(newIndex, Math.min(Math.max(0,top), listView.getHeight()-newSelectedChild.getHeight())); 

Wo newSelectedChild ist die Ansicht machen wollen des Kindes, das Sie auswählen möchten. Sie können es erhalten, indem Sie dies tun:

Verwandte Themen