如何为 RecyclerView 设置 BaseAdapter?
How to Set BaseAdapter for RecyclerView?
每当我需要实现自定义 ListView
或 GridView
时。我总是像这样使用 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" 实现 Horizontal 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
然后,在包装内,将角度指定为 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)
}
每当我需要实现自定义 ListView
或 GridView
时。我总是像这样使用 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" 实现 Horizontal 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
然后,在包装内,将角度指定为 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)
}