package net.jejer.hipda.ui.setting; import android.content.Context; import android.content.DialogInterface; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.CompoundButton; import net.jejer.hipda.R; import net.jejer.hipda.bean.Forum; import net.jejer.hipda.bean.HiSettingsHelper; import net.jejer.hipda.utils.HiUtils; import net.jejer.hipda.utils.UIUtils; import java.util.ArrayList; import java.util.Collections; import java.util.List; import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; /** * Created by GreenSkinMonster on 2017-06-07. */ public class ForumSelectListener extends OnPreferenceClickListener { private Context mContext; private LayoutInflater mInflater; private List<ForumStatus> mForumSelctions; private View.OnClickListener mOnClickListener; ForumSelectListener(Context context) { mContext = context; mInflater = LayoutInflater.from(context); } @Override public boolean onPreferenceSingleClick(final Preference preference) { RecyclerView recyclerView = new RecyclerView(mContext); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext); recyclerView.setLayoutManager(linearLayoutManager); List<Integer> selectedForums = HiSettingsHelper.getInstance().getForums(); mForumSelctions = new ArrayList<>(HiUtils.FORUMS.length); for (int fid : selectedForums) { mForumSelctions.add(new ForumStatus(HiUtils.getForumByFid(fid), true)); } for (Forum forum : HiUtils.FORUMS) { if (!selectedForums.contains(forum.getId())) mForumSelctions.add(new ForumStatus(forum, false)); } final RvAdapter adapter = new RvAdapter(); ItemTouchHelper.Callback ithCallback = new ItemTouchHelper.Callback() { public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { Collections.swap(mForumSelctions, viewHolder.getAdapterPosition(), target.getAdapterPosition()); adapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition()); return true; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.DOWN | ItemTouchHelper.UP); } @Override public boolean isLongPressDragEnabled() { return true; } }; mOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { if (v instanceof CompoundButton) { int position = (Integer) v.getTag(); mForumSelctions.get(position).mEnabled = ((CompoundButton) v).isChecked(); } } }; ItemTouchHelper touchHelper = new ItemTouchHelper(ithCallback); touchHelper.attachToRecyclerView(recyclerView); recyclerView.setAdapter(adapter); AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setView(recyclerView); builder.setTitle(preference.getTitle()); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { List<Integer> forums = new ArrayList<>(); for (ForumStatus forumStatus : mForumSelctions) { if (forumStatus.mEnabled) { forums.add(forumStatus.mForum.getId()); } } if (forums.size() > 0) { HiSettingsHelper.getInstance().setForums(forums); preference.setSummary(HiUtils.getForumsSummary()); } else { UIUtils.toast("至少选择一个版面"); } } }); builder.setNegativeButton(android.R.string.cancel, null); AlertDialog dialog = builder.create(); dialog.show(); return true; } private class RvAdapter extends RecyclerView.Adapter { @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ViewHolder(mInflater.inflate(R.layout.item_forum_selector, parent, false)); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof ViewHolder) { CheckBox checkBox = ((ViewHolder) holder).cb_forum_enabled; checkBox.setText(mForumSelctions.get(position).mForum.getName()); checkBox.setChecked(mForumSelctions.get(position).mEnabled); checkBox.setTag(position); checkBox.setOnClickListener(mOnClickListener); } } @Override public int getItemCount() { return mForumSelctions != null ? mForumSelctions.size() : 0; } } private class ForumStatus { Forum mForum; boolean mEnabled; ForumStatus(Forum forum, boolean enabled) { mForum = forum; mEnabled = enabled; } } private static class ViewHolder extends RecyclerView.ViewHolder { CheckBox cb_forum_enabled; ViewHolder(View itemView) { super(itemView); cb_forum_enabled = (CheckBox) itemView.findViewById(R.id.forum_enabled); } } }