2016-11-23 49 views
2

我膨脹另一個佈局,使其出現在我當前佈局的某個視圖下方。scrollTo()for horizo​​ntalScrollView不起作用

這是這樣完成的:

 LayoutInflater vi = (LayoutInflater) getActivity().getApplicationContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View rootView = vi.inflate(R.layout.horizontal_scroll_view, null); 

    horizontalScrollView = (HorizontalScrollView) rootView.findViewById(R.id.hsv_suggestions_scroll_view); 
    LinearLayout suggestionsContainer = (LinearLayout) horizontalScrollView.findViewById(R.id.ll_suggestions_container); 

,我可以證實它,因爲我一段時間後在其中加入一些看法,他們都出現出現在正確的地方。

我膨脹的佈局是:

<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/hsv_suggestions_scroll_view" 
android:scrollbars="none" android:layout_gravity="center_horizontal" 
android:paddingTop="16dp" android:fillViewport="true" 
android:layout_width="match_parent" android:layout_height="wrap_content"> 

    <LinearLayout 
     android:id="@+id/ll_suggestions_container" 
     android:gravity="center_horizontal" android:orientation="horizontal" 
     android:layout_width="wrap_content" android:layout_height="wrap_content"> 

</LinearLayout> 

只是一個帶有LinearLayout作爲一個孩子HorizontalScrollView。 我後來添加的視圖都是TextView s。

現在,在用戶操作(在editText上編寫一些文本)後,我正在嘗試滾動到該視圖並將其突出顯示。突出作品。不起作用的是滾動。

我曾嘗試:

horizontalScrollView.postDelayed(new Runnable() { 
    @Override 
    public void run() { 

    horizontalScrollView.smoothScrollTo(scrollTo, 0); 
    } 
}, 300); 

其中變量scrollTo是我所得到的,當我申請getLeft()到視圖我想滾動到。我可以證實它具有各種價值。

任何人都可以幫助我嗎?

+0

我只是把這種情況扔在一起,它對我來說工作得很好。你有沒有嘗試在你的'smoothScrollTo()'中放入一個隨機數來查看它會滾動任何東西? – LukeWaggoner

+0

@idratherbeintheair是我試着添加一些隨機數字,但沒有幫助 – Mes

+0

因此,它使用隨機數字時不滾動? – LukeWaggoner

回答

1

切換到使用帶有方向設置爲水平的LinearLayoutManager的RecyclerView。就像這樣:

scroll_view.xml

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/scrollView" 
    android:scrollbars="none" 
    android:layout_gravity="center_horizontal" 
    android:paddingTop="16dp" 
    android:fillViewport="true" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:layoutManager="android.support.v7.widget.LinearLayoutManager" 
    android:orientation="horizontal"> 
    <LinearLayout 
     android:id="@+id/scrollContainer" 
     android:gravity="center_horizontal" 
     android:orientation="horizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</android.support.v7.widget.RecyclerView> 

注:的layoutManager標籤在這裏需要佈局膨脹。在它膨脹之後,我們也會以編程方式設置它,否則我們會得到一個異常,因爲RecyclerView在它完成之前基本上將它處理掉了。

OptionAdapter.java

public class OptionAdapter extends RecyclerView.Adapter<OptionAdapter.OptionHolder> { 

    private Context context; 
    private LayoutInflater inflater; 

    private ArrayList<String> options; 

    public OptionAdapter(Context context) { 
     this.context = context; 
     this.inflater = LayoutInflater.from(context); 

     options = new ArrayList<>(); 
    } 

    @Override 
    public OptionHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new OptionHolder(inflater.inflate(R.layout.textview, parent, false)); 
    } 

    @Override 
    public void onBindViewHolder(OptionHolder holder, int position) { 
     String option = options.get(position); 

     ((TextView) holder.itemView).setText(option); 
    } 

    @Override 
    public int getItemCount() { 
     return options != null ? options.size() : 0; 
    } 

    public ArrayList<String> getOptions() { 
     return options; 
    } 

    public void addOption(String option, Integer index) { 
     if (index != null && index <= options.size()) { 
      options.add(index, option); 
     } else { 
      options.add(option); 
     } 

     notifyDataSetChanged(); 
    } 

    public class OptionHolder extends RecyclerView.ViewHolder { 

     public OptionHolder(View itemView) { 
      super(itemView); 
     } 
    } 
} 

text_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_marginLeft="8dp" 
    android:layout_marginRight="8dp" 
    android:orientation="vertical" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" /> 

設置了一切

final LayoutInflater inflater = LayoutInflater.from(this); 
final RecyclerView scrollView = (RecyclerView) inflater.inflate(R.layout.scroll_view, container, false); 
scrollView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); 

final OptionAdapter adapter = new OptionAdapter(this); 
scrollView.setAdapter(adapter); 

container這裏是任何視圖將持有RecyclerView。在我的代碼中,我使用了LinearLayout

添加視圖到列表

adapter.addOption("The Added One", null);

或者,如果你想將其添加到列表中的特定位置。

adapter.addOption("The Added One", position);

滾動到列表中的

scrollView.smoothScrollToPosition(adapter.getOptions().indexOf("ItemText"));

的特定位置

scrollView.smoothScrollToPosition(position);

滾動到一個特定的項目

希望它適合你!

+0

按預期工作!非常感謝 !認爲這是'horizo​​ntalScrollView'的通貨膨脹問題,但'RecyclerView'對於這些情況也是很好的。 – Mes

0

而不是smoothScrollTo(),請嘗試使用scrollTo()。
確保你的getLeft()真的返回值> 0;

+0

'smoothScrollTo()'正在爲我工​​作,它提供了一個更流暢的用戶體驗。 – LukeWaggoner

+0

我試過'smoothScrollTo()'和'scrollTo()'。我可以確認getLeft()給我賦值> 0 – Mes

+0

使用調試器並檢查它是否進入可運行。當調試器通過smoothScrollTo()函數時,請參閱logcat。 –

相關問題