gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:07:35 24 4
gpt4 key购买 nike

我有一个不应该很奇怪但我不知道的问题。我没有第一次使用 Holder,但我的最后一个项目与第一个相同,使用 Holder 我的最后一个项目还可以,但布局不对。

我有一个 ArrayList 和适配器:

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) { }

最佳答案

适配器重用 View 。例如,如果第一个单元格 View 超出屏幕而最后一个单元格 View 需要渲染,适配器将使用第一个 View 而不是创建一个新 View ,然后最后一个 View 将与第一个 View 相同。

您必须为此使用 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)

您的适配器现在将处理具有不同 View 类型的第一个单元格。您还应该考虑使用 HeaderView 来解决此类问题。

关于android - 适配器第一个位置 = 第 6 个位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30456884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com