android - 如何在 recyclerview 的 viewholder 中创建动态项目行?

标签 android android-recyclerview

所以我有一个水平 ScrollView ,里面有 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;
        }

我的自定义 View 类

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());
    }
}

不同的 View 类型对我不起作用,因为项目行是完全动态的。 我也考虑过使用 tablelayout,但我在此处使用延迟加载逻辑 onScroll。

如何解决这个问题???

最佳答案

动态 TextView 生成

这是您的示例代码

Main Class code for calling and setting Adapter.

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();

        }
    }

Here is Adapter code to generate Dynamic TextViews

    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) {

        }
    }

}

It is your question about dynamic textView generation done and Sample Code has attached. I hope it will help you, please ask if query

关于android - 如何在 recyclerview 的 viewholder 中创建动态项目行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53006746/

相关文章:

java - 立即加载recyclerView数据(停止延迟加载)

android - MYSQL查询,合并不相关表的记录以进行自动完成

android - 仅单击一个时,RecyclerView 第一个和最后一个项目已更改

android - 具有上一页和下一页边界的 RecyclerView?

java - 如何在 Android Studio 中按顺序使用带手势的 if 语句?

android - 检测 RecyclerView 滚动时何时到达最底部位置

android notifyItemRangeInserted 禁用自动滚动

java - 如何将 aws S3 集成到我的 android 应用程序中?

java - Android - 带按钮的 ProgressDialog 有太多空白

java - 将 SQLite 数据库中的初始列值设置为 0