2016-07-25 3 views
0

У меня есть ситуация, в которой мне нужен совет. У меня есть приложение, которое имеет расширяемое представление списка. Каждый дочерний щелчок посылает пользователя к следующему действию, которое представляет собой макет вкладки со списком. Вкладка имеет 3 вкладки. Я пытаюсь выяснить, как отправить данные в список 3-х списков, когда на кнопку click on expandable listview.Использование одного адаптера для нескольких массивов

Первоначально я собирался установить его в setOnChildClickListener так:

expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 
     @Override 
     public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 
      if (groupPosition == 0) { 
       if (childPosition == 0) { 
        mCustomListViewAdapter.addAdapterItem(new CustomObject("Squats", "60%", "6", "150", false)); 
        listViewFri.setAdapter(mCustomListViewAdapter); 

EDIT: это моя tablayout деятельность, которая настраивает 3 вкладки. Я не уверен, где можно получить доступ к дополнительным компонентам.

public class WorkoutDaysActivity extends BaseActivity { 

ListView listViewFri = (ListView) findViewById(R.id.listViewFri); 
ListView listViewMon = (ListView) findViewById(R.id.listViewMon); 
ListView listViewWed = (ListView) findViewById(R.id.listViewWed); 

/** 
* The {@link android.support.v4.view.PagerAdapter} that will provide 
* fragments for each of the sections. We use a 
* {@link FragmentPagerAdapter} derivative, which will keep every 
* loaded fragment in memory. If this becomes too memory intensive, it 
* may be best to switch to a 
* {@link android.support.v4.app.FragmentStatePagerAdapter}. 
*/ 
private SectionsPagerAdapter mSectionsPagerAdapter 
/** 
* The {@link ViewPager} that will host the section contents. 
*/ 



private ViewPager mViewPager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.workout_days); 
    Bundle extras = getIntent().getBundleExtra("args"); 



    mToolBar = activateToolbarWithHomeEnabled(); 
    setUpNavigationDrawer(); 

    // Create the adapter that will return a fragment for each of the three 
    // primary sections of the activity. 
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.container); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(mViewPager); 



} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_workout_days, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

/** 
* A placeholder fragment containing a simple view. 
*/ 
public static class PlaceholderFragment extends Fragment { 
    /** 
    * The fragment argument representing the section number for this 
    * fragment. 
    */ 
    private static final String ARG_SECTION_NUMBER = "section_number"; 

    public PlaceholderFragment() { 
    } 

    /** 
    * Returns a new instance of this fragment for the given section 
    * number. 
    */ 
    public static PlaceholderFragment newInstance(int sectionNumber) { 
     PlaceholderFragment fragment = new PlaceholderFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 



     switch (getArguments().getInt(ARG_SECTION_NUMBER)) { 
      case 1: 
       View rootView = inflater.inflate(R.layout.fragment_workout_days, container, false); 

       Bundle extras = getArguments(); 
       CustomObject objects = (CustomObject) extras.getSerializable("w29w1"); 




       return rootView; 
      case 2: View rootView2 = inflater.inflate(R.layout.fragment_sub_page1, container, false); 
       TextView textView2 = (TextView) rootView2.findViewById(R.id.textView2); 
       textView2.setText("Workout 29 Week 1"); 
       return rootView2; 
      case 3: 
       View rootView3 = inflater.inflate(R.layout.fragment_sub_page2, container, false); 
       TextView textView3 = (TextView) rootView3.findViewById(R.id.txtFrag3); 
       textView3.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER))); 
       return rootView3; 
      default: View rootView4 = inflater.inflate(R.layout.fragment_workout_days, container, false); 
       TextView textView4 = (TextView) rootView4.findViewById(R.id.txtFrag1); 
       textView4.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER))); 
       return rootView4; 
     } 

    } 
} 

/** 
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to 
* one of the sections/tabs/pages. 
*/ 
public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     // getItem is called to instantiate the fragment for the given page. 
     // Return a PlaceholderFragment (defined as a static inner class below). 
     return PlaceholderFragment.newInstance(position + 1); 
    } 

    @Override 
    public int getCount() { 
     // Show 3 total pages. 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
      case 0: 
       return "Monday"; 
      case 1: 
       return "Wednesday"; 
      case 2: 
       return "Friday"; 
     } 
     return null; 
    } 
} 
} 

Я думал, что это будет идти в этой части, как так:

switch (getArguments().getInt(ARG_SECTION_NUMBER)) { 
      case 1: 
       View rootView = inflater.inflate(R.layout.fragment_workout_days, container, false); 

       Bundle extras = getArguments(); 
       CustomObject objects = (CustomObject) extras.getSerializable("w29w1"); 
       CustomListViewAdapter customListViewAdapter = new CustomListViewAdapter(this, objects); 

Но им получает сообщение об ошибке при (это, объекты), говоря «не может быть применен к .placeholderfragment .custom объекта» «PlaceholderFragment не могут быть преобразованы в контексте»

Это то, что я кладу в onChildClick:

Bundle extras = new Bundle(); 
        final ArrayList<CustomObject> objects = new ArrayList<CustomObject>(); 
        objects.add(new CustomObject("Squat", "65%", "6", "150", false)); 
        extras.putSerializable("w29w1", objects); 

        Intent intent = new Intent(getApplicationContext(), WorkoutDaysActivity.class); 
        intent.putExtra("args", extras); 
        startActivity(intent); 

Спасибо за помощь! сообщите мне, если вам нужно увидеть какой-либо из моих кодов, чтобы лучше понять, что я пытаюсь сделать!

ответ

1

У меня возникли трудности с пониманием вопроса полностью, но вот мои мысли до сих пор.

Вы пытаетесь установить один и тот же экземпляр адаптера списка в каждом списке? Если вам требуется одинаковое общее поведение, но для привязки разных данных к списку, убедитесь, что вы создаете экземпляры новых адаптеров для каждого списка.

т.е.

myList1.setAdapter(new MyAdapter()); 
myList2.setAdapter(new MyAdapter()); 

, а не

MyAdapter myAdapter = new MyAdapter(); 
myList1.setAdapter(myAdapter); 
myList2.setAdapter(myAdapter); 

Кроме того, оно имеет смысл, чтобы переместить данные через намерения при обмене данными с другой деятельностью. В своем начальном действии, когда действие вызывает запуск следующего действия, поставьте его в намерение до вызова startActivity(). Затем в следующем действии вы вызовете getIntent().getXXXExtra("..."), где XXX соответствует типу, который вы извлекаете, а ... - это правильный ключ, который вы добавили в дополнение к предыдущему действию.

Если вы используете фрагменты, содержащиеся в действиях, используйте Fragment.setArguments() (в действии2) и Fragment.getArguments() (в фрагменте2), чтобы передать дополнительные функции от фрагмента1 до Activity2 в фрагмент2.

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

Например, ...

@Override 
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 
if (groupPosition == 0) { 
    if (childPosition == 0) { 
     Bundle extras = new Bundle(); 
     // Put all the extras you need. This can be primitives like int, boolean, double, or complex objects using the Serializable interface 
     // For example, say your CustomObject implements Serializable 
     CustomObject customObject = new CustomObject("Squats", "60%", "6", "150", false); 
     extras.putSerializable("object_key_here", customObject); 

     Intent intent = new Intent(getContext(), NextActivityHere.class); 
     intent.putExtra("args", extras); 
     startActivity(intent); 
    } 
} 

В своей деятельности, содержащий фрагмент, который содержит список:

// Likely in onCreate() 
Bundle extras = getIntent.getBundleExtra("args"); 
MyFragment myFragment = new MyFragment(); 
myFragment.setArguments(extras); 
// Use fragment manager to add the fragment to your view 

В фрагменте (myFragment), содержащий список:

// Likely in onCreate() 
Bundle extras = getArguments(); 
CustomObject customObject = (CustomObject) extras.getSerializable("object_key_here"); 

// Now you can use the object to set up the adapter, etc... 

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

+0

Спасибо за ответ. Да, я хочу такое же общее поведение, просто разные наборы данных. Так что, если бы я сделал, как ваш пример myList2.setAdapter (новый MyAdapter), смогу ли я сделать это для как можно большего числа arraylists? Как я могу указать приложение, список которого нужно использовать? Кроме того, я не совсем уверен, как использовать фрагмент.setArguements. Мой вкладка - 3 разных фрагмента. Каждый из них содержит список, который я хочу заполнить указанными аррайалистами. Я также не уверен, где бы я установил адаптеры для заполнения списков. – LBJ33

+0

Будет ли это работать, если я положу что-то вроде намерения.putExtra, чтобы проверить, какая кнопка была нажата? Мне действительно не нужно передавать строку или что-то еще, но если я отправлю строку из childOnClick в раскрывающемся списке, тогда поставьте оператор if, чтобы увидеть, содержит ли это намерение эту строку в классе tablayout, поэтому я знаю, что данные для ввода .. это сработает? Извините трудно объяснить .. имеет больше смысла в моей голове lol – LBJ33

+0

Так что у меня создается впечатление, что каждый фрагмент имеет один ListView (listView). В каждом фрагменте вы вызываете listView.setAdapter (myAdapter), вероятно, в 'onStart()', 'onResume()' или что-то в начале жизненного цикла фрагмента (https://developer.android.com/guide/components/fragments. HTML # Создание). –

1

Макеты с вкладками

Вы можете сделать некоторое чтение на TabLayouts и ViewPagers. Это модели, используемые для создания выгружаемых макетов с вкладками.

Реализация этих представлений должна значительно снизить сложность Activity. Внутри метода вашей деятельности onCreate() вы должны настроить TabLayout и ViewPager для размещения ваших фрагментов в понедельник, среду и пятницу.

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

Список MY Предположения

  • Предположим, файл XML называется activity_tab_host.xml
    • Предположим TabLayout имеет идентификатор = "tab_layout"
    • Предположим, ViewPager имеет id = "view_pager"
  • Предположим, что файл деятельность называется TabHostActivity.java
  • Предположим, фрагмент со списком называется WorkoutDetailFragment.java
    • Предположим, ваш фрагмент принимает данные через конструктор. Вы можете либо сделать это, либо передать его через аргументы, как вы это делали. Я просто пытаюсь свести к минимуму код, общаясь с общей идеей. Фрагмент просто должен получить данные!Постарайтесь не повредить определенные методы и код, показанные здесь; вам может быть проще передавать данные через конструктор и т. д.
    • Предположим, что список данных готова в ArrayLists из CustomObjects, просто называют mondayData, wednesdayData и fridayData
  • Предположим, вы создали свой собственный адаптер под названием SectionsPagerAdapter

Guidance Код (не 100% от того, что требуется)

Получить мнения TabLayout и ViewPager из исходного зрения XML-файла:

// TabHostActivity.java::onCreate() 
setContentView(R.layout.activity_tab_host); 
TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager); 

Настройка ViewPager:

// TabHostActivity.java::onCreate() 
SectionsPagerAdapter adapter = new SectionsPagerAdapter(getFragmentManager()); 

// Create fragment to populate the tabs 
WorkoutDetailFragment mondayFragment = new WorkoutDetailFragment(mondayData); 
WorkoutDetailFragment wednesdayFragment = new WorkoutDetailFragment(wednesdayData); 
WorkoutDetailFragment fridayFragment = new WorkoutDetailFragment(fridayData); 

// Add pages (fragments) to the adapter, passing the fragment and tab title 
adapter.addFragment(mondayFragment, "Monday"); 
adapter.addFragment(wednesdayFragment, "Wednesday"); 
adapter.addFragment(fridayFragment, "Friday"); 

// Tie the adapter to your ViewPager 
viewPager.setAdapter(adapter); 

Галстук ViewPager к TabView:

// TabHostActivity.java::onCreate() 
tabLayout.setupWithViewPager(viewPager); 

Главная takeoutay относительно того, где создавать новые фрагменты ... ViewPager - это устройство, используемое для хранения фрагментов, позволяющее пользователю изменять эти фрагменты i n одно действие. Вы должны создавать экземпляры в действии TabHostActivity.java и настраивать фрагменты в ViewPager.

Мой вышеприведенный пример упрощает ситуацию, передавая данные списка через конструктор WorkoutDetailFragment. Это один из двух простых способов передачи данных фрагменту.

Передача данных через конструктор фрагмента:

public class WorkoutDetailFragment extends Fragment { 

    private ArrayList<Object> listData; 

    public WorkoutDetailFragment(ArrayList<Object> listData) { 
     this.listData = listData; 
    } 

    // Rest of the code for the fragment... 

} 

Передача данные через аргументы фрагмента

// TabHostActivity.java 
Bundle args = new Bundle(); // May have received this bundle from extras already. If so, use Bundle args = getIntent.getExtra(... 
args.putExtra("list_data", listData); // Where listData is an ArrayList<CustomObject> in your case (Monday/Wednesday/Friday data) 

WorkoutDetailFragment fragment = new WorkoutDetailFragment(); 
fragment.setArguments(args); 
// Add the fragment to the view pager... 
// Inside WorkoutDetailFragment.java retrieve list data from args using getArguments().getSerializable("list_data") 

Надеется, что это помогает!

+0

Это очень помогает, большое спасибо! – LBJ33

Смежные вопросы