ViewPager中包含以编程方式创建的recyclerView列表

时间:2016-06-09 12:48:22

标签: android list android-fragments android-viewpager android-recyclerview

我的应用程序遇到了一些问题,我正在尝试开发一个列表应用程序,您可以选择添加新的"目标"以及新列表,以便您可以将目标分类到列表,如列表对象标题可以"健康饮食"然后你会在里面拥有目标,比如"多吃蔬菜"等等。为了做到这一点,我设置了一个ViewPagerHost类,它从SQLite数据库中获取所有List对象并初始化一个工厂开发"列表片段"它处理添加目标,编辑和删除等所有逻辑。我相信我已经使这个工作正常,因为数据库端的所有东西似乎工作正常,然后其他类只是显示和操纵那些信息。但显示器方面的一切似乎都出错了。我在recyclerview中的每个视图都会显示一个标记为"重要"或者"改变生活"但它会在任何地方显示明星。在我点击某些内容之前,该列表也不会加载。

public class ViewPagerHost extends Activity_Logger {
private static final String ARG_TITLE = "title";
private ViewPager mViewPager;
private ArrayList<Fragment> mFragmentList;
private ArrayList<GoalList> goalList;
private ArrayList<Goal> goalArrayList;
Database_Controller controller;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_pager_host);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    MobileAds.initialize(getApplicationContext(), "ad-String");
    AdView adView = (AdView) findViewById(R.id.ad);
    AdRequest adRequest = new AdRequest.Builder().build();
    adView.loadAd(adRequest);
    setSupportActionBar(toolbar);
    toolbar.setTitle("Ambition");
    FragmentManager fragmentManager = getSupportFragmentManager();
    controller = Database_Controller.get(getApplicationContext());
    goalList = controller.getAllLists();
    goalArrayList = controller.getAllGoals();
    mViewPager = (ViewPager)findViewById(R.id.view_fragments);
    if(goalList.get(0) == null){
        GoalList listOne = new GoalList();
        listOne.setTitle("DEFAULT");
        controller.insertList(listOne);
        for(int i =0; i< goalArrayList.size(); i++){
            goalArrayList.get(i).setWhich_List(listOne.getTitle());
            controller.updateGoal(goalArrayList.get(i));
        }
    }
    mFragmentList = getFragmentList(goalList);
    ViewPagerAdapter adapter = new ViewPagerAdapter(fragmentManager, mFragmentList);
    if(adapter == null){

    }else{
        mViewPager.setAdapter(adapter);
    }
}

public ArrayList<Fragment> getFragmentList(ArrayList<GoalList> list){
    mFragmentList = new ArrayList<>();
    Bundle bundle = new Bundle();
    for(int i = 0; i< list.size(); i++){
        List_Fragment list_fragment = new List_Fragment();
        bundle.putString(ARG_TITLE, goalList.get(i).getTitle());
        list_fragment.setArguments(bundle);
        mFragmentList.add(list_fragment);
    }
    return mFragmentList;
}

}

这是我的ViewPagerHost类,用于创建工厂列表。

public class List_Fragment extends Fragment {
private RecyclerView mRecyclerView;
private static final String ARG_TITLE = "title";
private static final String ARG_GOALNAME ="Goal";
private static final String ARG_IMPORTANT = "Important";
private Database_Controller mDatabaseController;
private static final String ARG_ID = "ID";
ArrayList<Goal> goalList;
LinearLayoutManager manager;
public RecyclerView.Adapter adapter;
public ReceiverThread UiThread;
FragmentManager fragmentManager;
String list_title;

public List_Fragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_list_, container, false);
    Bundle bundle = getArguments();
    if(bundle != null){
        list_title= bundle.getString(ARG_TITLE);
    }
    mDatabaseController = mDatabaseController.get(getContext());
    goalList = mDatabaseController.getAllListsGoals(list_title);
    mRecyclerView = (RecyclerView)view.findViewById(R.id.recyclerview);
    manager = new LinearLayoutManager(getActivity());
    UiThread = new ReceiverThread();
    mRecyclerView.setLayoutManager(manager);
    final RecyclerView_Adapter wrapperClass = new RecyclerView_Adapter(goalList,getContext(),this);
    adapter = wrapperClass.adapter;
    for(int counter =0; counter < goalList.size(); counter++){
        System.out.println(goalList.get(counter).getWhich_List());
    }
    mRecyclerView.setAdapter(adapter);
    fragmentManager= getFragmentManager();
    //adapter goes here
    final FloatingActionButton fab = (FloatingActionButton)view.findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Fragment fragment = List_Fragment.this;
            AddNew_PopUp popUp = AddNew_PopUp.newInstance(fragment);
            popUp.setTargetFragment(fragment, 0);
            popUp.show(fragmentManager, "PopUpDialog");
        }
    });

    return view;
}

public class ReceiverThread extends Thread {
    @Override
    public void run() {
        super.run();
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                goalList.clear();
                ArrayList<Goal>newGoalList = mDatabaseController.getAllGoals();
                goalList.addAll(newGoalList);
                adapter.notifyDataSetChanged();
            }
        });
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode ==  0){
        if(resultCode == Activity.RESULT_OK){
            Goal newGoal = new Goal();
            String GoalName = data.getStringExtra(ARG_GOALNAME);
            if (GoalName.isEmpty()) {
                Toast.makeText(getContext(), R.string.NoGoal, Toast.LENGTH_SHORT).show();
            } else {
                newGoal.setmIsImportant(data.getBooleanExtra(ARG_IMPORTANT, false));
                newGoal.setmGoalName(GoalName);
                newGoal.setWhich_List(ARG_TITLE);
                mDatabaseController.insertGoal(newGoal);
            }
        }
    }else{
        if(requestCode == 1){
            if(resultCode == Activity.RESULT_OK){
                String id = data.getStringExtra(ARG_ID);
                Toast.makeText(getContext(),R.string.flush, Toast.LENGTH_LONG).show();
                mDatabaseController.deleteGoal(id);
            }
        }else{
            if(requestCode == 2){
                if(resultCode == Activity.RESULT_OK){
                    String goalName = data.getStringExtra(ARG_GOALNAME);
                    Boolean isImportant = data.getBooleanExtra(ARG_IMPORTANT, false);
                    UUID id = UUID.fromString(data.getStringExtra(ARG_ID));
                    Goal goal = mDatabaseController.getGoal(id.toString());
                    goal.setmIsImportant(isImportant);
                    goal.setmGoalName(goalName);
                    mDatabaseController.updateGoal(goal);
                }
            }
        }
    }
    UiThread.run();
}

public ReceiverThread getUiThread() {
    return UiThread;
}

}

这是为数据库中的每个列表创建的列表片段。它根据用户的操作调用方法和操作数据。

public class RecyclerView_Adapter{
private ArrayList<Goal> mGoals;
MyAdapter adapter;
Context context;
private Database_Controller mDatabaseController;
MediaPlayer mediaPlayer;
Fragment fragment;

public RecyclerView_Adapter(ArrayList<Goal> goals, Context cntxt, Fragment fragments) {
    mGoals = goals;
    adapter = new MyAdapter(mGoals);
    context = cntxt;
    mediaPlayer = new MediaPlayer();
    fragment = fragments;
    mDatabaseController = Database_Controller.get(context);
}

//////////////////////////////////ADAPTER\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
private class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
    private List<Goal> mGoals;


    public MyAdapter(List<Goal> goals) {
        mGoals = goals;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.recycler_view_item_layout, parent, false);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        final Goal goal = mGoals.get(position);
        holder.bindGoal(goal);
    }

    @Override
    public int getItemCount() {
        return mGoals.size();
    }
}
////////////////////////////////////ADAPTER\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


///////////////////////////////////VIEW HOLDER\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
public class MyViewHolder extends RecyclerView.ViewHolder {
    private TextView mTextView, importantTXT;
    private CheckBox mCheckBox;
    private Goal mGoal;
    private ImageView imgView;


    public MyViewHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AppCompatActivity context = (AppCompatActivity) v.getContext();
                FragmentManager manager = context.getSupportFragmentManager();
                Edit_PopUp dialog = Edit_PopUp.newInstance(mGoal);
                dialog.setTargetFragment(fragment, 2);
                dialog.show(manager, "EditDialog");
            }
        });
        itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                //Add delete thingy
                AppCompatActivity context = (AppCompatActivity) v.getContext();
                FragmentManager manager = context.getSupportFragmentManager();
                MoreOptions_PopUp dialog = MoreOptions_PopUp.newInstance(mGoal);
                dialog.setTargetFragment(fragment, 1);
                dialog.show(manager, "GoalDialog");
                return true;
            }
        });
        mTextView = (TextView) itemView.findViewById(R.id.text);
        mCheckBox = (CheckBox) itemView.findViewById(R.id.checkbox);
        imgView = (ImageView) itemView.findViewById(R.id.imageView);
        importantTXT = (TextView) itemView.findViewById(R.id.Important_textView);
        mCheckBox.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                mGoal.setFinished(mCheckBox.isChecked());
                mDatabaseController.updateGoal(mGoal);
                if (mCheckBox.isChecked() == true) {
                    boolean value = checkWinning(mGoals,context);
                    PlaySound(value, mGoal.ismIsImportant(), v);
                }
            }
        });
    }


    public void bindGoal(Goal goal) {
        mGoal = goal;
        mCheckBox.setChecked(mGoal.isFinished());
        mTextView.setText(mGoal.getmGoalName());
        if (mGoal.ismIsImportant()) {
            imgView.setImageResource(R.mipmap.ic_stars_pressed);
            importantTXT.setText(R.string.isImportant);
        }
    }

    public boolean checkWinning(ArrayList<Goal> goals, Context context) {
        for (int i = 0; i < goals.size(); i++) {
            if (goals.get(i).isFinished() == false) {
                return false;
            }
        }
        return true;
    }
    public void PlaySound(Boolean winningSound, boolean isImportant, View view) {
        if(winningSound){
            mediaPlayer = MediaPlayer.create(context,R.raw.victory);
            Snackbar snackbar = Snackbar.make(view, R.string.completion, Snackbar.LENGTH_LONG);
            snackbar.show();
            mediaPlayer.start();
        }else {
            if (isImportant) {
                mediaPlayer = MediaPlayer.create(context, R.raw.collect);
                mediaPlayer.start();
                Snackbar snackbar = Snackbar.make(view, R.string.congrats, Snackbar.LENGTH_SHORT);
                snackbar.show();
            } else {
                mediaPlayer = MediaPlayer.create(context, R.raw.success);
                Snackbar snackbar = Snackbar.make(view, R.string.lessCongrats, Snackbar.LENGTH_SHORT);
                snackbar.show();
                mediaPlayer.start();
            }
        }
    }
}
////////////////////////////////////VIEW HOLDER\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


public MyAdapter getAdapter() {
    return adapter;
}

public Fragment getFragment() {
    return fragment;
}

}

这是我的适配器类,它播放声音OnClick并将视图绑定到Recyclerview。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

每一行中显示星星的问题都会引起,因为您可能在需要时设置它们,但在不需要时不会隐藏它们。 您必须在适配器的getView()方法中实现类似的功能。

ImageView starView = (ImageView) v.findViewById(R.id.starView);
starView.setVisibility(goals.get(position).isSpecial() ? View.Visible : View.Gone);