gpt4 book ai didi

java - 在 RecyclerView 中膨胀两种类型的 .XML

转载 作者:行者123 更新时间:2023-12-01 21:19:13 24 4
gpt4 key购买 nike

由于我遇到的这个问题,我感到非常沮丧:如何为 RecyclerView 中的不同对象膨胀不同的 .XML 文件?我已经尽力了,比如制作一个ListItemType对象:

public class ListItemType {
public static int NOTE_VIEW = 0;
public static int CATEGORY_VIEW = 1;
}

还有一个 ListViewItem 对象:

public class ListViewItem {
private int mType;
private Object mObject;

public ListViewItem(int type, Object object) {
mType = type;
mObject = object;
}

public int getType() {
return mType;
}

public void setType(int type) {
mType = type;
}

public Object getObject() {
return mObject;
}

public void setObject(Object object) {
mObject = object;
}
}

我不知道我该去哪里。

最佳答案

RecyclerView实现

首先,您必须添加/创建您的 Model类型指示您的 Model输入并了解要膨胀的布局:

MyModel.java

public class MyModel {
public enum ModelTypes {
TYPE_1,
TYPE_2
}
// your model members ^^^

ModelTypes type;
}

现在您必须创建您的 ViewHolder ,我建议创建一个父ViewHolder类并使用子类扩展模型类型。

MyHolder.java

public class MyHolder extends RecyclerView.ViewHolder {

// must have the ViewHolder default constructor
public MyHolder(View itemView) {
super(itemView);
}

public static MyHolder inflateViewByType(MyModel.ModelTypes type,
LayoutInflater layoutInflater, ViewGroup parent) {
View view;
switch (type) {
case TYPE_1:
view = layoutInflater.inflate(R.layout.layout_type_1, parent, false);
return new MyHolderType1(view);
break;
case TYPE_2:
view = layoutInflater.inflate(R.layout.layout_type_2, parent, false);
return new MyHolderType2(view);
break;
}
// Model type not supported
return null;
}
}

创建您的ViewHolder类型,在我的示例中我只有两种类型。

MyHolderType1.java

public class MyHolderType1 extends MyHolder {

// layout members

public MyHolderType1(View itemView) {
super(itemView);
// init your layout members by for layout_type_1 by itemView.findViewById(...)
}
}

MyHolderType2.java

public class MyHolderType2 extends MyHolder {

// layout members

public MyHolderType2(View itemView) {
super(itemView);
// init your layout members by for layout_type_2 by itemView.findViewById(...)
}
}

到目前为止,您只创建了 ViewHolder类型来实现RecyclerViewRecyclerView必须有 Adapter扩展了默认的 RecyclerView.Adapter ,为此我们必须创建一个新类并扩展 RecyclerView.Adapter与我们的ViewHolder .

MyRecyclerViewAdapter.java

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyHolder> {

private List<MyModel> mData;

public MyRecyclerViewAdapter(@NonNull List<MyModel> data) {
mData = data;
}

@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
MyModel.ModelTypes type = MyModel.ModelTypes.values()[viewType];
return MyHolder.inflateViewByType(type, layoutInflater, parent);
}

@Override
public void onBindViewHolder(MyHolder holder, int position) {

MyModel model = mData.get(position);
switch (model.type) {
case TYPE_1:
setupViewType1((MyHolderType1) holder, model);
break;
case TYPE_2:
setupViewType2((MyHolderType2) holder, model);
break;
}
}

// to update the adapter data without reinitialize it
public void updateData(@NonNull List<MyModel> newData) {
mData = newData;
notifyDataSetChanged();
}

private void setupViewType1(MyHolderType1 holder, MyModel model) {

// do what you want with your views in layout_type_1
}

private void setupViewType2(MyHolderType2 holder, MyModel model) {

// do what you want with your views in layout_type_2
}

@Override
public int getItemCount() {
return mData.size();
}

@Override
public int getItemViewType(int position) {
return mData.get(position).type.ordinal();
}
}

继续,我们快完成了。现在我们必须初始化RecyclerView在我们的 Activity 中,并设置 MyRecyclerViewAdapter 的实例到它。对此我们已经找出RecyclerView通过调用 findViewById(...) 和 xml ,然后设置LayoutManagerRecyclerView ,毕竟我们用我们的数据设置了适配器。

MyActivity.java

public class MyActivity extends Activity{

// ....

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);


// init your views
RecyclerView recyclerView = findViewById(R.id.recycler_view);


// here you can pull or generate your recycler view list data
List<MyModel> data = getData();
MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(data);


// set layout manager to the recycler view (Required)
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,
LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(linearLayoutManager);

// set the adapter to the recycler view (Required)
recyclerView.setAdapter(adapter);
}

// ....
}

关于java - 在 RecyclerView 中膨胀两种类型的 .XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39431047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com