Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用自定义布局向列表视图添加多种类型的对象_Android_Android Layout_Listview_Object_Android Arrayadapter - Fatal编程技术网

Android 使用自定义布局向列表视图添加多种类型的对象

Android 使用自定义布局向列表视图添加多种类型的对象,android,android-layout,listview,object,android-arrayadapter,Android,Android Layout,Listview,Object,Android Arrayadapter,更新 有没有办法用它的适配器向列表视图添加多种类型的对象? 我的适配器只能处理一种保留玩家属性的对象类型。但我无法将适配器更改为添加其他类型的对象。我想将游戏对象添加到显示游戏属性的列表中 public class MyAdapter extends ArrayAdapter<StructureCase> 这是结构案例: public class StructureCase { public int r_ID; public String r_name;

更新

有没有办法用它的适配器向列表视图添加多种类型的对象? 我的适配器只能处理一种保留玩家属性的对象类型。但我无法将适配器更改为添加其他类型的对象。我想将游戏对象添加到显示游戏属性的列表中

public class MyAdapter extends ArrayAdapter<StructureCase> 
这是结构案例:

public class StructureCase {

    public int r_ID;
    public String r_name;

    public StructureCase() {}

}
所以,如果我想拥有另一种类型的物品,比如GameStructure,它可以保存游戏属性,那么解决方案是什么

这是我的适配器,我还定义了类型,因此我可以使用自己的布局文件每4项添加列表分隔符,但我应该说,不幸的是,我也使用Structorecase对象添加分隔符,但从未使用其内部数据,因为我的arrayadapter类型是Structurecase:(

公共类MyAdapter扩展了ArrayAdapter{
私有LayoutInflater mInflater=null;
公共语境;
公共类distinationActivity=null;
MediaPlayer myPlayer=新MediaPlayer();
私有树集mseparatorset=新树集();
私有静态最终整数类型\u项=0;
私有静态final int TYPE_SEPARATOR=1;
私有静态最终整数类型\最大\计数=类型\分隔符+1;
公共MyAdapter(上下文上下文、int textViewResourceId、列表对象){
超级(上下文、textViewResourceId、对象);
mInflater=LayoutInflater.from(上下文);
}
公共静态类视图持有者{
公共文本视图r_name=null;
public TextView r_duration=null;
公共按钮r_send_btn=null;
公共按钮r_play_btn=null;
公共按钮r_del_btn=null;
公共文本视图文本视图;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终持票人;
最后意见五;
最终结构案例项目=getItem(位置);
int type=getItemViewType(位置);
if(convertView==null){
viewHolder=新的viewHolder();
开关(类型){
案例类型\u项目:
convertView=this.mInflater.充气(R.layout.record\u list\u项,空);
//mInflater=(LayoutInflater)G.currentActivity.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
convertView=mInflater.充气(R.layout.record\u list\u项,父项,false);
viewHolder.r_name=(TextView)convertView.findViewById(r.id.TextView_name_记录_列表_项);
viewHolder.r_duration=(TextView)convertView.findViewById(r.id.TextView_duration_记录_列表_项);
viewHolder.r\u send\u btn=(按钮)convertView.findViewById(r.id.Button\u send\u record\u list\u项);
viewHolder.r\u del\u btn=(按钮)convertView.findViewById(r.id.Button\u del\u record\u list\u项);
viewHolder.r\u play\u btn=(按钮)convertView.findViewById(r.id.Button\u play\u record\u list\u项);
打破
箱型分离器:
convertView=mInflater.充气(R.layout.separator,空);
打破
}
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
如果(类型==0){
viewHolder.r\u name.setText(item.r\u name);
viewHolder.r_duration.setText(Integer.toString(item.r_duration));
viewHolder.r\u play\u btn.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
}
});
}否则{
viewHolder.textView=(textView)convertView.findViewById(R.id.textSeparator);
viewHolder.textView.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
Toast.makeText(G.currentActivity,“seperator”+位置,Toast.LENGTH_SHORT.show();
}
});
}
返回视图;
}
公共void addSeparatorItem(最终字符串项){
StructureCase s=新的StructureCase();
s、 r_name=项目;
G.列表。添加;
//保存分隔符位置
mSeparatorsSet.add(G.list.size()-1);
Log.i(“MAHDI”,“G.list.size()=”+G.list.size());
notifyDataSetChanged();
}
@凌驾
public int getItemViewType(int位置){
返回mseparatorset.contains(位置)?TYPE_分隔符:TYPE_项;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
这是将项目添加到列表的主要活动的一部分:

G.list.clear();
    recordingListView.setAdapter(null);
    mAdapter.clear();
    mAdapter.notifyDataSetChanged();
    recordingListView.setAdapter(G.mAdapter);


    if(myCursor.getCount() != 0) for (int i = 1; i <= myCursor.getCount(); i++) {

        StructureCase sample = new StructureCase();
        sample.r_ID = myCursor.getInt(myCursor.getColumnIndex(G.db._ID));
        sample.r_name = myCursor.getString(myCursor.getColumnIndex(G.db._NAME));

        list.add(sample);



        if (i % 4 == 0) {
            mAdapter.addSeparatorItem("separator " + i);
        }


    }
G.list.clear();
recordingListView.setAdapter(空);
mAdapter.clear();
mAdapter.notifyDataSetChanged();
recordingListView.setAdapter(G.mAdapter);
如果(myCursor.getCount()!=0)用于(int i=1;i
重写这两种方法以获取不同的ViewType

在getview()中,只需检查它是哪种类型,并调用您的布局。请参见这里的示例

if (convertView == null) {
    holder = new ViewHolder();
    if (getItemViewType(position) == 0) {
        convertView = inflater.inflate(R.layout.your_layout_one, parent, false);
    } else {
        convertView = inflater.inflate(R.layout.your_layout_two, parent, false);
    }
}

一种解决方案是将类创建为:

class SomeData{
    String dataType;
    dataTypeSeperator seperatorData;
    dataTypeItem ItemData;
    geters();
    seters();
}
现在在
ArrayList
HashMap

您可以在
objectName.dataType
上添加条件,如:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    if(objectName.dataType == "yourDataType") { //condition
        view = inflater.inflate(R.layout.list_row_text_msg, null);
    } else if(...){
        view = inflater.inflate(R.layout.list_row_image_msg, null);
    } else {
        ...
    }

    ...
}

您是否询问要添加到列表中的不同布局?是的,但具有不同的对象。因此我可以处理它们的数据和属性以显示。您是否关心传递不同类型的数据,对吗?…一些如何是的。这是对的。您是否希望交替显示
structureCase
分隔符
?您可以分享一些详细信息吗关于它?或者数据类型,或者要显示的
listView
部分?我只显示了适配器的重要部分。是的,我使用了它们,可以显示不同类型的视图。但问题是传递不同类型的数据。
if (convertView == null) {
    holder = new ViewHolder();
    if (getItemViewType(position) == 0) {
        convertView = inflater.inflate(R.layout.your_layout_one, parent, false);
    } else {
        convertView = inflater.inflate(R.layout.your_layout_two, parent, false);
    }
}
class SomeData{
    String dataType;
    dataTypeSeperator seperatorData;
    dataTypeItem ItemData;
    geters();
    seters();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    if(objectName.dataType == "yourDataType") { //condition
        view = inflater.inflate(R.layout.list_row_text_msg, null);
    } else if(...){
        view = inflater.inflate(R.layout.list_row_image_msg, null);
    } else {
        ...
    }

    ...
}