【问题标题】:RecyclerView not filling(Arrays)RecyclerView 未填充(数组)
【发布时间】:2019-04-26 17:49:58
【问题描述】:

我搜索了很多,但找不到我的 RecyclerView 没有显示所有数据的原因。 在“MySensorAdapter”中将数据打印到控制台时,值是完整的。

代码如下,非常感谢。

公共类 MySensorAdapter 扩展 RecyclerView.Adapter {

private String[] mKeys;
private String[] mValues;

public MySensorAdapter(HashMap<String, String> dictionary){
    mKeys = new String[dictionary.size()];
    mValues = new String[dictionary.size()];

    for(String i : dictionary.keySet()){
        int count = 0;
        mKeys[count]=i;
        mValues[count] = dictionary.get(i);
        count++;
    }

}

public static class MyViewHolder extends RecyclerView.ViewHolder{

    public TextView mTextViewTitle;
    public TextView mTextViewData;

    public MyViewHolder(View v){
        super(v);
        mTextViewTitle = v.findViewById(R.id.textViewTitle);
        mTextViewData = v.findViewById(R.id.textViewData);
    }
}

@NonNull
@Override
public MySensorAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_sensor_item, parent, false);

    MySensorAdapter.MyViewHolder viewHolder = new MySensorAdapter.MyViewHolder(v);
    return viewHolder;
}

@Override
public void onBindViewHolder(@NonNull MySensorAdapter.MyViewHolder holder, int position) {
    String title=mKeys[position];
    String data=mValues[position];

    Log.i("DEBUG POSITION", String.valueOf(position));

    holder.mTextViewTitle.setText(title);
    holder.mTextViewData.setText(data);
}

@Override
public int getItemCount() {
    if(mKeys != null){
        Log.i("DEBUG LENGTH", String.valueOf(mKeys.length));

        return mKeys.length;
    }
    return 0;
}

}

编辑:也许这也有帮助。我只想在回收站视图中显示传感器信息

public class SensorDataActivity extends AppCompatActivity implements SensorEventListener {

private SensorManager mSensormanager;

private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;

private HashMap<String, String> list = new HashMap<>();

private Sensor mSensor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sensor_data);

    Intent intent = getIntent();
    int position = intent.getIntExtra("position", 0);

    Log.i("WICHTIG", String.valueOf(position));


    mSensormanager = (SensorManager) getSystemService(SENSOR_SERVICE);
    assert mSensormanager != null;
    List<Sensor> sensors = mSensormanager.getSensorList(Sensor.TYPE_ALL);



    //Debugging to be done!
    int type = sensors.get(position).getType();

    Log.i("WICHTIG", String.valueOf(type));

    mSensor = mSensormanager.getDefaultSensor(type);

    getSensorInformation(mSensor);

    mRecyclerView = findViewById(R.id.my_sensor_recycler_view);
    mRecyclerView.setHasFixedSize(true);

    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);

    mAdapter = new MySensorAdapter(list);
    mRecyclerView.setAdapter(mAdapter);

}

private void getSensorInformation(Sensor sensor){

    list.put("Name", sensor.getName());
    list.put("Type", String.valueOf(sensor.getType()));
    list.put("Version", String.valueOf(sensor.getVersion()));

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        list.put("Id", String.valueOf(sensor.getId()));
        list.put("Type(String)", sensor.getStringType());
    }

    list.put("Power", String.valueOf(sensor.getPower()));
    list.put("Vendor",sensor.getVendor());
    list.put("MaximumRange",String.valueOf(sensor.getMaximumRange()));
    list.put("Resolution",String.valueOf(sensor.getResolution()));
    list.put("MinDelay",String.valueOf(sensor.getMinDelay()));


    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        list.put("MaximumDelay",String.valueOf(sensor.getMaxDelay()));
        list.put("FifoMaxEvent",String.valueOf(sensor.getFifoMaxEventCount()));
        list.put("FifoReservedEvent",String.valueOf(sensor.getFifoReservedEventCount()));
        list.put("ReportingMode",String.valueOf(sensor.getReportingMode()));
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        list.put("HighestDirectReportRate",String.valueOf(sensor.getHighestDirectReportRateLevel()));
    }



}

@Override
public void onSensorChanged(SensorEvent event) {

    for(int i = 0; i<event.values.length; i++) {

        String key = "Value"+String.valueOf(i);

        list.put(key, String.valueOf(event.values[i]));
    }

    mAdapter.notifyDataSetChanged();

}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    list.put("Accuracy", String.valueOf(accuracy));
    mAdapter.notifyDataSetChanged();
}

@Override
protected void onResume() {
    super.onResume();
    mSensormanager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
protected void onPause() {
    super.onPause();
    mSensormanager.unregisterListener(this);
    }

}

【问题讨论】:

  • 你为回收站视图设置了LayoutManager吗?
  • 是的,请参阅我的编辑了解更多详细信息。通过传递一个数组,它工作得很好,但是因为我必须选择一个字典,因为“OnSensorChange”,如果只在我的 recyclerview 中显示一个项目(名称)
  • 没有错误。我的回收站视图只有奇怪的渲染
  • 它们不完整或根本没有显示?您可以发布结果的屏幕截图吗?这可能会有所帮助
  • 只有第一项可见?

标签: android android-studio android-recyclerview


【解决方案1】:

计数值每次在

for(String i : dictionary.keySet()){
    int count = 0;
    mKeys[count]=i;
    mValues[count] = dictionary.get(i);
    count++;
}

因此,用于显示 UI 的数据集每次只有一个元素。 您可以尝试在循环外初始化计数。

【讨论】:

  • 犯下如此愚蠢的错误真是令人沮丧!非常感谢,我真的很绝望。
  • 没关系。很高兴解决了这个问题。干杯!
【解决方案2】:

只需从适配器构造函数中删除 int count = 0;像这样在循环之前从循环初始化它

public MySensorAdapter(HashMap<String, String> dictionary) {
        mKeys = new String[dictionary.size()];
        mValues = new String[dictionary.size()];
        int count = 0;
        for (String i : dictionary.keySet()) {
            mKeys[count] = i;
            mValues[count] = dictionary.get(i);
            count++;
        }

    }

你很高兴

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多