Android 如何在recyclerview中的viewholder内创建动态项目行?

Android 如何在recyclerview中的viewholder内创建动态项目行?,android,android-recyclerview,Android,Android Recyclerview,所以我有一个水平滚动视图,里面有recyclerView。 我希望onCreateViewHolder中膨胀的项目行是动态的,而不是静态的xml,因为我不知道会有多少列,我还需要从webservice中设置一些文本,我不知道如何在viewholder的onBind方法中实现这些文本 这是我的适配器 @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup pare

所以我有一个水平滚动视图,里面有recyclerView。 我希望onCreateViewHolder中膨胀的项目行是动态的,而不是静态的xml,因为我不知道会有多少列,我还需要从webservice中设置一些文本,我不知道如何在viewholder的onBind方法中实现这些文本

这是我的适配器

@NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        RecyclerView.ViewHolder holder;
      //  View v = inflater.inflate(R.layout.exec_category_sales_row,parent, false);
        CustomView itemView = new CustomView(parent.getContext());

        itemView.setLayoutParams(new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
        ));
        return new ViewHolder(itemView);


    }
 @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        final ViewHolder viewHolder = (ViewHolder) holder;

        ((ViewHolder) holder).customView.setUser(arylstCategoryWiseSales.get(position));

    }

private class ViewHolder extends RecyclerView.ViewHolder {

private CustomView customView;
        public ViewHolder(View v) {
            super(v);

            customView = (CustomView) v;
        }
我的customview类

public class CustomView extends RelativeLayout {
    private CategoryWiseSalesModel user;
    private TextView textView;

    // override all constructors to ensure custom logic runs in all cases
    public CustomView(Context context) {
        this(context, null);
    }
    public CustomView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public CustomView(
            Context context,
            AttributeSet attrs,
            int defStyleAttr,
            int defStyleRes
    ) {
        super(context, attrs, defStyleAttr, defStyleRes);


        inflate(getContext(), R.layout.custom_layout, this);
        textView =  findViewById(R.id.textView);
    }
//called in onBindViewHolder
    public void setUser(CategoryWiseSalesModel newUser) {
        user = newUser;
        textView.setText(user.getLights());
    }
}
不同的视图类型对我不起作用,因为项目行是完全动态的。 我也想过使用tablelayout,但我在这里有延迟加载逻辑


如何进行此操作?

动态文本视图生成

这是您的示例代码

用于调用和设置适配器的主类代码

public类MainActivity扩展了AppCompatActivity{
回收视图mRecycleview;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List mList=new ArrayList();
mList.add(“你好”);
mList.add(“世界”);
mRecycleview=findViewById(R.id.recycleview);
mRecycleview.setLayoutManager(新的LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false));
PlannerAdapter mPlannerAdapter=新的PlannerAdapter(MainActivity.this,mList,5);//具有上下文、数据列表和文本视图数的构造函数。也就是说,您可以从运行时的数据中获取它
mRecycleview.setAdapter(mPlannerAdapter);
mPlannerAdapter.notifyDataSetChanged();
}
}
下面是生成动态文本视图的适配器代码

公共类PlannerAdapter扩展了RecyclerView.Adapter{ 私人语境; 线性布局主布局; 列出字符串; 列出TVID; int mTextviewCount; public PlannerAdapter(上下文上下文、列表s、int mTexviewQuantity){ this.context=上下文; this.strings=s; this.mTextviewCount=mTexviewQuantity; } @凌驾 public RecycleServiceWholder onCreateViewHolder(视图组视图组,int i){ 视图=布局更平坦。从(上下文)。充气(R.layout.adapterlayout,viewGroup,false); mainlayout=view.findViewById(R.id.mainlayout); tvIds=新的ArrayList(); 对于(int ind=0;ind 这是关于动态文本视图生成完成和示例的问题 代码已附加。我希望它能帮助你,请询问是否有疑问


你想让每一行有不同的布局,因为你不知道每一行的列数吗?不,每一行都有相同的列数,这取决于webservice,这可能会发生变化,例如今天行内有3个textview,第二天行内有5个textview,这取决于服务的数据,正如我所说的..谢谢你的快速回复,您是否尝试过使用编程生成文本视图?我是否需要在OnbindViewHolder中生成这些文本视图?它可能会在scroll上出错??如果我错了,请更正我否,您将在CreateViewHolder上创建文本视图。膨胀XML后,即空白布局。然后,您将生成Textview并将其加载到布局中。可以使用循环将其转换为动态Textview。你想要吗?那会很有帮助的
public class MainActivity extends AppCompatActivity {
        RecyclerView mRecycleview;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            List<String> mList = new ArrayList<>();
            mList.add("Hello");
            mList.add("World");

            mRecycleview = findViewById(R.id.recycleview);


            mRecycleview.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false));
            PlannerAdapter mPlannerAdapter = new PlannerAdapter(MainActivity.this, mList, 5);//Contuctor having context, datalist and number of textviews. i.e you can get it from your data on runtime
            mRecycleview.setAdapter(mPlannerAdapter);
            mPlannerAdapter.notifyDataSetChanged();

        }
    }
    public class PlannerAdapter extends RecyclerView.Adapter<PlannerAdapter.RecyclerViewHolder> {
    private Context context;
    LinearLayout mainlayout;
    List<String> strings;
    List<String> tvIds;
    int mTextviewCount;

    public PlannerAdapter(Context context, List s, int mTexviewQuantity) {
        this.context = context;
        this.strings = s;
        this.mTextviewCount = mTexviewQuantity;
    }


    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.adapterlayout, viewGroup, false);
        mainlayout = view.findViewById(R.id.mainlayout);
        tvIds = new ArrayList<>();

        for (int ind = 0; ind < mTextviewCount; ind++) {
            LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(
                    130, 120);
            TextView tv = new TextView(context);
            tv.setLayoutParams(lparams);
            tv.setText("test");
            tv.setTag("mytv" + ind);
            tvIds.add("mytv" + ind);

            mainlayout.addView(tv);
        }
        RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view);
        return recyclerViewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder recyclerViewHolder, int position) {

        for (int index = 0; index < tvIds.size(); index++) {
            recyclerViewHolder.mTextViewList.get(index).setText(strings.get(position) + "  " + index + "  ");
        }

    }

    @Override
    public int getItemCount() {

        return strings.size();
    }

    class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public android.widget.TextView tvShopName, tvDateTime;
        List<TextView> mTextViewList = new ArrayList<>();


        public RecyclerViewHolder(View itemView) {
            super(itemView);

            for (int ind = 0; ind < tvIds.size(); ind++) {
                TextView mTextView = new TextView(context);
                mTextView = itemView.findViewWithTag(tvIds.get(ind));
                mTextViewList.add(mTextView);
            }
        }

        @Override
        public void onClick(View view) {

        }
    }

}