我必须显示具有不同类型视图的列表。所以我必须使用适配器定义ListView,我必须在其中扩充多个视图。我已经通过example给出,但问题是我的列表不对称,就像每次在4个项目后重复标题的示例。所以我在getView()
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_1:
convertView = mInflater.inflate(R.layout.item1, null);
.......
break;
case TYPE_2:
convertView = mInflater.inflate(R.layout.item2, null);
.......
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
............
............
}
现在,如果convertView不为null,但之前使用的项类型不同,则布局将不相同。这段代码将如何处理这个问题?
答案 0 :(得分:3)
您可以查看此示例适配器。 getViewTypeCount方法返回不同类型的行。 getItemViewType方法,如果position等于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;
}
}
答案 1 :(得分:0)
您可以通过覆盖方法getViewCount()
和getItemViewType(int position)
在第一个中,您只需返回您拥有的不同视图的数量。
在第二个中,您将为每个不同的视图返回唯一的标识符。
在getView()
方法中,然后检查“视图类型”并为其填充正确的布局。
有关该主题的更多信息:Android ListView with different layouts for each row
答案 2 :(得分:0)
当您在ListView或RecyclerView中使用不同类型的视图时,需要使用以下内容: -
getItemViewType() and getViewTypeCount()
首先,您需要使用getViewTypeCount()并返回List中所需的唯一视图数。然后重写getItemViewType()并根据您希望在ListView内更改视图的条件返回View类型。
希望它会有所帮助。