Grdiview используя пользовательский адаптер - PullRequest
0 голосов
/ 30 апреля 2020

Я создаю приложение видеонаблюдения, у меня есть макет, который позволяет пользователю переключаться с 1,4,9,12 и 16 камер для просмотра в виде сетки с помощью специального адаптера. Что я отслеживал при изменении номера столбца вида сетки с 1 (вид с одной камеры) на 2 (вид с 4 камеры), все виды воссоздаются заново, как этого избежать?

Это мой метод getview.

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        LinearLayout view = null;
        ChannelsItem channelsItem = new ChannelsItem();
        if ( null == convertView ) {
            if (inflater != null) {
                System.out.println("TTT---->>> new");
                view = (LinearLayout) inflater.inflate(R.layout.layout_channelspreview_list_item, null);
                channelsItem.img = view.findViewById(R.id.img);
                channelsItem.textView = (TextView) view.findViewById(R.id.textVideoStat1);
                channelsItem.funVideoView = (FunVideoView) view.findViewById(R.id.funVideoView1);
            }
        } else {
            view = (LinearLayout) convertView;
        }

        view.setTag(position);

        return view;
    }

Это фрагмент, который я использую для потоковой передачи камер


    public void setConfigAndPlay(final int channelCount, final int currentChannel) {
        stopMedia();
        if (cadapter == null) {
            cadapter = new GridCameraChannelsPreviewsAdapter(this, channelCount);
            gridview.setAdapter(cadapter);

        } else {
            cadapter.setChannels(channelCount);
            cadapter.notifyDataSetChanged();
        }

        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                playrealvideo(channelCount, currentChannel);
            }
        }, 100);

    }

    public void playrealvideo(int channelCount, final int currentChannel) {
        funvideovlist.clear();
        textvlist.clear();
        for (int i = 0; i < channelCount; i++) {
            View v = gridview.findViewWithTag(i);
            Log.d("TAG", "playrealvideo: " + v.toString());
            if (null != v) {
                funVideoView = v.findViewById(R.id.funVideoView1);
                textStart = v.findViewById(R.id.textVideoStat1);
                img = v.findViewById(R.id.img);
            }
            funVideoView.setOnErrorListener(this);
            funVideoView.setOnInfoListener(this);

            funvideovlist.add(funVideoView);
            try {
                textvlist.set(i, textStart);
            } catch (IndexOutOfBoundsException e) {
                textvlist.add(textStart);

            }

            textStart.setText(R.string.media_player_opening);
            textStart.setVisibility(View.VISIBLE);
            img.setOnClickListener(new MyOnTextStartClickListener(i));

            if (mFunDevice.isRemote) {
                if (currentChannel != 0) {
                    funVideoView.setRealDevice(mFunDevice.getDevSn(), currentChannel);
                } else {
                    funVideoView.setRealDevice(mFunDevice.getDevSn(), i);
                }
            } else {
                String deviceIp = FunSupport.getInstance().getDeviceWifiManager().getGatewayIp();
                funVideoView.setRealDevice(deviceIp, i);
            }
        }
}

И так я меняю размер столбца

                gridview.setNumColumns(2);
                setConfigAndPlay(4, 0);

Делая что-то подобное впервые, что было бы лучшим решением для такой проблемы? enter image description here

...