【问题标题】:Custom adapter getting wrong position on getView metod in ListView自定义适配器在 ListView 中的 getView 方法上的位置错误
【发布时间】:2011-10-28 03:34:06
【问题描述】:

我有自定义数组适配器的列表视图。我想从 getView 方法中获取项目的点击位置。我得到了一些列表视图项目的位置,但是当我在列表中添加超过 7 个项目时,我从 getView 方法得到错误的位置。我的意思是当我点击第 9 个列表项时,它返回 1。

这是我的代码

    @Override
    public View getView(int pos, View convertView, ViewGroup parent) {

        this.position = pos;
        Log.v("View position", Integer.toString(pos));

        lineView = convertView;

            if(lineView==null)
            {
                adapterLine=new AdapterLine();
                layoutInflater=context.getLayoutInflater();
                lineView=layoutInflater.inflate(com.inomera.sanalmarket.main.R.layout.adapter, null,true);
                adapterLine.sListText = (TextView) lineView.findViewById(R.id.sListText);
                adapterLine.sListCheckbox = (CheckBox) lineView.findViewById(R.id.sListCheckbox);
                adapterLine.sListImageView = (ImageView) lineView.findViewById(R.id.imageView1);
                adapterLine.gestureOverlayView = (GestureOverlayView) lineView.findViewById(com.inomera.sanalmarket.main.R.id.gestureOverlayView1);
                adapterLine.gestureOverlayView.setGestureVisible(false);

                // To remember whitch tab is selected 
                adapterLine.sListImageView.setTag(pos);
                adapterLine.sListCheckbox.setTag(pos);
                adapterLine.sListText.setTag(pos);

                Log.v("adapter", "position of adapter is " + Integer.toString(pos));

感谢您的帮助!

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    这个实现是不完整的添加从数据中设置值的 else 部分。这是对我有用的实现

     public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater inflator = reportViewContext.getLayoutInflater();
            convertView = inflator.inflate(R.layout.tabitems, null);            
            viewHolder.name= (TextView) convertView
                    .findViewById(R.id.user_reportTab_userName);            
            //set other values needed in viewHolder if any
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder)convertView.getTag();
        }
        //data is list of Data model
        if(data.size()<=0) { 
            //if data unavailable } 
        else {
    
         /***** Get each Model object from Array list ********/
           System.out.println("Position:"+position);
    
         /************ Set Model values in Holder elements ***********/
    
            viewHolder.name.setText(data.get(position).getName());
         }       
        return convertView;
    }
    

    我知道这个问题很老了,如果有人偶然发现类似问题,请回答

    【讨论】:

      【解决方案2】:

      数组适配器只会在列表视图中的每个可见行创建一个对象。在此之后,适配器将回收已创建的视图。这样做的目的是:

      if(lineView==null)
      

      适配器中的线路。

      您将需要放入一个 else 部分,该部分使用回收的视图设置行。这篇其他文章可能会有所帮助:

      How can I make my ArrayAdapter follow the ViewHolder pattern?

      【讨论】:

      • 我已经写了这个 lineView.setTag(adapterLine); }else{ adapterLine = (AdapterLine) lineView.getTag(); } 但仍然遇到同样的问题
      • 解决方案没那么简单。您需要完全遵循 ViewHolder 模式才能完成这项工作。作为对您的评论的回应,您需要在 else 中设置标签,以便在用户滚动列表时用正确的行号标记每一行。但是,我建议您按照示例进行操作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      相关资源
      最近更新 更多