gpt4 book ai didi

android - 在繁忙的 ListView 中更新 TextView 而不会失去 Spinner 焦点

转载 作者:行者123 更新时间:2023-11-29 15:58:51 26 4
gpt4 key购买 nike

我使用自定义用户率对传感器(这使 ListView 忙碌)进行采样,并在我的 ListView 中显示值,因此我有一个自定义 ListView ,其中包含 3 个 TextView (用于 x、y 和 z 值)和一个微调器。

我的布局是:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="fill_parent">

<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:minWidth="140dp">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="X:"
android:id="@+id/tvX"
android:focusable="false"
android:focusableInTouchMode="false"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Y:"
android:focusable="false"
android:focusableInTouchMode="false"
android:id="@+id/tvY" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Z:"
android:focusable="false"
android:focusableInTouchMode="false"
android:id="@+id/tvZ" />
</LinearLayout>

<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="30dp">

<Spinner
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:id="@+id/spinner"/>
</LinearLayout>

</LinearLayout>

我使用这段代码作为适配器:

public class customListView extends BaseAdapter
{
public Activity context;
ArrayList<MyActivity.SensorProperties> sensorPropertieses;
public String[] spinnerValues;

public LayoutInflater inflater;


public customListView(Activity context, ArrayList<MyActivity.SensorProperties> sensorPropertieses, String[] spinnerArray)
{
super();
this.context = context;
this.sensorPropertieses = sensorPropertieses;
spinnerValues = spinnerArray;
this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
return sensorPropertieses.size();
}

@Override
public Object getItem(int i) {
return null;
}

@Override
public long getItemId(int i) {
return 0;
}

class ViewHolder
{
TextView Xvalue, Yvalue, Zvalue;
Spinner spinner;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup)
{
ViewHolder holder;
if (view == null)
{
holder = new ViewHolder();
view = inflater.inflate(R.layout.custom_layout, null);

holder.Xvalue = (TextView) view.findViewById(R.id.tvX);
holder.Yvalue = (TextView) view.findViewById(R.id.tvY);
holder.Zvalue = (TextView) view.findViewById(R.id.tvZ);
holder.spinner = (Spinner) view.findViewById(R.id.spinner);

// populate spinner
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>
(view.getContext(), android.R.layout.simple_spinner_item, spinnerValues);
holder.spinner.setAdapter(dataAdapter);

view.setTag(holder);
}
else
holder = (ViewHolder) view.getTag();


// update sensor values
holder.Xvalue.setText(String.valueOf("X: " + sensorPropertieses.get(i).x));
holder.Yvalue.setText(String.valueOf("Y: " + sensorPropertieses.get(i).y));
holder.Zvalue.setText(String.valueOf("Z: " + sensorPropertieses.get(i).z));

return view;
}
}

我的主要 Activity 代码是(布局只包含一个按钮和 ListView ):

public class MyActivity extends Activity implements SensorEventListener
{
public class SensorProperties
{
public float x = 0, y = 0, z = 0;
}

ListView listView;
ArrayList<SensorProperties> sensorPropertieses = new ArrayList<SensorProperties>();
customListView adapter;
SensorManager sensorManager;

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

// let's work only on two nodes
sensorPropertieses.add(new SensorProperties());
sensorPropertieses.add(new SensorProperties());

listView = (ListView) findViewById(R.id.listView);
String[] spinnerValues = new String[] {"A", "B", "C"};
adapter = new customListView(MyActivity.this, sensorPropertieses, spinnerValues);
listView.setAdapter(adapter);

Button btnRegister = (Button) findViewById(R.id.buRegister);
btnRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
RegisterToSensors();
}
});
}

void RegisterToSensors()
{
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_GAME);
}

@Override
public void onSensorChanged(SensorEvent sensorEvent)
{
SensorProperties tmp = new SensorProperties();
tmp.x = sensorEvent.values[0];
tmp.y = sensorEvent.values[1];
tmp.z = sensorEvent.values[2];
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
sensorPropertieses.set(0, tmp);
else
sensorPropertieses.set(1, tmp);
adapter.notifyDataSetChanged();
}
///...
}

问题:尽管我更新了 TextView 频率,但我应该如何使用包含 TextView 和 Spinner 的 ListView 而不会丢失微调器焦点?

编辑:由于 mmlooloo 评论,我更改了问题标题和正文。

要清楚:

  • 如果 ListView 不忙,我会成功下拉微调器
  • 当我更新不在 ListView 中的 TextView 频率时,我成功下拉微调器
  • 该问题仅在 ListView 中出现,并且仅在 listview 繁忙时出现

编辑 2:

目前,我不确定问题是否是失去微调器焦点。为了进行调试,我在自定义 ListView 中更新 TextView 中的传感器值之前添加了 30 毫秒的 sleep (在 //update sensor values 之前):

try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}

我成功地下拉了微调器并在 textview 更新时选择了另一个项目(一切都很慢,但有效!)。

新:我现在发现,问题可能出在 adapter.notifyDataSetChanged() 上,因为当我将 TextView 打印

最重要的是,我真的不知道根本原因是什么,但是当我在 ListView 中更新 TextView 频率时我无法下拉微调器,问题是为什么?

我很乐意提供任何帮助,谢谢!

最佳答案

这里的问题是您经常调用 adapter.notifyDataSetChanged();在你的 onSensorChanged 方法中,所以它每次都会绑定(bind) listview您的 getView 每次都会被调用,并且每次都会设置微调值。

我所做的是,在 onSensorChanged 方法中访问了您的 ListView 第一个和第二个子项,并从中访问了 texviews 并根据需要频繁更新它们你也可以访问你的微调器。

@Override
public void onSensorChanged(SensorEvent sensorEvent) {
// SensorProperties tmp = new SensorProperties();
// tmp.x = sensorEvent.values[0];
// tmp.y = sensorEvent.values[1];
// tmp.z = sensorEvent.values[2];
// if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
// sensorPropertieses.set(0, tmp);
// else
// sensorPropertieses.set(1, tmp);
// adapter.notifyDataSetChanged();

Log.i("tag", "ensorEvent.values[0] = " + sensorEvent.values[0]);

if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
View childView = (View) listView.getChildAt(0);
TextView xTextView = (TextView) childView.findViewById(R.id.tvX);
xTextView.setText(String.valueOf(sensorEvent.values[0]));
TextView yTextView = (TextView) childView.findViewById(R.id.tvY);
yTextView.setText(String.valueOf(sensorEvent.values[1]));
TextView zTextView = (TextView) childView.findViewById(R.id.tvZ);
zTextView.setText(String.valueOf(sensorEvent.values[2]));
} else {
View childView = (View) listView.getChildAt(1);
TextView xTextView = (TextView) childView.findViewById(R.id.tvX);
xTextView.setText(String.valueOf(sensorEvent.values[0]));
TextView yTextView = (TextView) childView.findViewById(R.id.tvY);
yTextView.setText(String.valueOf(sensorEvent.values[1]));
TextView zTextView = (TextView) childView.findViewById(R.id.tvZ);
zTextView.setText(String.valueOf(sensorEvent.values[2]));
}

}

关于android - 在繁忙的 ListView 中更新 TextView 而不会失去 Spinner 焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25956742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com