私は自分のrecyclerviewに問題があります。これにはカスタムアダプターがあります。アクティビティが開かれると、recyclerviewは空です。ユーザーがSearchViewのテキストフィールドに何かを入力すると、recyclerviewが作成され、問題なく移入されたままになります。私はこの問題を解決するためにいくつかのコードの場所を変更しようとしましたが、まだ成功しませんでした。現在のコードと希望の状態のスクリーンショットをコードの下に追加しました。前もって感謝します。RecyclerViewはSearchViewとの対話まで実装されていません
AddCourseActivity:
public class AddCourseActivity extends AppCompatActivity{
private RecyclerView mRecyclerView;
private AddCourseAdapter mAdapter;
private List<AddCourseAdapter.AddCourseModel> mModels;
SearchView mSearchView;
@Override
protected void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
setContentView(R.layout.activity_add_course);
Kii.initialize(AppConstants.APP_ID, AppConstants.APP_KEY,
AppConstants.APP_SITE);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
mRecyclerView = (RecyclerView) findViewById(R.id.addcourseRecyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
String[] courses = new String[]{
"Math119",
"Enve101",
"Chem107",
"Chem229",
"Phys105",
"Math120"};
mModels = new ArrayList<>();
mAdapter = new AddCourseAdapter(this, mModels);
mSearchView = (SearchView) findViewById(R.id.searchView);
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
final List<AddCourseAdapter.AddCourseModel> filteredModelList = filter(mModels, newText);
mAdapter.animateTo(filteredModelList);
mRecyclerView.scrollToPosition(0);
return true;
}
});
for (String course: courses) {
mModels.add(new AddCourseAdapter.AddCourseModel(course));
mRecyclerView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
}
}
private List<AddCourseAdapter.AddCourseModel> filter(List<AddCourseAdapter.AddCourseModel> models, String query) {
query = query.toLowerCase();
final List<AddCourseAdapter.AddCourseModel> filteredModelList = new ArrayList<>();
for (AddCourseAdapter.AddCourseModel model: models) {
final String text = model.getText().toLowerCase();
if (text.contains(query)) {
filteredModelList.add(model);
}
}
return filteredModelList;
}
}
AddCourseAdapter:
public class AddCourseAdapter extends RecyclerView.Adapter<AddCourseAdapter.AddCourseViewHolder> {
private final LayoutInflater mInflater;
private final List<AddCourseModel> mModels;
KiiUser user;
KiiObject object;
KiiBucket userBucket;
Context context;
public AddCourseAdapter(Context context, List<AddCourseModel> models) {
mInflater = LayoutInflater.from(context);
mModels = new ArrayList<>(models);
}
@Override
public AddCourseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
context = parent.getContext();
final View itemView = mInflater.inflate(R.layout.list_item_add_course, parent, false);
user = KiiUser.getCurrentUser();
final String username = user.getUsername();
userBucket = Kii.user().bucket(username);
String id = "mycourses";
object = userBucket.object(id);
return new AddCourseViewHolder(itemView);
}
@Override
public void onBindViewHolder(final AddCourseViewHolder holder, int position) {
final AddCourseModel model = mModels.get(position);
holder.bind(model);
holder.addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String value = holder.mTextView.getText().toString();
object.refresh(new KiiObjectCallBack() {
@Override
public void onRefreshCompleted(int token, @NonNull KiiObject object, Exception exception) {
object.set(value, true);
object.saveAllFields(new KiiObjectCallBack() {
@Override
public void onSaveCompleted(int token, KiiObject object, Exception exception) {
Toast.makeText(context,
"Added: " + value,
Toast.LENGTH_SHORT)
.show();
}
}, false);
}
});
holder.addButton.setVisibility(View.GONE);
holder.removeButton.setVisibility(View.VISIBLE);
}
});
holder.removeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
final String value = holder.mTextView.getText().toString();
object.refresh(new KiiObjectCallBack() {
@Override
public void onRefreshCompleted(int token, @NonNull KiiObject object, Exception exception) {
object.set(value, false);
object.saveAllFields(new KiiObjectCallBack() {
@Override
public void onSaveCompleted(int token, @NonNull KiiObject object, Exception exception) {
Toast.makeText(context,
"Removed: " + value,
Toast.LENGTH_SHORT)
.show();
}
}, false);
}
});
holder.addButton.setVisibility(View.VISIBLE);
holder.removeButton.setVisibility(View.GONE);
}
});
}
@Override
public int getItemCount() {
return mModels.size();
}
public void animateTo(List<AddCourseModel> models) {
applyAndAnimateRemovals(models);
applyAndAnimateAdditions(models);
applyAndAnimateMovedItems(models);
}
private void applyAndAnimateRemovals(List<AddCourseModel> newModels) {
for (int i = mModels.size() - 1; i >= 0; i--) {
final AddCourseModel model = mModels.get(i);
if (!newModels.contains(model)) {
removeItem(i);
}
}
}
private void applyAndAnimateAdditions(List<AddCourseModel> newModels) {
for (int i = 0, count = newModels.size(); i < count; i++) {
final AddCourseModel model = newModels.get(i);
if (!mModels.contains(model)) {
addItem(i, model);
}
}
}
private void applyAndAnimateMovedItems(List<AddCourseModel> newModels) {
for (int toPosition = newModels.size() - 1; toPosition >= 0; toPosition--) {
final AddCourseModel model = newModels.get(toPosition);
final int fromPosition = mModels.indexOf(model);
if (fromPosition >= 0 && fromPosition != toPosition) {
moveItem(fromPosition, toPosition);
}
}
}
public AddCourseModel removeItem(int position) {
final AddCourseModel model = mModels.remove(position);
notifyItemRemoved(position);
return model;
}
public void addItem(int position, AddCourseModel model) {
mModels.add(position, model);
notifyItemInserted(position);
}
public void moveItem(int fromPosition, int toPosition) {
final AddCourseModel model = mModels.remove(fromPosition);
mModels.add(toPosition, model);
notifyItemMoved(fromPosition, toPosition);
}
public class AddCourseViewHolder extends RecyclerView.ViewHolder {
private final TextView mTextView;
private final ImageButton addButton;
private final ImageButton removeButton;
public AddCourseViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.addCourseTV);
addButton = (ImageButton) itemView.findViewById(R.id.addButton);
removeButton = (ImageButton) itemView.findViewById(R.id.removeButton);
}
public void bind(AddCourseModel model) {
mTextView.setText(model.getText());
}
}
public static class AddCourseModel {
private final String mText;
public AddCourseModel(String text) {
this.mText = text;
}
public String getText() {
return mText;
}
}
}
現在の初期状態:
所望の初期状態:
にアダプタのコンストラクタを書き換えます。私は今日後でお知らせします。ありがとうございます –
両方のソリューションが仕事をしています。感謝します。副作用として、あなたはどちらがより良い解決策、安定性およびパフォーマンス志向だと思いますか?私は、原因がより多く働くので、ソリューションbはより良いと感じます。それは問題なの? –
問題ではありません。あなたがmModelsリストへの参照を保持し、アダプタの外でそれを変更する予定がある場合、単にソリューションBに注意する必要があります。もしあなたがそれを行うなら、あなたはいつもアダプターに変更点を知らせる必要があります(それはリストの同じインスタンスなので)。 – aelimill