如何为 RecyclerView 设置 BaseAdapter?

How to Set BaseAdapter for RecyclerView?

每当我需要实现自定义 ListViewGridView 时。我总是像这样使用 BaseAdapter class:

public class CustomFlowerGridViewAdapter extends BaseAdapter {

private HashMap<String, String> mFlowerFeed = new HashMap<>();

private Context mContext;
static LayoutInflater mFlowerInflater = null;

CustomFlowerGridViewAdapter(Context context, ArrayList<HashMap<String, String>> data) {

    super();
    this.mContext = context;
    MainActivity.flowerArrayFeedList = data;
    mFlowerInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

@Override
public int getCount() {
    return MainActivity.flowerArrayFeedList.size();
}

@Override
public Object getItem(int i) {
    return MainActivity.flowerArrayFeedList.size();
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {

    final ViewHolder holder;

    if(view == null){

        view = mFlowerInflater.inflate(R.layout.flower_grid_row, viewGroup, false);

        holder = new ViewHolder();

        holder.name = (TextView) view.findViewById(R.id.mainGridName);

        view.setTag(holder);
        mFlowerFeed = MainActivity.flowerArrayFeedList.get(i);
        mFlowerImage = MainActivity.flowerArrayImageList.get(i);

    }
    else{
        holder = (ViewHolder) view.getTag();
        mFlowerFeed = MainActivity.flowerArrayFeedList.get(i);
        mFlowerImage = MainActivity.flowerArrayImageList.get(i);

    }

    holder.name.setText(mFlowerFeed.get("name"));

    return view;
}

private class ViewHolder {

    TextView name

 }
}

但是,现在我正在尝试实施 Horizontal ListView。经过一些研究,我发现 "correct" 实现 Horizo​​ntal ListView 的方法是使用 RecyclerView。这就是我 MainActivity

中的内容
CustomFlowerGridViewAdapter customFlowerGridViewAdapter = new CustomFlowerGridViewAdapter(MainActivity.this, flowerArrayFeedList);
    flowersGrid.setAdapter(customFlowerGridViewAdapter);

问题出在我尝试设置适配器时。

如何将 BaseAdapter 设置为 RecyclerView?

您的 CustomFlowerGridViewAdapter 需要扩展 RecyclerView.Adapter。您还需要更改适配器中的一些方法。使用 RecyclerView,作为网格的布局将由 GridLayoutManager 控制,您可以在适配器外部进行设置。

你不知道。 RecylerViews 接受另一种适配器,不同于 ListView 中的适配器。带有字符串列表的适配器的简单示例:

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

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;
        public ViewHolder(TextView v) {
            super(v);
            mTextView = v;
        }
    }

   public MyAdapter(String[] myDataset) {
        mDataset = myDataset;
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        TextView v = (TextView) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.my_text_view, parent, false);
        ...
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }


    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTextView.setText(mDataset[position]);

    }


    @Override
    public int getItemCount() {
        return mDataset.length;
    }
}

这个可以在 docs 中找到。因此,您需要实现一个 ViewHolder class,您的适配器将使用它。您的适配器需要扩展 RecyclerView.Adapter.

要将列表设置为水平,您需要在回收站视图中设置水平 属性 设置的 LinearLayourManager。

LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);
MyAdapter adapter = new MyAdapter(dataset);
recyclerView.setAdapter(adapter);

我找到了一个非常简单的解决方案。无需处理 RecyclerViews

Rotate-Layout-Wrapper

然后,在包装内,将角度指定为 90。

com.github.rongi.rotate_layout.layout.RotateLayout
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/mainFlowersGridL"
            android:layout_below="@+id/mainFlowersHeading"
            android:layout_width="match_parent"
            android:layout_height="170dp"
            app:angle="90"> <!-- Specify rotate angle here -->

            <GridView
                android:id="@+id/mainFlowersGrid"
                android:layout_below="@+id/mainFlowersHeading"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

            </GridView>
        </com.github.rongi.rotate_layout.layout.RotateLayout>

然后,在您的自定义元素 xml 文件中。将布局指定为 -90。

像这样?

class RVAdapterWrapper(var orgAdapter: BaseAdapter) : Adapter<RVAdapterWrapper.RVWrapperVH>() {
    
        private var parent: ViewGroup? = null
    
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RVWrapperVH {
            this.parent = parent
            val view = orgAdapter.getView(0, null, parent);
            return RVWrapperVH(view)
        }
    
        override fun onBindViewHolder(holder: RVWrapperVH, position: Int) {
            orgAdapter.getView(position, holder.itemView, parent)
        }
    
        override fun getItemCount(): Int {
            return orgAdapter.count
        }
        
        class RVWrapperVH(var view: View) : RecyclerView.ViewHolder(view)
    }