2017-01-03 8 views
0

私はタイトルがちょっと変わって見えるかもしれませんが、説明することを許可します!別のアクティビティでは、FirebaseとRecyclerviewを使って表示されるオブジェクトのリストがあります。私はユーザーを正しくつかむことができます(私のOnCreateのToastはこれを決定するのに役立ちます)。しかし、私が新しいオブジェクト(GroupMembers)として "picked"オブジェクトを表示しようとすると、重複が発生します。私はこれがmGroupMembers.setName & mGroupMembers.setUsernameによって引き起こされると思います。アダプタのコードを表示して、間違いがないことを確認します。なぜ、これがなぜ発生しているのか、また、選択したオブジェクトを対応する名前とユーザー名で正しく表示しない理由を誰にでも教えてもらえますか?トーストには名前とユーザー名が表示されますか?ここでRecyclerViewは同じオブジェクトを複製し、別のものを表示する必要があります

は私のカスタムアダプタです: MembersAdapter

public class MembersAdapter extends RecyclerView.Adapter<MembersAdapter.ViewHolder> { 
private List<GroupMembers> mMembers; 
private final int TOTAL_AMOUNT = 100; //Max amount for all seekbars. 
private final List<Integer> mAllProgress = new ArrayList<>(); 

static class ViewHolder extends RecyclerView.ViewHolder { 
    private TextView mName, mUsername, mPercent; 
    private SeekBar mSeekBar; 

    ViewHolder(View itemView) { 
     super(itemView); 
     mName = (TextView) itemView.findViewById(R.id.name_view_members); 
     mUsername = (TextView) itemView.findViewById(R.id.username_view_members); 
     mPercent = (TextView) itemView.findViewById(R.id.percent_text); 
     mSeekBar = (SeekBar) itemView.findViewById(R.id.percent_seekbar); 
    } 
} 

//Constructor 
public MembersAdapter(List<GroupMembers> members) { 
    this.mMembers = members; 
} 

@Override 
public MembersAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout_members, parent, false); 
    return new ViewHolder(v); 
} 

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    GroupMembers individual = mMembers.get(position); 
    holder.mName.setText(individual.getName()); 
    holder.mUsername.setText(individual.getUsername()); 

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

そしてここでは、OnCreateの方法で、私は他の活動からのアダプタとrecyclerviewが使用されている場所まで余分をつかむところ、私はちょうど用意しました。

は、ここに私の関連する活動です: PaymentsOptionActivityすべてのヘルプははるかに高く評価されるだろう

public class PaymentOptionsActivity extends AppCompatActivity { 

//Tag 
private static String TAG = "PaymentOptionsActivity"; 

@Bind(R.id.name_label) 
TextView mNameLabel; 
@Bind(R.id.cost_label) 
TextView mCostLabel; 
@Bind(R.id.color_label) 
TextView mColorLabel; 
@Bind(R.id.recurrence_label) 
TextView mRecurrenceLabel; 
@Bind(R.id.name_field) 
EditText mNameField; 
@Bind(R.id.cost_field) 
EditText mCostField; 
@Bind(R.id.color_button) 
Button mColorButton; 
@Bind(R.id.recurrence_spinner) 
Spinner mRecurrenceSpinner; 
@Bind(R.id.activity_payment_options) 
RelativeLayout mActivityPaymentOptions; 
@Bind(R.id.members_recycler) 
RecyclerView mRecyclerview; 
@Bind(R.id.bottom_naviation) 
BottomNavigationView mBottomNavigationView; 

private int mSelectedColor; 
private List<GroupMembers> mMembers = new ArrayList<>(); //Group Members in a List. 
private GroupMembers mGroupMembers = new GroupMembers(); //Individual Group Members 
private MembersAdapter mAdapter; 
private String name; 
private String email; 
private String username; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_payment_options); 
    ButterKnife.bind(this); 
    initiateBottomView(); 

    //Extra from other activity. 
    List<UserList> groupMembers = (List<UserList>) getIntent().getSerializableExtra("users"); //Selected Members 

    //Convert UserList -> Members 
    for (UserList users : groupMembers) { 
     name = users.getName(); 
     email = users.getEmail(); 
     username = users.getUsername(); 

     mGroupMembers.setName(name); 
     mGroupMembers.setUsername(username); 

     //Display who's picked for testing. 
     Toast.makeText(this, "Selected: " + name, Toast.LENGTH_SHORT).show(); 

     //List<GroupMembers> now has however members were selected.. 
     mMembers.add(mGroupMembers); 

    //RecyclerView + Adapter 
    mRecyclerview.setHasFixedSize(true); 
    mRecyclerview.setLayoutManager(new LinearLayoutManager(this)); 
    mAdapter = new MembersAdapter(mMembers); 
    mRecyclerview.setAdapter(mAdapter); 
    } 
    public void initiateBottomView() { 
    mBottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      Intent i; 
      switch (item.getItemId()) { 
       case R.id.action_groups: 
        //Refresh 
        i = new Intent(PaymentOptionsActivity.this, PaymentsSearchActivity.class); 
        startActivity(i); 
        return true; 
       case R.id.action_dashboard: 
        i = new Intent(PaymentOptionsActivity.this, DashboardActivity.class); 
        startActivity(i); 
        return true; 
       case R.id.action_profile: 
        item.setEnabled(true); 
        i = new Intent(PaymentOptionsActivity.this, ProfileActivity.class); 
        startActivity(i); 
        return true; 
      } 
      return false; 
     } 
    }); 
} 

、および任意の提案があるかどう私は同様にいただければ幸い私のコードで行う必要があります。これはむしろ大規模なアプリケーションであり、私は関連性を保つために非常に多くのコードを除外しています。

ありがとうございました!

+0

OnCreateメソッドで選択されたユーザーをテストするときに、Toast.makeText(this、 "Selected:" + mGroupMembers.getName()、Toast.LENGTH_SHORT)を試してみました。 .show(); 'GroupMembersが実際に両方の名前を設定しているかどうかをテストします。非常に混乱して、私はそれが簡単な修正でなければならないことを知っています。 –

答えて

2

あなたの問題はここにある:あなたのリストがまったく同じオブジェクトのコレクションを持っているので、

mGroupMembers.setName(name); 
mGroupMembers.setUsername(username); 

mGroupMembersは、一つのオブジェクトは、リストに複数回追加されて、私は何度も最後のエントリのみを示す推測しますRecyclerView

あなたは、インスタンス変数としてmGroupMembersを持って、それを削除し、代わりにこれを行うべきではありません。この効果に

for (UserList users : groupMembers) { 
      name = users.getName(); 
      email = users.getEmail(); 
      username = users.getUsername(); 

      GroupMembers groupMembers = new GroupMembers(); 
      groupMembers.setName(name); 
      groupMembers.setUsername(username); 

      //Display who's picked for testing. 
      Toast.makeText(this, "Selected: " + name, Toast.LENGTH_SHORT).show(); 

      //List<GroupMembers> now has however members were selected.. 
      mMembers.add(groupMembers); 
} 

か何か、あなたは、個々のGROUPMEMBERSのリストではなく、同じGROUPMEMBERSを参照してリストを作成オブジェクト。

+0

はい!これは私の問題を解決しました。それは非常に意味があります...私はそれが繰り返し、リストにオブジェクトを追加し、新しいオブジェクトを追加するためにリセットすると思った何らかの奇妙な理由のために、私はそれが実際に何をしていたのか分かりませんでした。どうもありがとうございました。 –

+1

問題はありません。時には、オブジェクトを変更可能にするためにセッターに注意する必要があります。作成したオブジェクトを一度も変更しない場合は、セッターを削除し、そのパラメータ/引数を除くクラスのコンストラクタを作成します。 –

関連する問題