适配器第一个位置=第6个位置?

时间:2015-05-26 11:10:43

标签: android listview view adapter

我有一个不应该奇怪但我不知道的问题。我第一次没有使用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) { }

1 个答案:

答案 0 :(得分:1)

适配器重用视图。例如,如果第一个单元格视图不在屏幕上并且最后一个单元格视图需要渲染,则适配器将使用第一个视图而不是创建新视图,然后最后一个视图将与第一个视图相同。

您必须使用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来解决此类问题。