适配器第一个位置 = 第 6 个位置?
Adapter first position = 6th position?
我有一个不应该很奇怪但我不知道的问题。我没有第一次使用 Holder,但我的最后一个项目与第一个相同,使用 Holder 我的最后一个项目还可以,但它的布局不对。
我有一个 ArrayList 和 Adapter :
listViewNews = (ListView)view.findViewById(R.id.list_news_items);
newAdapter = new NewsListAdapter(getActivity(),
arListNews);
listViewNews.setOnItemClickListener(new viewNewClickListener());
listViewNews.setAdapter(newAdapter);
在后者中,我对列表中的第一项有一个特定的布局,对其余项有另一个布局。
public class NewsListAdapter extends BaseAdapter {
private Context context;
private ArrayList<Actualite> newsItems;
Typeface custom_font_bold, custom_font_book;
public NewsListAdapter(Context context, ArrayList<Actualite> newsItems){
this.context = context;
this.newsItems = newsItems;
}
@Override
public int getCount() {
return newsItems.size();
}
@Override
public Object getItem(int position) {
return newsItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
NewHolder holder = null;
if (view == null) {
LayoutInflater mInflater = (LayoutInflater)
context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
holder = new NewHolder();
if(position == 0) { // First item
view = mInflater.inflate(R.layout.new_list_item_une, null);
holder.resume = (TextView) view.findViewById(R.id.resume);
} else { // The rest
view = mInflater.inflate(R.layout.new_list_item, null);
}
holder.imageActu = (ImageView) view.findViewById(R.id.imageActu);
holder.txtTitle = (TextView) view.findViewById(R.id.titreActu);
holder.vw = (View) view.findViewById(R.id.colorActu);
holder.thematique = (TextView) view.findViewById(R.id.thematique);
view.setTag(holder);
} else {
holder = (NewHolder) view.getTag();
}
holder.imageActu.setBackgroundColor(context.getResources().getColor(R.color.grey_200_transparent));
holder.txtTitle.setText(newsItems.get(position).getTitre());
holder.vw.setBackgroundColor(Color.rgb(r, g, b));
holder.thematique.setText(th.toUpperCase());
holder.thematique.setTextColor(Color.rgb(r, g, b));
if(position == 0) {
holder.resume.setText(Html.fromHtml(newsItems.get(position).getResume()));
holder.resume.setTextColor(context.getResources().getColor(R.color.grey_200_transparent));
}
return view;
}
private static class NewHolder {
ImageView imageActu;
TextView txtTitle;
View vw;
TextView thematique;
TextView resume;
}
为什么我最后一个项目的布局与第一个相同?从我的日志来看,最后一项没有位置,所以它使用第一个元素的布局。
我还注意到最后一项不在 if :
内
if (view == null) { }
适配器重用视图。例如,如果第一个单元格视图超出屏幕而最后一个单元格视图需要渲染,适配器将使用第一个视图而不是创建一个新视图,然后最后一个视图将与第一个视图相同。
您必须为此使用 viewType。只需覆盖适配器中的下一个方法:
private static final int FIRST_CELL = 0;
private static final int DEFAULT_CELL = 1;
...
public int getViewTypeCount() {
return 2;
}
public int getItemViewType(int position) {
return position == 0 ? FIRST_CELL : DEFAULT_CELL;
}
在您的 getView 方法中,使用
if (getItemViewType(position) == FIRST_CELL)
而不是
if(position == 0)
您的适配器现在将处理具有不同视图类型的第一个单元格。
您还应该考虑使用 HeaderView 来解决此类问题。
我有一个不应该很奇怪但我不知道的问题。我没有第一次使用 Holder,但我的最后一个项目与第一个相同,使用 Holder 我的最后一个项目还可以,但它的布局不对。
我有一个 ArrayList 和 Adapter :
listViewNews = (ListView)view.findViewById(R.id.list_news_items);
newAdapter = new NewsListAdapter(getActivity(),
arListNews);
listViewNews.setOnItemClickListener(new viewNewClickListener());
listViewNews.setAdapter(newAdapter);
在后者中,我对列表中的第一项有一个特定的布局,对其余项有另一个布局。
public class NewsListAdapter extends BaseAdapter {
private Context context;
private ArrayList<Actualite> newsItems;
Typeface custom_font_bold, custom_font_book;
public NewsListAdapter(Context context, ArrayList<Actualite> newsItems){
this.context = context;
this.newsItems = newsItems;
}
@Override
public int getCount() {
return newsItems.size();
}
@Override
public Object getItem(int position) {
return newsItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
NewHolder holder = null;
if (view == null) {
LayoutInflater mInflater = (LayoutInflater)
context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
holder = new NewHolder();
if(position == 0) { // First item
view = mInflater.inflate(R.layout.new_list_item_une, null);
holder.resume = (TextView) view.findViewById(R.id.resume);
} else { // The rest
view = mInflater.inflate(R.layout.new_list_item, null);
}
holder.imageActu = (ImageView) view.findViewById(R.id.imageActu);
holder.txtTitle = (TextView) view.findViewById(R.id.titreActu);
holder.vw = (View) view.findViewById(R.id.colorActu);
holder.thematique = (TextView) view.findViewById(R.id.thematique);
view.setTag(holder);
} else {
holder = (NewHolder) view.getTag();
}
holder.imageActu.setBackgroundColor(context.getResources().getColor(R.color.grey_200_transparent));
holder.txtTitle.setText(newsItems.get(position).getTitre());
holder.vw.setBackgroundColor(Color.rgb(r, g, b));
holder.thematique.setText(th.toUpperCase());
holder.thematique.setTextColor(Color.rgb(r, g, b));
if(position == 0) {
holder.resume.setText(Html.fromHtml(newsItems.get(position).getResume()));
holder.resume.setTextColor(context.getResources().getColor(R.color.grey_200_transparent));
}
return view;
}
private static class NewHolder {
ImageView imageActu;
TextView txtTitle;
View vw;
TextView thematique;
TextView resume;
}
为什么我最后一个项目的布局与第一个相同?从我的日志来看,最后一项没有位置,所以它使用第一个元素的布局。 我还注意到最后一项不在 if :
内if (view == null) { }
适配器重用视图。例如,如果第一个单元格视图超出屏幕而最后一个单元格视图需要渲染,适配器将使用第一个视图而不是创建一个新视图,然后最后一个视图将与第一个视图相同。
您必须为此使用 viewType。只需覆盖适配器中的下一个方法:
private static final int FIRST_CELL = 0;
private static final int DEFAULT_CELL = 1;
...
public int getViewTypeCount() {
return 2;
}
public int getItemViewType(int position) {
return position == 0 ? FIRST_CELL : DEFAULT_CELL;
}
在您的 getView 方法中,使用
if (getItemViewType(position) == FIRST_CELL)
而不是
if(position == 0)
您的适配器现在将处理具有不同视图类型的第一个单元格。 您还应该考虑使用 HeaderView 来解决此类问题。