0

我遇到了一些麻煩與我的應用程序,我想開發一個列表應用程序,您可以選擇添加新的「目標」,以及新的列表,以便您可以分類目標列表像列表對象標題可以是「吃得健康」,然後你會有像「吃更多的蔬菜」等內部目標。所以爲了做到這一點,我設立了一個ViewPagerHost類來抓取所有List對象從一個SQLite數據庫和初始化工廠開發的「列表片段」,處理所有添加目標,編輯和刪除等邏輯。我相信我已經得到這個正常工作,因爲數據庫端的一切似乎工作正常,然後其他類只能顯示和操縱這些信息。但顯示器上的一切似乎都出錯了。我在循環播放視圖中的每個視圖都會在標有「重要」或「生活變化」的任何目標旁邊顯示一顆星,但它會在任何想要的位置顯示星。此外,列表不會加載,直到我點擊某些東西。ViewPager以編程方式在其中創建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

顯示在每一行中的星星的問題將會引起,因爲您可能在需要時設置它們,但在不需要時不會隱藏它們。 你將不得不在你的適配器的getView()方法中實現類似這樣的事情。

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

非常感謝!我一直在努力工作,而且這不起作用。 – iro2596

+0

Yw,如果這解決了你的問題,請接受;) – MrJM

+0

請接受什麼? – iro2596

相關問題