Изменить поведение прокрутки списка - PullRequest
0 голосов
/ 15 июля 2011

У меня есть список просмотра Android, который получает новые данные каждую секунду.Теперь я хотел бы прокрутить этот список, но каждый раз, когда поступают новые данные, представление перемещается к первому элементу этого списка.Можно ли изменить поведение так, чтобы представление не перемещалось на первый элемент при поступлении новых данных?

Каждый раз, когда я получаю новые данные, я делаю следующее:

if(arg1.getStringExtra("DATA")!=null){
                text = arg1.getStringExtra("DATA").split("\n");
                //Erstellt aus den Daten des Traceservices eine Liste bestehend aus Ergebnissen
                //Result: <(technName,(min,max,invald,color,numeric),aktuellerWert>
                List<Results> results = new ArrayList<Results>();
                if(text.length>0){
                    for(String x:text){
                        Results r = new Results();
                        String []res =x.split("&&&");
                        Values v = dataDictionary.get(res[0]);
                        r.name=res[0];
                        r.setV(v);
                        if(res.length>1){
                            r.setCurrentValues(res[1]);
                        }
                        results.add(r);
                    }
                    ResultAdapter adapter = new ResultAdapter(getApplicationContext(), results);
                    lv.setAdapter(adapter);

                }
            }

ResultAdapter выглядит следующим образом:

public class ResultAdapter extends BaseAdapter {

private Context context;
private List<Results> resultList;

public ResultAdapter(Context context, List<Results> resultList) {
    this.context = context;
    this.resultList = resultList;
}

public int getCount() {
    return resultList.size();
}

public Object getItem(int position) {
    return resultList.get(position);
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
    Results r = resultList.get(position);
    return new ResultAdapterView(this.context, r);
}

}

Не уверен, что вам это нужно, но ResultAdapterView реализован следующим образом:

class ResultAdapterView extends LinearLayout {

public ResultAdapterView(Context context, Results r) {
    super(context);
    this.setOrientation(HORIZONTAL);
    LinearLayout.LayoutParams resParams;
    TextView resName = new TextView(context);
    resParams = new LinearLayout.LayoutParams(170, 25);
    resParams.setMargins(1, 1, 1, 1);
    resName.setPadding(0, 3, 0, 0);
    resName.setText(r.v.getFriendlyName());
    resName.setTextColor(Color.WHITE);
    addView(resName, resParams);

    if(r.v!=null){
        if (!r.v.isNumeric()) {

            TextView currVal = new TextView(context);
            currVal.setText(r.currentValue);
            currVal.setTextColor(Color.WHITE);
            addView(currVal, resParams);

        } else {
            ResultView rv = new ResultView(context, r);
            addView(rv, resParams);
        }
    }
}

}

Заранее благодарим за помощь.

Поздравления

Кристина

1 Ответ

0 голосов
/ 15 июля 2011

Список переходит к началу, потому что вы вызываете «.setAdapter (...)», когда поступают новые данные. Что вам нужно сделать, это расширить ваш адаптер как таковой:

public class ResultAdapter extends BaseAdapter {

private Context context;
private List<Results> resultList;

public ResultAdapter(Context context, List<Results> resultList) {
    this.context = context;
    this.resultList = resultList;
}

public int getCount() {
    return resultList.size();
}

public Object getItem(int position) {
    return resultList.get(position);
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
    Results r = resultList.get(position);
    return new ResultAdapterView(this.context, r);
}

public void setNewData(List<Results> newResults){   
..Add the new data to the current ones or switch, whatever ...
notifyDatasetChanged();
}
}

Каждый раз, когда поступают новые данные, просто вызовите .setNewData () на вашем адаптере, вместо того, чтобы создавать новый адаптер и настраивать его в списке. Обратите внимание на вызов notifyDatasetChanged (), вы должны вызывать его в этих случаях.

...