Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.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 ListView_Android_Listview_Baseadapter_Layout Inflater_Getview - Fatal编程技术网

具有多个布局的Android ListView

具有多个布局的Android ListView,android,listview,baseadapter,layout-inflater,getview,Android,Listview,Baseadapter,Layout Inflater,Getview,我必须显示一个具有不同类型视图的列表。所以我必须定义一个带有适配器的ListView,在这里我必须膨胀多个视图。我已经看过了给定的,但问题是我的列表不是对称的,就像示例中的头在4个项目之后重复出现一样。因此,我面临着重用getView()中的项的问题。 现在,如果convertView不为null,但之前使用它的项类型不同,那么布局将与相同的项不匹配。此代码将如何处理此问题 您可以通过重写方法getViewCount()和getItemViewType(int位置) 在第一种情况下,您只需返回您

我必须显示一个具有不同类型视图的列表。所以我必须定义一个带有适配器的ListView,在这里我必须膨胀多个视图。我已经看过了给定的,但问题是我的列表不是对称的,就像示例中的头在4个项目之后重复出现一样。因此,我面临着重用
getView()中的项的问题。


现在,如果convertView不为null,但之前使用它的项类型不同,那么布局将与相同的项不匹配。此代码将如何处理此问题

您可以通过重写方法
getViewCount()
getItemViewType(int位置)

在第一种情况下,您只需返回您拥有的不同视图的数量

在第二种情况下,为每个不同的视图返回一个唯一的标识符

在您的
getView()
方法中,检查视图类型,然后为其膨胀正确的布局

有关该主题的更多信息:


这是在ListView或RecyclerView中创建不同类型视图时需要使用的:-

getItemViewType() and getViewTypeCount()
首先,需要使用getViewTypeCount()并返回列表中所需的唯一视图数。然后重写getItemViewType(),并根据希望视图在ListView中更改的任何条件返回视图类型


希望对您有所帮助。

您可以查看此示例适配器。getViewTypeCount方法返回不同类型的行。getItemViewType方法,如果位置等于0,则膨胀第一行布局,否则膨胀其他行布局。您可以自定义此代码示例

    import java.util.List;
    import android.app.Activity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;

    /**
     * Created by MustafaS on 9.2.2015.
     */
    public class CustomArrayAdapter extends ArrayAdapter<YourModel> {

       @Override
       public int getItemViewType(int position) {

          if (position == 0) {
             return 0;
          }
          else {
             return 1;
          }
       }

       @Override
       public int getViewTypeCount() {
          return 2;
       }

       @Override
       public View getView(int position, View convertView, ViewGroup parent) {
          int type = getItemViewType(position);
          if (type == 0) {
             if (convertView == null) {
                convertView = LayoutInflater.from(activity).inflate(R.layout.listview_first_row, parent, false);
                viewHolderFirst = new ViewHolderFirst();
                convertView.setTag(viewHolderFirst);
             }
             else {
                viewHolderFirst = (ViewHolderFirst) convertView.getTag();
             }

          }
          else {
             if (convertView == null) {
                convertView = LayoutInflater.from(activity).inflate(R.layout.listview_other_row, parent, false);
                viewHolder = new ViewHolder();

             }
             else {
                viewHolder = (ViewHolder) convertView.getTag();
             }
          }
          return convertView;
       }

       protected class ViewHolderFirst {
          private RunnableViewPager pager;
          private CircleIndicator   indicator;
       }

       protected class ViewHolder {
          private ImageView imageviewRestaurant;
          private TextView  textviewRestaurantName;
          private TextView  textviewType;
          private TextView  textviewPrice;
          private TextView  textviewDistance;
          private ImageView imageviewCall;
          private ImageView imageviewCalendar;
       }
    }
import java.util.List;
导入android.app.Activity;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
/**
*穆斯塔法斯于2015年2月9日创建。
*/
公共类CustomArrayAdapter扩展了ArrayAdapter{
@凌驾
public int getItemViewType(int位置){
如果(位置==0){
返回0;
}
否则{
返回1;
}
}
@凌驾
public int getViewTypeCount(){
返回2;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
int type=getItemViewType(位置);
如果(类型==0){
if(convertView==null){
convertView=LayoutFlater.from(活动)。充气(R.layout.listview\u第一行,父级,false);
viewHolderFirst=新的viewHolderFirst();
setTag(viewHolderFirst);
}
否则{
viewHolderFirst=(viewHolderFirst)convertView.getTag();
}
}
否则{
if(convertView==null){
convertView=LayoutFlater.from(活动)。充气(R.layout.listview\u其他行,父行,false);
viewHolder=新的viewHolder();
}
否则{
viewHolder=(viewHolder)convertView.getTag();
}
}
返回视图;
}
受保护类ViewHolderFirst{
专用RunnableviewPage寻呼机;
专用电路指示器;
}
受保护类视窗持有人{
私人ImageView餐厅;
私有文本视图文本视图餐厅名称;
私有文本视图文本视图类型;
私有文本视图文本视图价格;
私有文本视图文本视图距离;
私有ImageView imageviewCall;
私有图像查看图像查看日历;
}
}

不要为convertview检查空条件,因为空条件总是会使项目布局膨胀。您需要为item1和item2布局设置2
ViewHolder
,并在
else
中的
convertview=空值
您需要检查
类型
并强制转换到
ViewHolder1
ViewHolder2
。。。您认为如何?如果listview项具有非对称布局,那么您可以具有单个listitem xml,其中包含所有必需的元素,并基于您可以设置可见性的类型在getView方法中显示/隐藏/消失。假设第一项是类型1(具有布局1),它将在类型2(具有布局2)的第八个元素中重用。现在,如果第1项的标记(实际上是ViewHolder1的对象)将其强制转换为ViewHolder2,它会工作吗?而且布局也会有所不同。它将如何工作?假设第一项是类型1(具有布局1),它将在第八个元素中重用,第八个元素是类型2(具有布局2)。现在,如果第1项的标记(实际上是ViewHolderFirst的对象)将其强制转换为ViewHolder,它会工作吗?而且布局也会有所不同。它将如何工作?如果你的第一行有很多不同的其他行,你应该这样做。但是,如果您的行是相似的,您可以看到一行xml和一行viewholderlayout_1和layout_2是不同的。如何将其重新用于类型2(之前使用的是类型1)?
    import java.util.List;
    import android.app.Activity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;

    /**
     * Created by MustafaS on 9.2.2015.
     */
    public class CustomArrayAdapter extends ArrayAdapter<YourModel> {

       @Override
       public int getItemViewType(int position) {

          if (position == 0) {
             return 0;
          }
          else {
             return 1;
          }
       }

       @Override
       public int getViewTypeCount() {
          return 2;
       }

       @Override
       public View getView(int position, View convertView, ViewGroup parent) {
          int type = getItemViewType(position);
          if (type == 0) {
             if (convertView == null) {
                convertView = LayoutInflater.from(activity).inflate(R.layout.listview_first_row, parent, false);
                viewHolderFirst = new ViewHolderFirst();
                convertView.setTag(viewHolderFirst);
             }
             else {
                viewHolderFirst = (ViewHolderFirst) convertView.getTag();
             }

          }
          else {
             if (convertView == null) {
                convertView = LayoutInflater.from(activity).inflate(R.layout.listview_other_row, parent, false);
                viewHolder = new ViewHolder();

             }
             else {
                viewHolder = (ViewHolder) convertView.getTag();
             }
          }
          return convertView;
       }

       protected class ViewHolderFirst {
          private RunnableViewPager pager;
          private CircleIndicator   indicator;
       }

       protected class ViewHolder {
          private ImageView imageviewRestaurant;
          private TextView  textviewRestaurantName;
          private TextView  textviewType;
          private TextView  textviewPrice;
          private TextView  textviewDistance;
          private ImageView imageviewCall;
          private ImageView imageviewCalendar;
       }
    }