SwitchButton в каждом item-e ListView - как настроить, чтобы он влиял именно на объект, отображаемый в этом item-e?
У меня приложение, в котором заучиваются шведские слова. В моем случае ListView состоит из finalArrayList-а, который в свою очередь состоит из двух ArrayList-ов: practiceList (пары слов (sw+eng), которые пользователь учит, они встречаются в "игре") и hideList (пары слов, которые пользователь отключил).
ArrayList<Word> finalArray = new ArrayList<Word>();
finalArray.addAll(finalPractice);
finalArray.addAll(finalHide);
Я имею один шаблон для всех элементов ListView, это list_item_layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="100">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="33.3">
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="swedishWord"
android:paddingLeft="10dp"
android:textSize="21sp"
android:textColor="@color/colorYellow"
android:id="@+id/textView1"
android:gravity="center_vertical"/>
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="englishWord"
android:paddingLeft="10dp"
android:textSize="17sp"
android:textColor="@color/colorYellow"
android:id="@+id/textView2"
android:gravity="center_vertical"/>
</LinearLayout>
<Switch
android:id="@+id/switchBox"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_weight="66.6"
android:textColor="@color/colorYellow"
android:thumbTint="#1976D2"
android:paddingRight="40dp"/>
Как видно, у каждого элемента есть switch button. Мне нужно чтобы этим switch-ом можно было перекинуть слово из practiceList-a в hideList и наоборот (чтобы юзер мог "включать" и "отключать" слова).
Как сделать так, чтобы переключение switchButton в item-e влияло именно на отображенный в этом item-е объект, как на объект исходного practiceList-a либо hideList-a (чтобы, собственно, перекинуть объект из одного в другой)?
На всякий случай полный код ListAdapter-a (если вдруг это нужно для ответа):
public class CheckListAdapter extends ArrayAdapter<Word> implements Filterable {
private static final String TAG = "CheckListAdapter";
private Context mContext;
private int mResource;
private int lastPosition = -1;
private ArrayList<Word> mOriginalValues;
private ArrayList<Word> mOriginalValuesFull;
/**
* Hold variables in a view
*/
static class ViewHolder {
TextView swedish;
TextView english;
Switch switchBox;
}
/**
* Default constructor for the CheckListAdapter
* @param context
* @param resource
* @param objects
*/
public CheckListAdapter(@NonNull Context context, int resource, @NonNull ArrayList<Word> objects, Context mContext) {
super(context, resource, objects);
this.mContext = mContext;
mResource = resource;
this.mOriginalValues = objects;
mOriginalValuesFull = new ArrayList<>(objects);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
//get the word two examples
String swedish = getItem(position).getSwedish();
String english = getItem(position).getEnglish();
//create the word object with two examples
Word word = new Word(swedish, english);
//create the view result for showing the animation
final View result;
//Viewholder object
ViewHolder holder;
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
convertView = inflater.inflate(mResource, parent, false);
holder = new ViewHolder();
holder.swedish = (TextView) convertView.findViewById(R.id.textView1);
holder.english = (TextView) convertView.findViewById(R.id.textView2);
holder.switchBox = (Switch) convertView.findViewById(R.id.switchBox);
result = convertView;
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
result = convertView;
}
Animation animation = AnimationUtils.loadAnimation(mContext,
(position > lastPosition) ? R.anim.loading_down_anim : R.anim.loading_up_anim);
result.startAnimation(animation);
lastPosition = position;
holder.swedish.setText(word.getSwedish());
holder.english.setText(word.getEnglish());
return convertView;
}
@NonNull
@Override
public Filter getFilter() {
return wordFilter;
}
private Filter wordFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Word> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(mOriginalValuesFull);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for (Word word : mOriginalValuesFull) {
if (word.getSwedish().toLowerCase().contains(filterPattern) || word.getEnglish().toLowerCase().contains(filterPattern)) {
filteredList.add(word);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mOriginalValues.clear();
mOriginalValues.addAll((ArrayList)results.values);
notifyDataSetChanged();
}
};