2016-08-10 2 views
0

У меня есть базовая таблица в базе данных под названием «Категория». Затем другие две таблицы, называемые категориями 1 и 2, имеют отношение «один ко многим» к таблице категорий. Его, как это: -Настройка ListView два раза в классе фрагментов

**Category Table** 
Id Category 
0  Category1 (One) -> Category1 Table (Many). 
1  Category2 (One) -> Category2 Table (Many). 

Я использую Tab менеджер, который будет показывать обе категории из категории таблицы и список элементов в виде списка в одной вкладке с category1 или category2 таблицы, а другой в другой вкладке. Но проблема, с которой я столкнулась, заключается в том, что я пытаюсь установить адаптер в listview на основе инструкции if-else. Таким образом, он показывает только элементы категории1, а не категории2, когда я нажимаю на категорию2 на вкладке. Я знаю, что я не мог установить два адаптера в одном списке на основе исследований, которые я сделал. Есть ли решение? Ниже мой код.

FragmentClass

public class CategoryFragment extends Fragment{ 

    private ListView listView; 
    private String currentTabTag; 
    private CategoryAdapter1 categoryAdapter1; 
    private CategoryAdapter2 categoryAdapter2; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.activity_category_fragment_list, container, false); 

     // get references to widgets 
     listView = (ListView) view.findViewById (R.id.prescriptorsListView); 

     // get the current tab 
     TabHost tabHost = (TabHost) container.getParent().getParent(); 
     currentTabTag = tabHost.getCurrentTabTag(); 

     // refresh the category list view 
     refreshCategoryList(); 

     // return the view 
     return view; 
    } 

    public void refreshCategoryList() { 
     // get category list for current tab from database 
     Context context = getActivity().getApplicationContext(); 
     CategoryDatabase categoryDatabase = new CategoryDatabase(context); 

     if(currentTabTag.equals("Category 1")) { 
      ArrayList<Category1> category1ArrayList = categoryDatabase.getAllCategory1(currentTabTag); 
      // create adapter and set it in the ListView widget 
      listView = new Category1Adapter(context, category1ArrayList); 
      listView.setAdapter(Category1Adapter); 
     } 
     else if(currentTabTag.equals("Category 2")) 
     { 
      ArrayList<Category2> category2ArrayList = categoryDatabase.getAllCategory2(currentTabTag); 
      // create adapter and set it in the ListView widget 
      listView = new Category2dapter(context, category2ArrayList); 
      listView.setAdapter(Category2Adapter); 
     } 

    } 
    @Override 
    public void onResume() { 
     super.onResume(); 
     refreshTaskList(); 
    } 
} 

Адаптер category1

public class Category1Adapter extends BaseAdapter { 
    private Context context; 
    private ArrayList<Category1> category1ArrayList; 

    public Category1Adapter(Context context, ArrayList<FamilyPrescription> category1ArrayList) { 
     this.context = context; 
     this.category1ArrayList = category1ArrayList; 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return category1ArrayList.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Category1TaskLayout taskLayout = null; 
     Category1 category1 = category1ArrayList.get(position); 

     if (convertView == null) { 
      taskLayout = new Category1TaskLayout(context, category1); 
     } else { 
      taskLayout = (Category1TaskLayout) convertView; 
      taskLayout.setCategory1(category1); 
     } 
     return taskLayout; 
    } 
} 

Адаптер category2 аналогичен выше адаптера.

Любая помощь будет оценена :)

+0

Если у Вас есть один 'ListView' Вы должны использовать один адаптер управления вкладками изменения (' adapter.notifyDataSetChanged () ') – marioosh

+0

Можете ли вы объяснить, как использовать вышеприведенный пример, если это возможно –

ответ

0

Как я предложил, я думал об использовании одного адаптера.

private class OneAdapter extends BaseAdapter { 

    List<Category1> cat1 = categoryDatabase.getAllCategory1(currentTabTag); 
    List<Category2> cat2 = categoryDatabase.getAllCategory2(currentTabTag); 

    @Override 
    public int getCount() { 
     if(currentTabTag.equals("Category 1")) { 
      return cat1.size(); 
     } else if(currentTabTag.equals("Category 2")) { 
      return cat2.size(); 
     } 
     return 0; 
    } 

    @Override 
    public Object getItem(int position) { 
     if(currentTabTag.equals("Category 1")) { 
      return cat1.get(position); 
     } else if(currentTabTag.equals("Category 2")) { 
      return cat2.get(position); 
     } 
     return null; 
    } 

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

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

     //... 

     Object c = getItem(position); 
     if(c instanceof Category1) { 
      ... 
     } else if(c instanceof Category2) { 
      ... 
     } 

     return convertView; 
    } 
} 

Поскольку вкладка изменена, необходимо обновить адаптер;

tabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() { 
     @Override 
     public void onTabChanged(String tabId) { 
      currentTabTag = tabHost.getCurrentTabTag(); 
      adapter.notifyDataSetChanged(); 
     } 
    }); 

Полный рабочий пример в деятельности:

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ListView; 
import android.widget.TabHost; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 

public class Main2Activity extends AppCompatActivity { 

    TabHost tabHost; 
    ListView listView; 
    String currentTabTag; 
    CategoryDatabase categoryDatabase; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main2); 

     tabHost = (TabHost) findViewById(android.R.id.tabhost); 
     tabHost.setup(); 
     TabHost.TabSpec tab1 = tabHost.newTabSpec("Category 1"); 
     TabHost.TabSpec tab2 = tabHost.newTabSpec("Category 2"); 
     tab1.setContent(R.id.tab1); 
     tab1.setIndicator("Cat1"); 
     tab2.setContent(R.id.tab2); 
     tab2.setIndicator("Cat2"); 
     tabHost.addTab(tab1); 
     tabHost.addTab(tab2); 

     categoryDatabase = new CategoryDatabase(); 

     currentTabTag = tabHost.getCurrentTabTag(); 

     listView = (ListView) findViewById(android.R.id.list); 

     listView.setAdapter(new TabAdapter()); 
     tabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() { 
      @Override 
      public void onTabChanged(String tabId) { 
       currentTabTag = tabHost.getCurrentTabTag(); 
       ((BaseAdapter)listView.getAdapter()).notifyDataSetChanged(); 
      } 
     }); 
    } 

    private class TabAdapter extends BaseAdapter { 

     @Override 
     public int getCount() { 
      if(currentTabTag.equals("Category 1")) { 
       return categoryDatabase.getAllCategory1().size(); 
      } else if(currentTabTag.equals("Category 2")) { 
       return categoryDatabase.getAllCategory2().size(); 
      } 
      return 0; 
     } 

     @Override 
     public Object getItem(int position) { 
      if(currentTabTag.equals("Category 1")) { 
       return categoryDatabase.getAllCategory1().get(position); 
      } else if(currentTabTag.equals("Category 2")) { 
       return categoryDatabase.getAllCategory2().get(position); 
      } 
      return null; 
     } 

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

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      final ViewHolder holder; 
      if(convertView == null) { 
       convertView = LayoutInflater.from(Main2Activity.this).inflate(android.R.layout.simple_list_item_1, parent, false); 
       holder = new ViewHolder(convertView); 
       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      Object c = getItem(position); 
      if(c instanceof Category1) { 
       Category1 c1 = (Category1) c; 
       holder.text1.setText(c1.text); 
      } else if(c instanceof Category2) { 
       Category2 c2 = (Category2) c; 
       holder.text1.setText(c2.text); 
      } 

      return convertView; 
     } 

     class ViewHolder { 
      TextView text1; 
      public ViewHolder(View convertView) { 
       text1 = (TextView) convertView.findViewById(android.R.id.text1); 
      } 
     } 
    } 
} 

class CategoryDatabase { 
    private List<Category1> cat1; 
    private List<Category2> cat2; 
    { 
     cat1 = new ArrayList<Category1>(); 
     cat2 = new ArrayList<Category2>(); 
     for(int i=0;i<10;i++) { 
      cat1.add(new Category1("Category 1 "+i)); 
     } 
     for(int i=0;i<20;i++) { 
      cat2.add(new Category2("Category 2 "+i)); 
     } 
    } 

    public List<Category1> getAllCategory1() { 
     return cat1; 
    } 
    public List<Category2> getAllCategory2() { 
     return cat2; 
    } 
} 

class Category1 { 
    String text; 
    public Category1(String text) { 
     this.text = text; 
    } 
} 

class Category2 { 
    String text; 
    public Category2(String text) { 
     this.text = text; 
    } 
} 

Планировка:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TabHost 
     android:id="@android:id/tabhost" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      android:padding="5dp"> 

      <TabWidget 
       android:id="@android:id/tabs" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" /> 

      <FrameLayout 
       android:id="@android:id/tabcontent" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

       <View 
        android:id="@+id/tab1" 
        android:layout_width="match_parent" 
        android:layout_height="0dp" /> 

       <View 
        android:id="@+id/tab2" 
        android:layout_width="match_parent" 
        android:layout_height="0dp"></View> 
      </FrameLayout> 
     </LinearLayout> 

    </TabHost> 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_weight="1" 
     android:layout_height="0dp" /> 
</LinearLayout> 
0

Таким образом, после тонны исследований, я, наконец, получил мой счет работает. Я использовал CWAC Merge Adapter, который можно найти в этом github link для тех, кто заинтересован.

Вот как я использовал это в моем коде:

Фрагмент класса

public class CategoryFragment extends Fragment{ 

    private ListView listView; 
    private String currentTabTag; 
    private CategoryAdapter1 categoryAdapter1; 
    private CategoryAdapter2 categoryAdapter2; 
    private MergeAdapter adapter = new MergeAdapter(); 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.activity_category_fragment_list, container, false); 

     // get references to widgets 
     listView = (ListView) view.findViewById (R.id.prescriptorsListView); 

     // get the current tab 
     TabHost tabHost = (TabHost) container.getParent().getParent(); 
     currentTabTag = tabHost.getCurrentTabTag(); 

     // refresh the category list view 
     refreshCategoryList(); 

     // return the view 
     return view; 
    } 

    public void refreshCategoryList() { 
     // get category list for current tab from database 
     Context context = getActivity().getApplicationContext(); 
     CategoryDatabase categoryDatabase = new CategoryDatabase(context); 

     if(currentTabTag.equals("Category 1")) { 
      ArrayList<Category1> category1ArrayList = categoryDatabase.getAllCategory1(currentTabTag); 
      // create adapter and set it in the ListView widget 
      categoryAdapter1 = new Category1Adapter(context, category1ArrayList); 
      adapter.add(Category1Adapter); 
     } 
     else if(currentTabTag.equals("Category 2")) 
     { 
      ArrayList<Category2> category2ArrayList = categoryDatabase.getAllCategory2(currentTabTag); 
      // create adapter and set it in the ListView widget 
      categoryAdapter2 = new categoryAdapter2(context, category2ArrayList); 
      adapter.add(categoryAdapter2); 
     } 
     listView.setAdapter(adapter); 

    } 
    @Override 
    public void onResume() { 
     super.onResume(); 
     refreshTaskList(); 
    } 
} 

Я тестировал этот код и он работает.

Если у кого-то есть лучший способ кодирования, пожалуйста, разделите.

Счастливый Coding :)

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