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