使用ArrayAdapter在ListActivity中SeekBar

时间:2011-06-02 06:47:30

标签: android listactivity android-arrayadapter seekbar layout-inflater

我不喜欢使用ArrayAdapter但是,我想要的是一个列表,其中每个项目包含一个ImageView,一个TextView和一个SeekBar,我可以在其中更新图像/文本以及从每个滑块接收回调(显然,我需要能够动态添加和删除行。)

我创建一个包含静态项目的列表也没有问题 - >即在我的列表的每一行的xml布局中定义。但是,有了这个,我无法“覆盖'onStartTrackingTouch()','onProgressChanged()'等回调方法”。我还可以创建一个“仅包含搜索栏”的列表,我可以获得回调。问题是当我引入LayoutInflater然后尝试将我的搜索栏添加到布局时。

经过几天的搜索并在互联网上搜索,我仍然看不到有一个listactivity的解决方案,使用layoutinflator来创建由imageview,textview和seekbar组成的复合列表行,我可以正确沟通。

有没有人有解决方案?码?

到目前为止我所得到的是:

public class MyListActivity extends ListActivity
{   
    private class MyView {
        public ImageView myImageView = null;
        public TextView myTextView = null;
        public SeekBar mySeekBar = null;        
    }

  private class MyAdapter extends ArrayAdapter<MyView> {                
    private ArrayList<MyView> arrayList;
    private MyListActivity theContext = null;

    public MyAdapter(MyListActivity context, 
                  int textViewResourceId,
                  ArrayList<MyView> arrayListPassedIn) {
        super(context, textViewResourceId, arrayListPassedIn);
        this.volumeControls = arrayListPassedIn;
        theContext = context;
    } 

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

        if (v == null) {
            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);                
            v = vi.inflate(R.layout.dont_think_i_should_need_to_use_a_resource_here_cuz_it_should_be_generated_or_dynamic, parent, false);
        }

        arrayList.get(position).myImageView = new ImageView(theContext);
        arrayList.get(position).myImageView.setBackgroundResource(R.drawable.generic_image);

        if(position == 0)
        {   
            arrayList.get(position).mySeekBar = new SeekBar(theContext);        
            arrayList.get(position).mySeekBar.setMax(100);
            arrayList.get(position).mySeekBar.setEnabled(true);
            arrayList.get(position).mySeekBar.setOnSeekBarChangeListener(
                new SeekBar.OnSeekBarChangeListener() {                         
                    @Override
                    public void onStopTrackingTouch(SeekBar seekBar) {
                        Log.d("test", "0th seekbar touched");                
                    }

                    @Override
                    public void onStartTrackingTouch(SeekBar seekBar) {
                        Log.d("test", "0th seekbar touch lifted");
                    }

                    @Override
                    public void onProgressChanged(SeekBar seekBar, int arg1, boolean fromUser) {
                        Log.d("test", "0th seekbar progress changed");                                         
                    }
                }
            );                                  
        }
        else
        {               
            arrayList.get(position).mySeekBar = new SeekBar(theContext);        
            arrayList.get(position).mySeekBar.setMax(100);
            arrayList.get(position).mySeekBar.setEnabled(true);
            arrayList.get(position).mySeekBar.setOnSeekBarChangeListener(
                new SeekBar.OnSeekBarChangeListener() {                         
                    @Override
                    public void onStopTrackingTouch(SeekBar seekBar) {
                        Log.d("test", "*not* 0th seekbar touched");                
                    }

                    @Override
                    public void onStartTrackingTouch(SeekBar seekBar) {
                        Log.d("test", "*not* 0th seekbar touch lifted");
                    }

                    @Override
                    public void onProgressChanged(SeekBar seekBar, int arg1, boolean fromUser) {
                        Log.d("test", "*not* 0th seekbar progress changed");                                           
                    }
                }
            );
        }

        //***this is the fuzzy part -> I need to be able to obtain the layout for the 'parent ViewGroup' or something
        //to where I can somehow add my seekbar (and textview and imageview) and then return the 'parent view'
        //that is to say that, this method is required to return a View and I want to return a View that composits
        //my imageview, textview, and seekbar.  One main problem seems to be that an ArrayAdapter won't allow me to add
    //child views dynamically.
        final View viewToAdd = arrayList.get(position). mySeekBar;            
        LinearLayout layout = ???;//new LinearLayout(theContext);             
        layout.post(new Runnable() {
            public void run() {
                layout.addView(viewToAdd);
                layout.destroyDrawingCache();
                layout.buildDrawingCache();
            }
        });

      return ???;   //layout.view??  Can I obtain the 'parent view' (the view for the entire row) somehow to return?
    }        
}

private ArrayList<MyView> myArrayList;
    private MyAdapter myAdapter;

@Override
    public void onCreate(Bundle savedInstanceState) {
    try {           
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_for_the_list_activity_all_it_contains_is_a_linearlayout_containing_the_listview);
        myArrayList = new ArrayList<MyView>();
        myArrayList.add(new MyView());
        myArrayList.add(new MyView());
            mAdapter = new SettingsListViewArrayAdapter(this, R.layout.wtf_not_sure_what_I_should_put_here, this.myArrayList);
            setListAdapter(mAdapter);           
    } catch (NullPointerException e) {
        Log.v(getString(R.string.app_name), e.getMessage());
    }
  } 
}

据我所知,我很偏离轨道。从它的外观来看,它甚至不可能?有人请帮忙!? (并提前感谢= -D)

P.S。我真的不在乎如何解决问题,我只需要一个'动态调整大小'列表,其中每个项目包含一个imageview,textview和seekbar,以及我可以修改每个项目并接收每个搜索栏的回调。 (如果解决方案规模扩大,那将是很酷的,但肯定不是一个要求,因为列表通常可能只包含少于20个项目)

1 个答案:

答案 0 :(得分:1)

好吧,我想我终于搞清楚了(你不知道这个帖子后不久)。使用http://www.vogella.com/tutorials/AndroidListView/article.html#listsactivity处的指南,现在看来它正在运作。