Как обновить SpeedView внутри ListView без начальной анимации? - PullRequest
0 голосов
/ 23 марта 2020

Итак, у меня есть фрагмент с тремя датчиками скорости. Изображение фрагмента Раньше они были непосредственно во фрагменте и работали нормально, но после того, как мне нужно было добавить текстовые просмотры, я не смог все разместить на экране, поэтому я решил создать собственный макет и использовать вид списка для их отображения.

Раньше было очень легко обновлять спидометры, и все работало нормально.

После добавления всего в просмотр списка, единственный способ получить все для обновления - это использовать 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 сегмента).

1 Ответ

0 голосов
/ 24 марта 2020

Я не смог сделать то, что мне нужно было сделать в сегменте списка, но так как я знал точное количество раз, когда я хотел, чтобы этот сегмент отображался, я решил изменить свой подход.

Я добавил скролл-вид в свой основной макет, а затем включил в него макет сегмента 3х. Затем мне нужно было получить доступ ко всем компонентам по идентификатору, подобному этому, чтобы получить доступ к сегменту (макету)

performanceLayout = view.findViewById(R.id.performanceSegment);

, и вот так, чтобы получить доступ к элементам внутри моих сегментов

speedViewPerformance= performanceLayout.findViewById(R.id.segmentSpeedView);

, тогда я мог обновите выступления с помощью следующих функций:

 public void updateOEEplusPerformance (String performance) {
    OEEperformanceValueString=performance;
    speedViewPerformance.speedTo(Float.parseFloat(OEEperformanceValueString));
}

Это намного проще, чем то, что я пытался сделать раньше, так как мне не нужен адаптер или новый класс, мне определенно не нужно менять speedview анимация, и она работает так, как мне нужно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...