この質問は多少なりともこのthreadで回答されていますが、多くの項目がrecyclerviewに含まれていれば動作する必要があります。たとえば、私がrecyclerviewに3つのアイテムを持っている場合、私は3つのシークバーが最大100%(または単純に100)のお互いに依存したいと思っています。ここでrecyclerviewで複数のシークバーを100%に制限する方法
は、カスタムアダプタである私のコードです:
public class MembersAdapter extends RecyclerView.Adapter<MembersAdapter.ViewHolder> {
//Tag
private static String TAG = "MembersAdapter";
//Max amount for all seekbars.
private final int TOTAL_AMOUNT = 100;
private final List<Integer> mAllProgress = new ArrayList<>();
private List<GroupMembers> mMembers;
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
*
* @param members : The members.
*/
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());
//mAllProgress AMOUNTS equal to the SIZE or NUMBER of mMembers which exist.
//All SeekBars of size mMembers (members picked) should be 0% by default.
for (int i = 0; i <= mMembers.size() - 1; i++) {
mAllProgress.add(0);
}
//SeekBar Listener
holder.mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//Find out which seekbar triggered the event
int which = whichIsIt(seekBar.getId(), progress);
//Stored progress (where is it at...)
int storedProgress = mAllProgress.get(which);
/**Two cases can occur: User goes left or right with the thumb.
* If RIGHT, we must check how much he's allowed to go in that
* direction (based on other seekbars), and stop him before it's
* too late. If LEFT, free up the space to allow the other seekbars.
**/
if (progress > storedProgress) {
//How much remains based on all seekbars.
int remaining = remaining();
//If progress 100%, don't let user move. (overextend)
if (remaining == 0) {
seekBar.setProgress(storedProgress);
} else {
//Progress available, check the availability of others,
//and let the user move as long as it's below 100% total.
if (storedProgress + remaining >= progress) {
mAllProgress.set(which, progress);
} else {
mAllProgress.set(which, storedProgress + remaining);
}
}
} else if (progress <= storedProgress) {
mAllProgress.set(which, progress);
}
}
private int whichIsIt(int id, int progress) {
switch (id) {
case R.id.percent_seekbar:
holder.mPercent.setText(" " + progress + "%");
//This should return the SeekBars position out of however many seekbars there are.
return 0;
default:
throw new IllegalStateException(
"There should be a seekbar with this id(" + id + ")!");
}
}
private int remaining() {
int remaining = TOTAL_AMOUNT;
for (int i = 0; i < mAllProgress.size(); i++) {
remaining -= mAllProgress.get(i);
}
if (remaining >= 100) {
remaining = 100;
} else if (remaining <= 0) {
remaining = 0;
}
return remaining;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
@Override
public int getItemCount() {
return mMembers.size();
}
あなたは、コードを言うことができるようになったときに、私はそれがうまくいくかどうかを確認したかったので、私はリンクされたスレッドのものと非常に似ていますいくつかの変更。たとえば、私がこれまでに試したことは、すべての進捗状況を含むList<Integer>
となりました。しかし、多くの場合、多くの場合、mMembers
がループして0に設定されています。 3 mMembers
(recyclerview内の項目)がある場合は、他の言葉では、その後、0
から始まる3 seekbarsがあるだろう、私は私が上で動作する必要があるコードはここにあると信じて:
switch (id) {
case R.id.percent_seekbar:
holder.mPercent.setText(" " + progress + "%");
//This should return the SeekBars position out of however many seekbars there are.
return 0;
default:
throw new IllegalStateException(
"There should be a seekbar with this id(" + id + ")!");
}
と理由はどこにあるのかは、返されるIDが常に0なので、これがどこにあるのか知っている理由です。最初の位置を取得するのではなく、存在するすべてのシークバーを取得できるように、私はいくつかのタイプのカウンターを設定しようとしましたが、主にシークバーのすべての位置を繰り返し処理する方法について固執しています...
編集:ここにはどのように見えるかの画像例があります。明らかにそれは100%と50%ではなく、むしろ50%と50%であるべきです。代わりにreturn 0;
パスreturn position;
の
を動作します。どうもありがとう、私はこれにどれくらい苦労したのか分かりません。 –