自定义适配器的getView返回错误的位置

时间:2015-01-10 13:30:35

标签: android custom-adapter getview

我为gridview编写了一个自定义适配器。网格视图中的每个项目都有其他子视图。其中一个是textView,它实现了一个点击监听器。

当用户点击TextView时,我会显示一个Toast,它会在gridView中显示该项目的位置。

现在遇到问题:

我指定"位置"每次调用getView()时,getView()都会将其作为标记返回给TextView。当我滚动"位置"由getView()提供的是正确的值,但是一旦滚动停止,getView()提供的位置就变为0,除非我位于网格视图的顶部,否则它不应该在第一位置为零。但是,TextView标记中保存的值始终是正确的值。那是为什么?

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;

        if(convertView == null){
            convertView = mLayoutIflater.inflate(R.layout.grid_item, null);
            viewHolder = new ViewHolder();

            …..
            viewHolder.playButton.setOnClickListener(new View.OnClickListener() {
                 @Override
                    public void onClick(View v) {
                         Log.e(“test”, "myPos: "+ (Integer) viewHolder.mTextView.getTag()); // always returns correct position value

                        }
                    });

            convertView.setTag(viewHolder);
        }
        else
            viewHolder = (ViewHolder) convertView.getTag();


        Log.e(“test”, "GETVIEW: "+ position); // position is zero when scrolling stops & correct value when scrolling
        viewHolder.mTextView.setTag(position);

        return convertView;
    }

最好的问候

4 个答案:

答案 0 :(得分:0)

试试这个。

 convertView = mLayoutIflater.inflate(R.layout.grid_item, parent, false);

答案 1 :(得分:0)

像这样修改代码,

 @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder viewHolder;

            if(convertView == null){
                convertView = mLayoutIflater.inflate(R.layout.grid_item, null);
                viewHolder = new ViewHolder();

                …..


                convertView.setTag(viewHolder);
            }
            else
                viewHolder = (ViewHolder) convertView.getTag();


            Log.e(“test”, "GETVIEW: "+ position); // position is zero when scrolling stops & correct value when scrolling
            viewHolder.mTextView.setTag(position);

viewHolder.playButton.setOnClickListener(new View.OnClickListener() {
                     @Override
                        public void onClick(View v) {
                             Log.e(“test”, "myPos: "+ (Integer) viewHolder.mTextView.getTag()); // always returns correct position value

                            }
                        });

            return convertView;
        }

答案 2 :(得分:0)

AdapterView可以在其适配器上调用getView(),看似任意。这样做没有保证的顺序或时间。当滚动完成时,它调用方法的最后一个位置可能是0位置是无关紧要的。使用相应的View(或其子代)缓存传递的位置值是跟踪它的正确方法。调用getView()的最后一个位置不会告诉您与AdapterView的行为有关的任何内容,您不应该依赖它。

答案 3 :(得分:0)

适配器实际上不是定义onClickListener的地方。尝试在主Activity或任何定义的Grid中使用onItemClickListener()作为GridView。这是更容易的方式以及应该如何完成。 总是更喜欢Android的推荐做法,而不是在课堂上进行试验。