首页 > 解决方案 > 如何为 RecyclerView 设置 BaseAdapter?

问题描述

每当我需要实现自定义ListViewGridView. 我总是使用这样的BaseAdapter类:

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. 在做了一些研究之后,我发现实现水平 ListView 的“正确”方法是使用RecyclerView. 这就是我的MainActivity

CustomFlowerGridViewAdapter customFlowerGridViewAdapter = new CustomFlowerGridViewAdapter(MainActivity.this, flowerArrayFeedList);
    flowersGrid.setAdapter(customFlowerGridViewAdapter);

问题是当我尝试设置适配器时。

在此处输入图像描述

如何将 BaseAdapter 设置为 RecyclerView?

标签: javaandroidandroid-recyclerviewbaseadapter

解决方案


你没有。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 类,您的适配器将使用该类。您的适配器需要扩展 RecyclerView.Adapter。

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

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

推荐阅读