java应用程序体系结构:viewpager2、片段和可变LiveData

eivnm1vs  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(379)

晚上好,
我是android应用程序开发的新手。我有一个项目,我从多个传感器接收数据连接到一个仪器。
在这个时候,我可以选择任何传感器和流数据使用audiotrack。流媒体来自一个服务,这个服务绑定到mainactivity示例。一个传感器的数据流。这是预期的工作。
现在,我想用mpandroidchart在自己的图表中绘制每个传感器的数据。在activity\主布局中,我添加了一个viewpager2元素,片段由pageradapter::createfragment(int position)方法示例化。
我的类模型如下(基于viewpager2示例):

public class MainActivity extends AppCompatActivity
public class PagerAdapter extends FragmentStateAdapter
public class ChannelFragment extends Fragment
public class SensorViewModel extends ViewModel

我使用模拟数据(和不同的颜色背景)测试了片段中的情节可视化。模拟数据是在channelfragment::oncreateview()方法中生成的。这也是可行的,尽管模拟数据对于所有片段/图表都是相同的,但是每个片段的背景颜色不同。
在一个现场测试中,我也向自己证明了我正确地改变了可见片段。我将每个片段与一个特定的传感器相关联,流数据随着可见片段的变化而变化。使用viewpager2.onpagechangecallback onpageselected(位置)从mainactivity执行此操作
我可以将传感器数据设置为sensorviewmodel,并在从sensorviewmodel调用postvalue()时触发通知。
sensorviewmodel包含以下声明

private MutableLiveData<float[][]> sensorLiveData = new MutableLiveData<>();

在mainactivity::oncreate(bundle savedinstancestate)中创建

// Create a ViewModel to hold the audio (sensor) data. This view model is used to communicate
            // with the UI, graphically display the audio data for example
            sensorViewModel = new ViewModelProvider(this).get(SensorViewModel.class);

观察者的代码被定义为channelfragment方法并列为

@Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState)
    {
        super.onViewCreated(view, savedInstanceState);

        sensorViewModel = new ViewModelProvider(requireActivity()).get(SensorViewModel.class);
        sensorViewModel.getSampleData().observe(requireActivity(), new Observer<float[][]>() {
            @Override
            public void onChanged(@Nullable float[][] sampleData)
            {
                // Update the sample data graphical representation
                Log.d(TAG, String.format("ChannelFragment; onChanged() sampleData length : %d, size: %d",
                        sampleData.length, sampleData[0].length));
                addEntry(sampleData);
            }
        });

日志语句报告

ChannelFragment: ChannelFragment; onChanged() sampleData length : 8, size: 170

我无法用相应的传感器数据更新正确的图表(正确的通道片段)。
如何在位置0处的片段中绘制sampledata[0][],在位置1处的片段中绘制sampledata1,依此类推?对channelfragment.getid()的调用总是返回0,尽管我可以在不同片段可见时访问其他属性,如title。
我还修改了tiago redaelli建议的sensorviewmodel。新宣言:

private HashMap<Integer, MutableLiveData<ArrayList<Float>>> sensorLiveData = new HashMap<>();

其中键标识mutablelivedata所属的传感器/片段。但是,该示例没有解释如何将viewmodel(和mutablelivedata值)设置(注入?)到channelfragment。在本例中,实现了方法setviewmodel(),但没有显示调用。
使用这个新的viewmodel定义,如何将每个hashmap值与其对应的片段(谁在调用setviewmodel())相关联?我错过了什么?
提前谢谢丹尼尔

cuxqih21

cuxqih211#

只是一个快速更新。我试图为我的问题创建一个复杂的解决方案,包括以ViewModelFactory为例。在我的解决方案中,我只是在创建channelfragment示例时使用作为参数传递的position/index值调用setviewmodel()(如上所述)。
这似乎起作用了。

相关问题