【问题标题】:Multiple SeekBars in Adapter, only last SeekBar updates适配器中的多个 SeekBar,仅最后一个 SeekBar 更新
【发布时间】:2016-01-25 11:44:56
【问题描述】:

我有一个 ListView,每行都有一个 SeekBar。列表的大小,因此 SeekBar 的数量会有所不同。

我设置了一个 SeekBar.OnSeekBarChangeListener,然后我根据 SeekBar 显示的整数更新一个 TextView。

问题是列表中只有最后一个 SeekBar 似乎是从 SeekBar.OnSeekBarChangeListener 更新的。

我怎样才能使所有的 SeekBars 工作?

提前致谢。

private class MySimpleArrayAdapter extends ArrayAdapter<String> {
        private final Context context;
        private final ArrayList<?> list;            

        public MySimpleArrayAdapter(Context context, ArrayList<?> list) {

            super(context, R.layout.monitoringrowlayout);
            Log.e(TAG, "inside adapter constructor");
            this.context = context;
            this.list = list;               

        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {    

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View rowView = inflater.inflate(R.layout.monitoringrowlayout, parent, false);

            final int pos = position;               

            Log.e(TAG, "list size in adapter = " + list.size());

            String record = list.get(position).toString();
            rowView.setTag(record);
            String[] itemsInRecord = record.split(",");
            Log.e(TAG, "itemin record = " + itemsInRecord.length);
            String[] recordItem = new String[itemsInRecord.length];

            for (int x = 0; x < itemsInRecord.length; x++) {

                recordItem[x] = itemsInRecord[x];

                Log.e(TAG, "recordItem[x]" + x + " " +recordItem[x] );

            }

            recordItem[0] = recordItem[0].replace('[', ' ').trim();     
            recordItem[3] = recordItem[3].replace(']', ' ').trim(); 

            TextView description =  (TextView) rowView.findViewById(R.id.rowmonitoringdescription);
            description.setText(recordItem[1]);

            rating =  (TextView) rowView.findViewById(R.id.rowmonitoringrating);                

            sb = (SeekBar)rowView.findViewById(R.id.seekbarmonitoring);
            sb.setOnSeekBarChangeListener(customSeekBarListener);

            return rowView;

        }

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

    }// end of adapter class

private SeekBar.OnSeekBarChangeListener customSeekBarListener = new SeekBar.OnSeekBarChangeListener() {

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

        upDateTextBox(progress);

    }
};    

private void upDateTextBox(int progress){

    rating.setText(String.valueOf(progress));       

}

【问题讨论】:

  • 显然是因为您在getView 中设置了rating(用于upDateTextBox)的var ...所以rating 将始终是上次getView 调用中的TextView ...显然你必须将搜索栏与 textview 连接起来......常见的方法是使用 setTag 作为搜索栏和 TextView 参考
  • "只有列表中的最后一个 SeekBar 似乎是从 SeekBar.OnSeekBarChangeListener 更新的" -- 请准确解释这意味着什么。如果您的意思是只有一个 rating 正在更新,那就是 Selvin 所指的。
  • ...此代码还有另一个问题... AdapterView 正在重用项目的视图...使用此类代码,您将无法在将项目滚动出可见项目并返回后获得正确的值

标签: android android-arrayadapter android-seekbar


【解决方案1】:

这显然会发生。

因为sb 将始终是“最后一个”SeekBar,而rating 将始终是“最后一个”评级TextView。

更改您的代码:

    private class MySimpleArrayAdapter extends ArrayAdapter<String> {
    private final Context context;
    private final ArrayList<?> list;


    public MySimpleArrayAdapter(Context context, ArrayList<?> list) {

        super(context, R.layout.monitoringrowlayout);
        Log.e(TAG, "inside adapter constructor");
        this.context = context;
        this.list = list;


    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View rowView = inflater.inflate(R.layout.monitoringrowlayout, parent, false);

        final int pos = position;


        Log.e(TAG, "list size in adapter = " + list.size());



        String record = list.get(position).toString();
        rowView.setTag(record);
        String[] itemsInRecord = record.split(",");
        Log.e(TAG, "itemin record = " + itemsInRecord.length);
        String[] recordItem = new String[itemsInRecord.length];

        for (int x = 0; x < itemsInRecord.length; x++) {

            recordItem[x] = itemsInRecord[x];

            Log.e(TAG, "recordItem[x]" + x + " " +recordItem[x] );

        }

        recordItem[0] = recordItem[0].replace('[', ' ').trim();
        recordItem[3] = recordItem[3].replace(']', ' ').trim();

        TextView description =  (TextView) rowView.findViewById(R.id.rowmonitoringdescription);
        description.setText(recordItem[1]);



        SeekBar sb = (SeekBar)rowView.findViewById(R.id.seekbarmonitoring);
        sb.setOnSeekBarChangeListener(customSeekBarListener);
        sb.setTag(rowView.findViewById(R.id.rowmonitoringrating));






        return rowView;




    }

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

}// end of adapter class



    private SeekBar.OnSeekBarChangeListener customSeekBarListener = new SeekBar.OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            upDateTextBox((TextView) seekBar.getTag(), progress);

        }
    };


    private void upDateTextBox(TextView tv, int progress){

        tv.setText(String.valueOf(progress));


    }
}

【讨论】:

  • 感谢您的回答。请问我如何将getView 中的2 个String 值recordItem[0] 和recordItem[3] 传递给updateTextBox?
猜你喜欢
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多