【问题标题】:How to implement 2 or more recyIclerview in an activity如何在一个活动中实现 2 个或多个 recyclerview
【发布时间】:2016-01-31 20:59:49
【问题描述】:

如何在一个活动中实现 2 个或多个 recyIclerview ? 我正在尝试在我的活动中实施 2 个或更多 recyclerview

在此代码行中,我声明了第一个适配器

private RecyclerView.Adapter mAdapter;

如何声明我的第二个适配器?

顺便说一句,使用下面的代码运行我的应用程序时,recyclerview 没有正确滚动和显示

主要活动

 private RecyclerView mRecyclerView;
    private RecyclerView mRecyclerView1;

    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    private static String LOG_TAG = "RecyclerViewActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_view);
//first recycler
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        mRecyclerView.setHasFixedSize(true);
       // LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        mLayoutManager = new 

    LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false);
            mRecyclerView.setLayoutManager(mLayoutManager);
            mAdapter = new MyAdapter(getDataSet());
            mRecyclerView.setAdapter(mAdapter);
            RecyclerView.ItemDecoration itemDecoration =
                    new DividerItemDecoration(this, LinearLayoutManager.VERTICAL);
            mRecyclerView.addItemDecoration(itemDecoration);
    //second recycler
            mRecyclerView1 = (RecyclerView) findViewById(R.id.my_recycler_view1);
            mRecyclerView1.setHasFixedSize(true);
             LinearLayoutManager mLayoutManager1 = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
            mRecyclerView1.setLayoutManager(mLayoutManager1);
           // mAdapter1 = new MyAdapter1(getDataSet1());
            mRecyclerView1.setAdapter(mAdapter1);

我的适配器

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private ArrayList<String> mDataset;

    public class ImageViewHolder extends RecyclerView.ViewHolder {
        //ImageView mImage;
        public TextView txtHeader;
        public TextView txtFooter;
        public ImageViewHolder(View itemView) {
            super (itemView);
            txtHeader = (TextView) itemView.findViewById(R.id.firstLine);
            txtFooter = (TextView) itemView.findViewById(R.id.secondLine);
        }
    }



    public void add(int position, String item) {
        mDataset.add(position, item);
        notifyItemInserted(position);
    }

    public void remove(String item) {
        int position = mDataset.indexOf(item);
        mDataset.remove(position);
        notifyItemRemoved(position);
    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public MyAdapter(ArrayList<String> myDataset) {
        mDataset = myDataset;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public RecyclerView.ViewHolder  onCreateViewHolder(ViewGroup parent,
                                                       int viewType) {

            // create a new view
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false);
            // set the view's size, margins, paddings and layout parameters
            ImageViewHolder vh = new ImageViewHolder(v);
            return vh;
        }


    private static final int TYPE_IMAGE = 1;
    private static final int TYPE_GROUP = 2;

    @Override
    public int getItemViewType(int position) {
        // here your custom logic to choose the view type
        return position;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder TextViewHolder, int position) {


                ImageViewHolder viewHolder = (ImageViewHolder) TextViewHolder;
                //  viewHolder.txtHeader.setText(...)
                final String name = mDataset.get(position);
                viewHolder.txtHeader.setText(mDataset.get(position));
                viewHolder.txtFooter.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        remove(name);
                    }
                });

               // viewHolder.txtFooter.setText("Footer: " + mDataset.get(position));

        }


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

}

我的adpater1

公共类 MyAdapter1 扩展 RecyclerView.Adapter { 私有 ArrayList mDataset;

public class ImageViewHolder extends RecyclerView.ViewHolder {
    //ImageView mImage;
    public TextView txtHeader;
    public TextView txtFooter;
    public ImageViewHolder(View itemView) {
        super (itemView);
        txtHeader = (TextView) itemView.findViewById(R.id.firstLine);
        txtFooter = (TextView) itemView.findViewById(R.id.secondLine);
    }
}



public void add(int position, String item) {
    mDataset.add(position, item);
    notifyItemInserted(position);
}

public void remove(String item) {
    int position = mDataset.indexOf(item);
    mDataset.remove(position);
    notifyItemRemoved(position);
}

// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter1(ArrayList<String> myDataset) {
    mDataset = myDataset;
}

// Create new views (invoked by the layout manager)
@Override
public RecyclerView.ViewHolder  onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {

    // create a new view
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout1, parent, false);
    // set the view's size, margins, paddings and layout parameters
    ImageViewHolder vh = new ImageViewHolder(v);
    return vh;
}


private static final int TYPE_IMAGE = 1;
private static final int TYPE_GROUP = 2;

@Override
public int getItemViewType(int position) {
    // here your custom logic to choose the view type
    return position;
}

// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(RecyclerView.ViewHolder TextViewHolder, int position) {


    ImageViewHolder viewHolder = (ImageViewHolder) TextViewHolder;
    //  viewHolder.txtHeader.setText(...)
    final String name = mDataset.get(position);
    viewHolder.txtHeader.setText(mDataset.get(position));
    viewHolder.txtFooter.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            remove(name);
        }
    });

    // viewHolder.txtFooter.setText("Footer: " + mDataset.get(position));

}


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

主活动布局

    <TextView
        android:id="@+id/textView"
        android:layout_width="150dp"
        android:layout_height="30dp"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:layout_alignParentTop="true"
        android:paddingTop="5dp"
        android:text="Recomanded for you"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_recycler_view"
        android:layout_width="400dp"
        android:layout_height="180dp"
        android:layout_below="@id/textView"
        android:scrollbars="vertical" />


    <TextView
        android:id="@+id/textView1"
        android:layout_width="150dp"
        android:layout_height="30dp"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:layout_alignParentTop="true"
        android:paddingTop="5dp"
        android:layout_below="@id/my_recycler_view"
        android:text=" for you"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_recycler_view1"
        android:layout_width="400dp"
        android:layout_height="180dp"
        android:layout_below="@id/textView1"
        android:scrollbars="vertical" />
</RelativeLayout>

【问题讨论】:

  • 我在主要活动中看到了一些注释代码。是否为两个 RecyclerViews 设置相同的适配器实例?
  • 是的,这就是我的问题,看来我正在设置相同的适配器
  • 你的适配器结构是一样的,所以你不需要创建两个不同的类。您只需要创建同一个适配器类的两个不同实例。
  • 你能给我举个例子吗
  • 根据我对您遇到的问题的了解,我用示例代码写了一个答案。

标签: android android-recyclerview


【解决方案1】:

由于适配器中的代码完全相同,因此您无需声明两个不同的类。您可以只使用一个类并从中创建两个不同的实例,将正确的数据集传递给每个实例以在 RecyclerView 中呈现。

希望这会有所帮助:

private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;

private RecyclerView mRecyclerView1;
private RecyclerView.Adapter mAdapter1;

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

    //first recycler
    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(
        new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false));
    mAdapter = new MyAdapter(getDataSet());
    mRecyclerView.setAdapter(mAdapter);

    //second recycler
    mRecyclerView1 = (RecyclerView) findViewById(R.id.my_recycler_view1);
    mRecyclerView1.setHasFixedSize(true);
    mRecyclerView1.setLayoutManager(
        new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL, false));
    mAdapter1 = new MyAdapter(getDataSet1());
    mRecyclerView1.setAdapter(mAdapter1);

    // ...
}

【讨论】:

  • 发生这种情况是因为在您的 mainactivity 中您使用的是 RelativeLayout。尝试使用具有垂直方向的 LinearLayout。
  • 感谢您的支持,您真的帮助了我,错误在布局中的 padingtop,我解决了。
  • 很高兴我能帮上忙 :)
猜你喜欢
  • 2017-02-22
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多