Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.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 Listview_Android Custom View - Fatal编程技术网

Android 根据行使用不同类型的适配器创建视图

Android 根据行使用不同类型的适配器创建视图,android,android-listview,android-custom-view,Android,Android Listview,Android Custom View,我正在尝试复制这个GoogleNow卡接口。我不担心卡片的感觉,但我更关心的是如何构建视图 我正在考虑使用一个适配器,它返回与行对应的不同布局。但正如您所看到的,两个视图都包含彼此不相关的信息 是否可以使用具有不同行适配器的ListView 或者,我如何使用自定义视图来实现这一点?您需要使用单个适配器并根据列表中的位置展开不同的视图来实现这一点。这个问题的一个好答案是: 首先,您需要为此创建一个CustomAdapter: public class CustomAdapter extends

我正在尝试复制这个GoogleNow卡接口。我不担心卡片的感觉,但我更关心的是如何构建视图

我正在考虑使用一个适配器,它返回与行对应的不同布局。但正如您所看到的,两个视图都包含彼此不相关的信息

是否可以使用具有不同行适配器的ListView


或者,我如何使用自定义视图来实现这一点?

您需要使用单个适配器并根据列表中的位置展开不同的视图来实现这一点。这个问题的一个好答案是:


首先,您需要为此创建一个CustomAdapter:

public class CustomAdapter extends BaseAdapter {
    ArrayList<View> views;
    Context context;

    public CustomAdapter(Context context, ArrayList<View> views){
        this.views = views;
        this.context = context;
    }

    @Override
    public int getCount() {
        return views.size();
    }

    @Override
    public Object getItem(int i) {
        return i;
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        View rowView = views.get(i);
        /*set the views of the rowView here but take note use try catch since you can't be sure if the view will be present or not this is the part where I do not advice it to have different custom views per row but it's all yours to do your tricks*/

        return rowView;
    }
}
公共类CustomAdapter扩展了BaseAdapter{
阵列主义观点;
语境;
公共CustomAdapter(上下文、ArrayList视图){
this.views=视图;
this.context=上下文;
}
@凌驾
public int getCount(){
返回视图。size();
}
@凌驾
公共对象getItem(int i){
返回i;
}
@凌驾
公共长getItemId(int i){
返回i;
}
@凌驾
公共视图getView(int i、视图视图、视图组视图组){
View rowView=views.get(i);
/*在此处设置rowView的视图,但请注意使用try-catch,因为您无法确定视图是否存在。这是我不建议它每行具有不同的自定义视图的部分,但这完全是您自己的事情*/
返回行视图;
}
}
要使用它,下面是我在create上的示例方法:

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

        ArrayList<View> views = new ArrayList<View>();

        CustomAdapter adapter = new CustomAdapter(MainActivity.this,views);
        ListView custom_list = (ListView)findViewById(R.id.list_custom);
        custom_list.setAdapter(adapter);

        LayoutInflater inflater = (LayoutInflater)   getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view1 = inflater.inflate(R.layout.view1, null);
        View view2 = inflater.inflate(R.layout.view2, null);

        views.add(view1);
        views.add(view2);
        adapter.notifyDataSetChanged();
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
ArrayList视图=新建ArrayList();
CustomAdapter=新的CustomAdapter(MainActivity.this,views);
ListView自定义\列表=(ListView)findViewById(R.id.list\自定义);
自定义_列表。设置适配器(适配器);
LayoutFlater充气器=(LayoutFlater)getBaseContext().getSystemService(Context.LAYOUT\u充气器\u服务);
视图view1=充气机充气(R.layout.view1,空);
视图view2=充气机。充气(R.layout.view2,空);
视图。添加(视图1);
视图。添加(视图2);
adapter.notifyDataSetChanged();
}

如果有需要,做你的变通方法,但基本上这就是它。膨胀视图,在arrayList上传递,然后在listView上设置。

一个listView和一个自定义适配器,根据具体情况膨胀不同的视图(xml),这是最好的方法。yupp你必须这样做,只有膨胀不同的xmlscustom视图才能解决问题,不,一个视图不能有多个适配器。它将替换其他适配器,以防。@KaHeL“自定义视图可以解决此问题”,如何解决?你有解决这类问题的例子吗?更像下面的答案。将视图充气,然后将其传递到适配器上。基于位置修改行时返回整个视图。这是可以做到的,但需要做很多工作。我将把它作为我的答案发布。如何使用一个适配器来处理不同类型的信息?假设我使用一个“运动”对象来为顶部卡充气,使用一个“天气”对象来为底部卡充气,那么对于适配器来说,这将如何工作?这是我的主要问题,我从来没有这样做过。但是,您可能希望使用其构造函数将2个数据源传递到自定义适配器中,然后,您可以根据所使用的布局从所需的任何数据源获取数据。为了从每个数据源中获取正确的项,您可能必须在getView方法中操作position变量,但我认为这不应该是什么问题