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

标签 android listview view adapter

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

相关文章:

android - YouTubePlayerFragment 后台堆栈

wpf - 如何设置 WPF ListView 选定项颜色?

java - Android,从sqlite检索数据并显示在自定义列表中的正确方法

python - Python/Django 中 PHP "ob"函数的等效函数

mysql - MySQL View 是在文件系统上创建和存储的,还是总是在运行时创建的

java - 我如何在 Room 中的对象中保留自定义对象

java - ':app:dexDebug'. gradle failed 'C:\Program Files\Java\jdk1.7.0_51\bin\java.exe' '以非零退出值 2 完成

android - 强制按钮停留在电话屏幕的底部

android - 有没有办法用 ArrayAdapter 更新多个 TextView?

swift - 如何将一个 SwiftUI View 作为变量传递给另一个 View 结构