Java Android使用适配器将两个不同类型的ArrayList显示为一个无缝列表视图
我有一个基类的自定义Java Android使用适配器将两个不同类型的ArrayList显示为一个无缝列表视图,java,android,android-listview,android-arrayadapter,android-adapter,Java,Android,Android Listview,Android Arrayadapter,Android Adapter,我有一个基类的自定义ArrayAdapter。我还有一个子类,我希望ArrayAdapter能够接收两种不同类型的数据,即(arrayList和arrayList),并在一个无缝列表视图中连续显示它们 我以前从未这样做过,因此非常感谢一般性意见和指导方针。我试图使ArrayAdapter通用: public class MyAdapter<T extends BaseClass> extends ArrayAdapter<T> 公共类MyAdapter扩展了ArrayA
ArrayAdapter
。我还有一个子类,我希望ArrayAdapter
能够接收两种不同类型的数据,即(arrayList和arrayList),并在一个无缝列表视图中连续显示它们
我以前从未这样做过,因此非常感谢一般性意见和指导方针。我试图使ArrayAdapter通用:
public class MyAdapter<T extends BaseClass> extends ArrayAdapter<T>
公共类MyAdapter扩展了ArrayAdapter
使用此构造函数:
public MyAdapter(Context context, ArrayList<T> items) {
super(context, 0, items);
fullList = items;
}
公共MyAdapter(上下文、ArrayList项){
超级(上下文,0,项);
完整列表=项目;
}
但我不知道如何传递一个可以具有类型子类或基类的泛型ArrayList。(这种方法稍后将涉及使用instanceOf的代码,这不是做事情的最佳方式……正如我从中了解到的)
我想扩展这个定制的arrayadapter
本身,而不是泛型。但我不确定这将如何运作
最好的方法是什么?除了arrayadapter
之外,是否还有更适合这种情况的适配器。或者,recyclerview
有解决这个问题的方法吗
我最终希望有两个相似但不同类型的数据集(一个是另一个子类),作为一个无缝的listview输出。我找不到执行此操作的一般方法。您在ArrayList中使用的数据类型是什么 例如,如果是字符串和整数,您能否将这些值转换并合并到单个ArrayList中
for (int i=0; i<arraylist1.size(); i++) { //arraylist1 containing integers
arraylist2.add(Integer.toString(arraylist1.get(i));
}
for(int i=0;i可以使用视图类型解决此问题
例如:
row_type_one.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/txtTypeOne"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
YourTypeTow.java
public class YourTypeTow {
public String title;
public String imgUrl;
}
YourAdapter.java
public class YourAdapter extends RecyclerView.Adapter<YourAdapter.YourViewHolder> {
ArrayList<Object> objects = new ArrayList<>();
public YourAdapter(ArrayList<YourTypeOne> typeOneArray, ArrayList<YourTypeTow> typeTowArray) {
objects.addAll(typeOneArray);
objects.addAll(typeTowArray);
}
@Override
public int getItemViewType(int position) {
return objects.get(position) instanceof YourTypeOne ? 1 : 2;
}
@NonNull
@Override
public YourViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v;
if (viewType == 1) {
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.row_type_one, parent, false);
} else {
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.row_type_two, parent, false);
}
return new YourViewHolder(v,viewType);
}
@Override
public void onBindViewHolder(@NonNull YourViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return objects.size();
}
class YourViewHolder extends RecyclerView.ViewHolder {
private TextView txtTypeOne;
private TextView txtDescription;
private ImageView logo;
public YourViewHolder(@NonNull View itemView, int vewType) {
super(itemView);
if (vewType==1){
//find views by ides in .xml
txtTypeOne = itemView.findViewById(R.id.txtTypeOne);
}else {
//find views by ides in row_type_two.xml
txtDescription = itemView.findViewById(R.id.txtDescription);
logo = itemView.findViewById(R.id.logo);
}
}
public void bindeData(Object object){
if (object instanceof YourTypeOne){
//set data to layout row_type_one
}else {
//set data to layout row_type_two
}
}
}
}
public类YourAdapter扩展了RecyclerView.Adapter{
ArrayList对象=新的ArrayList();
公共适配器(ArrayList typeOneArray、ArrayList typeTowArray){
addAll(typeOneArray);
addAll(typeTowArray);
}
@凌驾
public int getItemViewType(int位置){
返回对象。获取TypeOne的(位置)实例?1:2;
}
@非空
@凌驾
public YourViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int viewType){
观点五;
如果(viewType==1){
v=LayoutInflater.from(parent.getContext())
.充气(R.layout.row\u type\u one,父级,假);
}否则{
v=LayoutInflater.from(parent.getContext())
.充气(R.layout.row\u type\u two,父级,假);
}
返回新的YourViewHolder(v,viewType);
}
@凌驾
public void onBindViewHolder(@NonNull YourViewHolder,int位置){
}
@凌驾
public int getItemCount(){
返回objects.size();
}
类YourViewHolder扩展了RecyclerView.ViewHolder{
私有文本视图txtTypeOne;
私有文本视图txtDescription;
私人影像视图标识;
public YourViewHolder(@NonNull View itemView,int-vewType){
超级(项目视图);
如果(vewType==1){
//通过IDE在.xml中查找视图
txtTypeOne=itemView.findViewById(R.id.txtTypeOne);
}否则{
//按IDE在row_type_two.xml中查找视图
txtDescription=itemviewbyd(R.id.txtDescription);
logo=itemView.findviewbyd(R.id.logo);
}
}
公共void bindeData(对象){
if(typeOne的对象实例){
//将数据设置为布局行类型
}否则{
//将数据设置为布局行\类型\二
}
}
}
}
祝你好运。:)不太可能。数据类型是我自己的自定义基类和另一个子类
public class YourTypeTow {
public String title;
public String imgUrl;
}
public class YourAdapter extends RecyclerView.Adapter<YourAdapter.YourViewHolder> {
ArrayList<Object> objects = new ArrayList<>();
public YourAdapter(ArrayList<YourTypeOne> typeOneArray, ArrayList<YourTypeTow> typeTowArray) {
objects.addAll(typeOneArray);
objects.addAll(typeTowArray);
}
@Override
public int getItemViewType(int position) {
return objects.get(position) instanceof YourTypeOne ? 1 : 2;
}
@NonNull
@Override
public YourViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v;
if (viewType == 1) {
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.row_type_one, parent, false);
} else {
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.row_type_two, parent, false);
}
return new YourViewHolder(v,viewType);
}
@Override
public void onBindViewHolder(@NonNull YourViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return objects.size();
}
class YourViewHolder extends RecyclerView.ViewHolder {
private TextView txtTypeOne;
private TextView txtDescription;
private ImageView logo;
public YourViewHolder(@NonNull View itemView, int vewType) {
super(itemView);
if (vewType==1){
//find views by ides in .xml
txtTypeOne = itemView.findViewById(R.id.txtTypeOne);
}else {
//find views by ides in row_type_two.xml
txtDescription = itemView.findViewById(R.id.txtDescription);
logo = itemView.findViewById(R.id.logo);
}
}
public void bindeData(Object object){
if (object instanceof YourTypeOne){
//set data to layout row_type_one
}else {
//set data to layout row_type_two
}
}
}
}