Итак, у меня есть фрагмент с тремя датчиками скорости. Изображение фрагмента Раньше они были непосредственно во фрагменте и работали нормально, но после того, как мне нужно было добавить текстовые просмотры, я не смог все разместить на экране, поэтому я решил создать собственный макет и использовать вид списка для их отображения.
Раньше было очень легко обновлять спидометры, и все работало нормально.
После добавления всего в просмотр списка, единственный способ получить все для обновления - это использовать notifyDataSetChanged () на адаптере, но когда я это делаю, индикатор датчика привязывается к 0 и поднимается до желаемый номер оттуда. Я пытался использовать держатель, чтобы решить проблему, но не повезло.
Это фрагмент кода о том, как я создаю адаптер
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
OEEsegmentList = (ListView) view.findViewById(R.id.OEEplusLV);
qualitySegment = new OEEListSegment("Quality", OEEqualityValueString, "Bad parts: "+OEEqualityBadPartsValueString, "Total parts: "+OEEqualityTotalPartsValueString);
availabilitySegment = new OEEListSegment("Availability", OEEavailabilityValueString, "Downtime: "+OEEavailabilityDowntimeValueString, "Next time: "+OEEavailabilityNextTimeValueString);
performanceSegment = new OEEListSegment("Performance", OEEperformanceValueString, "Act time: "+OEEperformanceActTimeValueString, "Takt time: "+OEEperformanceTaktTimeValueString);
OEEsegmentArrayList = new ArrayList<>();
OEEsegmentArrayList.add(qualitySegment);
OEEsegmentArrayList.add(availabilitySegment);
OEEsegmentArrayList.add(performanceSegment);
OEEadapter = new OEEListAdapter(getActivity(), R.layout.oee_list_layout, OEEsegmentArrayList);
OEEsegmentList.setAdapter(OEEadapter);
}
, а вот одна из функций обновления, все они в основном представляют собой один и тот же код с разными именами. Я вызываю их в основном задании, когда получаю сообщение об изменении конкретного маркера.
public void updateOEEplusAvailability (String availability) {
OEEavailabilityValueString=availability;
availabilitySegment.setSegmentValueDial(OEEavailabilityValueString);
OEEadapter.notifyDataSetChanged();
}
это весь мой адаптер списка
public class OEEListAdapter extends ArrayAdapter<OEEListSegment> {
private Context mContext;
int mResource;
public ArrayList<OEEListSegment> mSegments ;
public OEEListAdapter(@NonNull Context context, int resource, @NonNull ArrayList<OEEListSegment> objects) {
super(context, resource, objects);
mContext = context;
mResource = resource;
mSegments=objects;
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
holder = new ViewHolder();
String name = getItem(position).getSegmentName();
String valueDial = getItem(position).getSegmentValueDial();
String valueTV1 = getItem(position).getSegmentValueTV1();
String valueTV2 = getItem(position).getSegmentValueTV2();
final OEEListSegment Segment = new OEEListSegment(name, valueDial, valueTV1, valueTV2);
LayoutInflater inflater = LayoutInflater.from(mContext);
convertView = inflater.inflate(mResource, parent, false);
TextView textViewName = (TextView) convertView.findViewById(R.id.textViewSegmentName);
holder.speedView = (SpeedView) convertView.findViewById(R.id.segmentSpeedView);
holder.textViewFirst = (TextView) convertView.findViewById(R.id.textViewSegmentFirst);
holder.textViewSecond=(TextView) convertView.findViewById(R.id.textViewSegmentSecond);
convertView.setTag(holder);
holder.textViewFirst.setText(mSegments.get(position).getSegmentValueTV1());
holder.textViewSecond.setText(mSegments.get(position).getSegmentValueTV2());
holder.speedView.speedTo(Float.parseFloat(mSegments.get(position).getSegmentValueDial()));
holder.speedView.clearSections();
holder.speedView.addSections(
new Section(.3f, Color.RED)
, new Section(.7f, Color.YELLOW)
, new Section(1f, Color.GREEN));
textViewName.setText(name);
holder.textViewFirst.setText(valueTV1);
holder.textViewSecond.setText(valueTV2);
holder.speedView.speedTo(Float.parseFloat(valueDial));
return convertView;
}
@Override
public int getViewTypeCount() {
return getCount();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public int getCount() {
return mSegments.size();
}
public Object getItemCustom(int position) {
return mSegments.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
private class ViewHolder {
protected SpeedView speedView ;
private TextView textViewFirst ;
private TextView textViewSecond;
}
}
И это код сегмента списка
public class OEEListSegment implements Parcelable {
private String name;
private String valueDial;
private String valueTV1;
private String valueTV2;
public OEEListSegment(String name, String valueDial, String valueTV1, String valueTV2) {
this.name=name;
this.valueDial=valueDial;
this.valueTV1=valueTV1;
this.valueTV2=valueTV2;
}
public String getSegmentName() {
return name;
}
public void setSegmentName(String name) {
this.name=name;
}
public String getSegmentValueDial() {
return valueDial;
}
public void setSegmentValueDial(String valueDial) {
this.valueDial=valueDial;
}
public String getSegmentValueTV1() {
return valueTV1;
}
public void setSegmentValueTV1(String valueTV1) {
this.valueTV1=valueTV1;
}
public String getSegmentValueTV2() {
return valueTV2;
}
public void setSegmentValueTV2(String valueTV2) {
this.valueTV2=valueTV2;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] {this.name, this.valueDial, this.valueTV1, this.valueTV2});
}
private void readFromParcel(Parcel in) {
name = in.readString();
valueDial= in.readString();
valueTV1= in.readString();
valueTV2= in.readString();
}
public OEEListSegment(Parcel in){
String[] data = new String[4];
in.readStringArray(data);
// the order needs to be the same as in writeToParcel() method
this.name = data[0];
this.valueDial= data[1];
this.valueTV1= data[2];
this.valueTV2= data[3];
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public OEEListSegment createFromParcel(Parcel in) {
return new OEEListSegment(in);
}
public OEEListSegment[] newArray(int size) {
return new OEEListSegment[size];
}
};
}
Любое решение будет оценено. Либо, как остановить эту начальную анимацию (от 0 до нужного числа) в режиме быстрого просмотра, или как обновить список, чтобы анимация не появлялась.
Или лучше было бы полностью опустить представление списка, но при этом получить желаемый макет (будет только 3 сегмента).