SeekBar в ListActivity с использованием ArrayAdapter - PullRequest
0 голосов
/ 02 июня 2011

Я не привязан к использованию ArrayAdapter, но мне нужен список, в котором каждый элемент содержит ImageView, TextView и SeekBar, где я могу обновлять изображения / тексты, а также получать обратные вызовы от каждого ползунка (очевидно, мне нужно иметь возможность добавлять и удалять строки динамически).

У меня нет проблем с созданием списка, который содержит эти элементы, которые являются статическими -> т.е. определены в макете xml для каждой строки моего списка. Однако при этом я не могу «перезаписать методы обратного вызова onStartTrackingTouch (), onProgressChanged () и т. Д.». Я также могу создать список, который «содержит только панели поиска», и я могу получить обратные вызовы. Проблема в том, что я ввожу LayoutInflater, а затем пытаюсь добавить свои панели поиска в макет.

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

У кого-нибудь есть решение? Код

То, что я получил до сих пор, выглядит примерно так:

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. Мне действительно все равно, как решить проблему, мне просто нужен список «динамически изменяемого размера», в котором каждый элемент содержит изображение, текстовое представление и панель поиска, и где я могу изменить каждый из них и получать обратные вызовы для каждой отдельной панели поиска. (если решение масштабируется, это было бы круто, но, скорее всего, это не является обязательным требованием, поскольку список, скорее всего, будет содержать не более 20 пунктов)

1 Ответ

1 голос
/ 10 октября 2011

Ладно, думаю, я наконец понял это (разве вы не узнаете об этом вскоре после этого поста).Используя руководство по адресу: http://www.vogella.com/tutorials/AndroidListView/article.html#listsactivity, похоже, что оно работает сейчас.

...