RockerFlower
RockerFlower

Reputation: 727

How to add RecyclerView to a View

I have a custom view extends RelativeLayout, and I want to add a RecyclerView in it. But the recyclerView can't be shown.

How to solve it? Thanks!

The code:

LineChart.java

public class LineChart extends RelativeLayout {

    RecyclerView mRecyclerView;


    public LineChart(Context context) {
        super(context);
        init(context, null);
    }


    public LineChart(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }


    public LineChart(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }


    protected void init(Context context, @Nullable AttributeSet attrs) {
        setWillNotDraw(false);
        initInside();
    }


    protected void initInside() {
        View v = inflate(getContext(), R.layout.line_chart_recyclerview, null);

        LineChart.LayoutParams params = new LineChart.LayoutParams(
            getWidth() / 2, getHeight());
        params.addRule(LineChart.ALIGN_PARENT_RIGHT);
        addView(v, params);

        mRecyclerView = (RecyclerView) findViewById(R.id.lineChartRecyclerView);

        List<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");
        list.add("~~~");
        LineChartAdapter lineChartAdapter = new LineChartAdapter(getContext(),
            list);

        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        mRecyclerView.setAdapter(lineChartAdapter);
    }


    @Override protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }
}

LineChartAdapter.java

public class LineChartAdapter
    extends RecyclerView.Adapter<LineChartViewHolder> {

    private List<String> mList;
    private Context mContext;


    public LineChartAdapter(Context context, List<String> list) {
        this.mContext = context;
        this.mList = list;
    }


    @Override
    public LineChartViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(mContext)
                                  .inflate(R.layout.item_line_chart, parent,
                                          false);
        return new LineChartViewHolder(itemView);
    }


    @Override
    public void onBindViewHolder(LineChartViewHolder holder, int position) {
        holder.mTextView.setText(String.valueOf(position));
    }


    @Override public int getItemCount() {
        return mList == null ? 0 : mList.size();
    }
}

LineChartViewHolder.java

public class LineChartViewHolder extends RecyclerView.ViewHolder {

    protected TextView mTextView;


    public LineChartViewHolder(View itemView) {
        super(itemView);
        mTextView = (TextView) itemView.findViewById(
            R.id.text1024);
    }
}

Upvotes: 3

Views: 109

Answers (1)

Konstantin Loginov
Konstantin Loginov

Reputation: 16000

I think, I know the reason.

    View v = inflate(getContext(), R.layout.line_chart_recyclerview, null);

    LineChart.LayoutParams params = new LineChart.LayoutParams(
        getWidth() / 2, getHeight());
    params.addRule(LineChart.ALIGN_PARENT_RIGHT);
    addView(v, params);

Here, getWidth() and getHeigth() are still 0. So your view will have (0;0) size To fix this, I'd suggest to replace this part with

    LayoutInflater.from(context).inflate(R.layout.line_chart_recyclerview, this);

Let me know, if it helps.

Upvotes: 1

Related Questions