LinearLayout в RecyclerView не прокручивается - PullRequest
0 голосов
/ 12 июля 2020

Вот что я пытаюсь сделать: Каков самый простой способ создания строк, которые прокручиваются вместе и состоят из интерактивных представлений переменного размера с одинаковой высотой на Android

Обычно создавайте столбцы переменной ширины, которые имеют одинаковую ширину в каждой строке. Также нужно добавлять, удалять и добавлять слушателей. Кажется, это довольно простая задача, но я обнаружил, что библиотеку Android GUI намного сложнее понять, чем Java и GUI библиотеку WPF.

Вот мой RecyclerView:

public class MainActivity extends AppCompatActivity {

    private RecyclerView ampRecyclerView;
    private RecyclerView.Adapter ampAdapter;
    private RecyclerView.LayoutManager ampLayoutManager;

    List<FunctionView> myDataset = new ArrayList<FunctionView>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setUpRecyclerView();
    }

    private void setUpRecyclerView() {
        LinearLayout linearLayout = findViewById(R.id.main_ll);
        linearLayout.setWillNotDraw(false);

        ampRecyclerView = (RecyclerView) findViewById(R.id.AmpRecyclerView);

        // use a linear layout manager
        ampLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);

        ampRecyclerView.setLayoutManager(ampLayoutManager);

        myDataset.add(new FunctionView(this));
        myDataset.add(new FunctionView(this));
        myDataset.add(new FunctionView(this));

        // specify an adapter
        ampAdapter = new MainActivityAdapter(myDataset, 1);
        ampRecyclerView.setAdapter(ampAdapter);

    }
}

Мой адаптер

class MainActivityAdapter extends RecyclerView.Adapter<MainActivityAdapter.FunctionViewHolder> {

    private List<FunctionView> views = new ArrayList<FunctionView>();

    private List<LinearLayout> llViews = new ArrayList<>();

    private int rows;


    // Provide a reference to the views for each data item
    // Complex data items may need more than one view per item, and
    // you provide access to all the views for a data item in a view holder
    public static class FunctionViewHolder extends RecyclerView.ViewHolder {

        // each data item is just a string in this case
        public LinearLayout linearLayout;

        public FunctionViewHolder(LinearLayout v) {
            super(v);
            linearLayout = v;
        }
    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public MainActivityAdapter(List<FunctionView> myDataset, int rows) {
        views = myDataset;
        this.rows = rows;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public MainActivityAdapter.FunctionViewHolder onCreateViewHolder(ViewGroup parent,
                                                                     int viewType) {
            LinearLayout linearLayout = (LinearLayout) LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.function_holder, parent, false);
            llViews.add(linearLayout);
        MainActivityAdapter.FunctionViewHolder vh = new MainActivityAdapter.FunctionViewHolder(linearLayout);
        return vh;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(MainActivityAdapter.FunctionViewHolder holder, int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        int width = 0;
        for(FunctionView fv : views){
            holder.linearLayout.addView(fv);
            width += fv.getWidth();
        }

        holder.linearLayout.setMinimumWidth(width);
        //TODO set the data
        // holder.functionView = views.get(position);
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return rows;
    }

Знаю есть вопиющий дизайн fl aws. Сначала я пытаюсь заставить работать прокрутку, потому что каждый макет, который я пробую, не работает так, как мне хотелось бы.

Вот макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_ll"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
      android:id="@+id/AmpRecyclerView"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

и держатель:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:isScrollContainer="true"
    android:nestedScrollingEnabled="true"
    >

</LinearLayout>

1 Ответ

0 голосов
/ 12 июля 2020

как вы сказали, есть явный дизайн fl aws, но вам нужно изменить android:layout_height на wrap_content и android:layout_width на match_Parent. если высота вашего элемента match_parent, тогда высота вашего внутреннего макета становится recyclerview's, тогда нет места для других элементов, поэтому прокрутки не будет. также введите что-то вроде textView, чтобы видеть элементы.

еще одно примечание, имя должно быть item, а не holder. holder связано с ViewHolder, что совершенно другое. вы можете назвать его в соответствии с вашей деятельностью, например, если ваше имя действия MainActivity, поэтому ваш макет активности activity_main, тогда вы можете вызвать внутренние макеты item_main

Я рекомендую посмотреть учебник на YouTube или прочитайте статью с носителя или где угодно (вы можете просто погуглить android пример recyclerview), чтобы изучить основы.

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >

    <TextView
        android:id="@+id/txt_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="SAMPLE"
        android:layout_marginStart="5dp"
        android:layout_marginEnd="5dp"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:textSize="30sp"
        />

</LinearLayout>
...