Android- ListView 适配器未返回正确的位置

android- listview adapter not returning correct position

提问人:Pranjal 提问时间:6/18/2018 更新时间:6/18/2018 访问量:911

问:

我的列表视图有一个行文件,它有 3 个元素。行左侧的名称。一个 Imageview(指示进入下一页的右箭头)和一个主要的 LinearLayout,我在其中放置了这些项目。

这是我的适配器的getView()方法。

@Override

 public View getView(int position, View convertView, ViewGroup parent) {

        if(convertView==null){     

        convertView=LayoutInflater.from(context).inflate(R.layout.activity_row_mail_category,null);
        holder=new Holder();
        setView(convertView,position);
        convertView.setTag(holder);
    }
    else {
        holder= (Holder) convertView.getTag();
        setView(convertView,position);
    }

    holder.Name.setText(mailCategoryArrayList.get(position).getCat_name());

    return convertView;
}

Holder 是我在 adpater 本身中创建的静态类。

static class Holder{

    TextView Name;
    ImageView next;
    LinearLayout mainLayout;
}

这是我从 getView 调用的 setView 方法

private void setView(final View convertView,final int position) {

    holder.Name = (TextView) convertView.findViewById(R.id.listview_row_title);
    holder.next = (ImageView) convertView.findViewById(R.id.next);
    holder.main = (LinearLayout) convertView.findViewById(R.id.main);

    holder.next.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view)

          Log.e("tag","Position:"+position);

        }
    });

    holder.mailCategoryMain.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            holder.next.performClick();

    });

每当我运行应用程序并单击布局时,我都会获得该位置作为我的 arrayList 的最后一个索引,但是当我单击图像视图时,我会得到正确的位置。那么 performClick() 函数有什么问题,为什么当我简单地告诉 android 以编程方式而不是手动单击图像视图时会发生这种情况?

android listview 数组列表 android 适配器

评论


答:

0赞 Benkerroum Mohamed 6/18/2018 #1

初始化你的内部函数将解决问题holdersetView()

private void setView(final View convertView,final int position) {

    Holder holder = new holder();
    holder.Name = (TextView) convertView.findViewById(R.id.listview_row_title);
    holder.next = (ImageView) convertView.findViewById(R.id.next);
    holder.main = (LinearLayout) convertView.findViewById(R.id.main);

    holder.next.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view)

          Log.e("tag","Position:"+position);

        }
    });

    holder.mailCategoryMain.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            holder.next.performClick();

    });

在您的代码上使用相同的代码,它保存了最后一个值,希望这会有所帮助instanceholder

0赞 Rajesh 6/18/2018 #2
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
    if(convertView==null){     

    convertView=LayoutInflater.from(context)
    .inflate(R.layout.activity_row_mail_category,null);

    holder=new Holder();
    holder.Name.setText(mailCategoryArrayList.get(position).getCat_name());
    holder.Name = (TextView) convertView.findViewById(R.id.listview_row_title);
    holder.next = (ImageView) convertView.findViewById(R.id.next);
    holder.main = (LinearLayout) convertView.findViewById(R.id.main);
    convertView.setTag(holder);
    }else {
       holder= (Holder) convertView.getTag();
    }

    holder.next.setTag(position);//To avoid finalize
    holder.next.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view)
       Integer pos=(Integer)view.getTag();
       Log.e("tag","Position:"+pos);

       }
    });

    holder.mailCategoryMain.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           holder.next.performClick();

    });
return convertView;
}