2017-09-22 14 views
0

私は、Competitorオブジェクトのリストを持つrecyclerViewを持っています。 RecyclerViewを読み込むリストはグローバルシングルトンです。そのSingletonのコンストラクタで、私はJsonファイルを開き、その内容を解析してグローバルSingletonの競合者のリストを作成し、そのリストを使用してRecyclerViewのアダプタに渡します。各リスト項目にはImageButtonがあります。これが私が達成しようとしていることです。 ユーザーがImageButton(Delete Button)をクリックすると、AlertDialogがポップアップして、競合他社を削除してもよいかどうかを確認するメッセージが表示されます。私はこれまでにこの部分を持っています。しかし、私が次にする必要があることはわかりません。私はグローバルリストの情報を含むjsonファイルを更新することができますが、RecyclerViewから競合他社を削除してrecyclerviewを更新したいと考えています:外部AlertDialogからのアクティビティのリストにアクセスする方法

mCompetitorsList.remove(competitor); notifyItemRemoved(位置);

しかし、外部DialogクラスからmCompetitorsList変数への参照を取得できません。 notifiyItemRemoved(位置)を呼び出す場合も同じです

どうすればよいですか?以下は、私のDialogクラスのコードです。RecyclerViewとそのアダプターだけでなく、シングルトンの実装も含まれています。ここで

public class MasterCompetitorsListActivity extends AppCompatActivity implements SearchView.OnQueryTextListener { 

    private static final String DIALOG_DELETE_COMPETITOR = "DIALOG_DELETE_COMPETITOR"; 
    private RecyclerView mRecyclerView; 
    private List<Competitor> mCompetitorsList; 
    private CompetitorListAdapter mAdapter; 
    private SearchView mSearchView; 
    private FloatingActionButton mAddCompetitorButton; 
    private Button mDeletCompetitor; 
    private TextView mCompetitorHidden; 

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

     mSearchView = (SearchView) findViewById(R.id.searchView); 
     mSearchView.setOnQueryTextListener(this); 

     /* initialize the Global Competitor's List for the recyclerview. Because this is a singleton 
     it should initialize the list for the entire app's runtime 
     */ 
     GlobalCompetitorsList.get(); 
     mCompetitorsList = GlobalCompetitorsList.getCompetitors(); 

     mRecyclerView = (RecyclerView) findViewById(R.id.master_competitors_recycler); 
     LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
     mRecyclerView.setLayoutManager(layoutManager); 
     mAdapter = new CompetitorListAdapter(this, mCompetitorsList); 
     mRecyclerView.setAdapter(mAdapter); 

     // set a separator for the list items 
     DividerItemDecoration divider = new DividerItemDecoration(
       mRecyclerView.getContext(), 
       layoutManager.getOrientation()); 
     divider.setDrawable(ContextCompat.getDrawable(MasterCompetitorsListActivity.this, R.drawable.divider_dark)); 

     mRecyclerView.addItemDecoration(divider); 

     mRecyclerView.setAdapter(mAdapter); 

     mAddCompetitorButton = (FloatingActionButton) findViewById(R.id.add_master_competitor_floating_button); 
     mAddCompetitorButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(MasterCompetitorsListActivity.this, AddNewMasterCompetitorActivity.class); 
       startActivity(intent); 
      } 
     }); 

    } 

    @Override 
    public boolean onQueryTextSubmit(String query) { 

     mCompetitorsList = new ArrayList<>(); 
     mCompetitorsList = GlobalCompetitorsList.getCompetitors(); 
     mAdapter.notifyDataSetChanged(); 
     return false; 
    } 

    @Override 
    public boolean onQueryTextChange(String query) { 

     mCompetitorsList = GlobalCompetitorsList.getCompetitors(); 

     query = query.toLowerCase(); 
     final List<Competitor> filteredList = new ArrayList<>(); 

     for (int i = 0; i < mCompetitorsList.size(); i++) { 
      final String lastName = mCompetitorsList.get(i).getLastName().toLowerCase(); 
      final String firstName = mCompetitorsList.get(i).getFirstName().toLowerCase(); 
      if (lastName.contains(query) || firstName.contains(query)) { 
       filteredList.add(mCompetitorsList.get(i)); 
      } 
     } 

     mAdapter.setFilter(filteredList); 

     return true; 
    } 




    // ********* RecyclerView Adapter class ************************************************************************* 


    public class CompetitorListAdapter extends RecyclerView.Adapter<CompetitorListAdapter.CompetitorViewHolder> { 

     List<Competitor> mCompetitors; 
     Context mContext; 

     public CompetitorListAdapter(Context context, List<Competitor> competitors) { 
      mContext = context; 
      mCompetitors = competitors; 
     } 

     @Override 
     public CompetitorListAdapter.CompetitorViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

      LayoutInflater inflater = LayoutInflater.from(MasterCompetitorsListActivity.this); 
      View itemView = inflater.inflate(R.layout.list_item_master_competitor, parent, false); 
      CompetitorViewHolder viewHolder = new CompetitorViewHolder(itemView); 

      return viewHolder; 
     } 

     @Override 
     public void onBindViewHolder(CompetitorListAdapter.CompetitorViewHolder holder, final int position) { 
      final Competitor competitor = mCompetitorsList.get(position); 

      try { 
       holder.firstName.setText(competitor.getFirstName()); 
       holder.lastName.setText(competitor.getLastName()); 
       holder.memberNum.setText(competitor.getMemberNum()); 
       holder.deleteCompetitor.setImageResource(R.drawable.ic_delete_forever_white_24dp); 
       holder.container.findViewById(R.id.main_container); 
       holder.hiddenCompetitorId.setText(competitor.getCompetitorId().toString()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      holder.deleteCompetitor.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 


        FragmentManager fragmentManager = getSupportFragmentManager(); 
        DeleteCompetitorDialogFragment dialog = new DeleteCompetitorDialogFragment(); 
        dialog.show(fragmentManager, DIALOG_DELETE_COMPETITOR); 

//      mCompetitorsList.remove(competitor); // remove from the global singleton list 
//      notifyItemRemoved(position); 

       } 
      }); 

     } 

     @Override 
     public int getItemCount() { 
      return mCompetitorsList.size(); 
     } 


     // ************* View Holder Class ************************************************************************** 

     public class CompetitorViewHolder extends RecyclerView.ViewHolder { 

      public TextView firstName; 
      public TextView lastName; 
      public TextView memberNum; 
      public ImageButton deleteCompetitor; 
      public ConstraintLayout container; 
      public TextView hiddenCompetitorId; 

      boolean comptitorIsActive = false; 


      public CompetitorViewHolder(final View itemView) { 
       super(itemView); 

       firstName = (TextView) itemView.findViewById(R.id.first_name); 
       lastName = (TextView) itemView.findViewById(R.id.last_name); 
       deleteCompetitor = (ImageButton) itemView.findViewById(R.id.delete_competitor_button); 
       hiddenCompetitorId = (TextView) itemView.findViewById(R.id.competitor_id_hidden); 
       container = (ConstraintLayout) itemView.findViewById(R.id.main_container); 
       memberNum = (TextView) itemView.findViewById(R.id.member_num); 
      } 
     } 

     // ************ End of View Holder Class ******************************************************************** 

     public void setFilter(List<Competitor> newList) { 

      mCompetitorsList = new ArrayList<>(); 
      mCompetitorsList.addAll(newList); 
      notifyDataSetChanged(); 
     } 


    } 

    // ************* End of RecyclerView Adapter class ********************************************************** 

} 

ダイアログクラスです:

public class DeleteCompetitorDialogFragment extends DialogFragment { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState){ 

     final GlobalCompetitorsList mCompetitorsList = GlobalCompetitorsList.get(); 

     return new AlertDialog.Builder(getActivity()) 
       .setTitle("Delete this Competitor?") 
       .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialogInterface, int i) { 

        } 
       }) 
       .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialogInterface, int i) { 
         // remove from the master_competitors.json file by overwriting the original file with the new 
         // global list 
         File file = new File("data/data/com.checkinsystems.ez_score/files/master_competitors.json"); 
         if (file.exists()) { 
          FileOutputStream fos = null; 
          try { 
           String jsonString = new Gson().toJson(mCompetitorsList); 
           fos = getActivity().openFileOutput("master_competitors.json", getActivity().MODE_PRIVATE); 
           fos.write(jsonString.getBytes()); 


           // somehow access the list from the calling activity to remove the item 




          } catch (IOException e) { 
           e.printStackTrace(); 
          } finally { 
           try { 
            assert fos != null; 
            fos.close(); 
           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
          } 

         } 
        } 
       }) 
       .create(); 
    } 

} 

そしてそれはここで、私のコードを理解するのに役立ちます場合はシングルトンクラス

public class GlobalCompetitorsList { 

    public static GlobalCompetitorsList sGlobalCompetitorsList; 
    public static List<Competitor> sCompetitors; 

    public static GlobalCompetitorsList get() { 

     if(sGlobalCompetitorsList == null){ 
      return new GlobalCompetitorsList(); 
     } else { 
      return sGlobalCompetitorsList; 
     } 
    } 

    private GlobalCompetitorsList() { 
     File file = new File("data/data/com.checkinsystems.ez_score/files/master_competitors.json"); 
     String jsonString; 

     if(file.exists()){ 
      BufferedReader reader = null; 
      List<Competitor> list; 
      sCompetitors = new ArrayList<>(); 

      try { 
       reader = new BufferedReader(new FileReader(file)); 
       jsonString = reader.readLine(); 
       Type compType = new TypeToken<List<Competitor>>(){}.getType(); 
       list = new Gson().fromJson(jsonString, compType); 
       addCompetitors(list); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
       try { 
        assert reader != null; 
        reader.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

     } else { 
      sCompetitors = new ArrayList<>(); 
     } 
    } 

    public void addCompetitor(Competitor c){ 
     sCompetitors.add(c); 
    } 

    public static void addCompetitors(List<Competitor> c){ 
     sCompetitors.addAll(c); 
    } 

    public static List<Competitor> getCompetitors(){ 
     return sCompetitors; 
    } 
} 

答えて

0

シンプルなだけでそのダイアログのコンストラクタを作成していますあなたは使用しています

public DeleteCompetitorDialogFragment(IMyListenerCallback listener){ 
    mListener = listener; 
} 


later on// 
if(listener != null){ 
    listener.doWhatYouNeed(stuffToPass); 
} 

はその後、これはpseduoコードで、テストされていませんもちろん、あなたの呼び出し元の活動

public class MainActivity extends AppCompatActivity implements IMyListenerCallback{ 

     private void launchDialog(){ 
      new DeleteCompetitorDialogFragment(this).show(); 
     } 
     @Override 
     public void doWhatYouNeed(Object stuffToPass){ 

     } 
} 

にインタフェースクラスに

public interface IMyListenerCallback{ 
    void doWhatYouNeed(Object stuffToPass); 
} 

//を作り、うまくいけば、あなたは画像を取得します。がんばろう。

関連する問題