2

我已经为 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

4 回答 4

1

像这样修改代码,

 @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;
        }
于 2015-01-10T13:47:10.173 回答
0

试试这个。

 convertView = mLayoutIflater.inflate(R.layout.grid_item, parent, false);
于 2015-01-10T13:31:41.090 回答
0

AdapterView 可以getView()看似任意地调用它的 Adapter。没有保证这样做的顺序或时间。它调用该方法的最后一个位置可能是0滚动完成时的位置,这无关紧要。用相应的视图(或其子视图)缓存传递的位置值是跟踪它的正确方法。调用的最后一个位置getView()不会告诉您任何与您的 AdapterView 应该如何表现相关的信息,并且您不应该依赖它。

于 2015-01-10T13:47:27.750 回答
0

适配器并不是真正定义 onClickListener 的地方。尝试onItemClickListener()在主 Activity 或任何定义的地方使用 GridView。这是更简单的方法,应该怎么做。总是更喜欢 Android 的推荐做法,而不是在课堂上进行试验。

于 2016-10-19T09:11:52.007 回答