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