适配器第一个位置 = 第 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 来解决此类问题。