私は同じ効果を達成する方法を見つけようとしています
mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
recyclerView実装で。助けてください。
RecyclerView
を使用した「選択モード」構造の組み込みサポートはありません。オプションは、自分でロールバックするか、それを提供するサードパーティのライブラリを使用することです。 DynamicRecyclerView library は選択モードを提供しますが、私は試していません。
このサンプルアプリ は、それを自分で実装する方法を示しています。この場合、アクティブ状態を使用して、現在の選択を示します。全体的なパターンは次のとおりです。
_RecyclerView.ViewHolder
_は、選択を示すUI操作を検出します(行をクリックしますか?行内のRadioButton
をクリックしますか?など)。
_RecyclerView.Adapter
_のレベルで選択を追跡します。私の場合、ChoiceCapableAdapter
戦略は、SingleChoiceMode
戦略を実装するChoiceMode
クラスと組み合わせて処理します。
選択が行われたら、新しく選択された行を更新して選択を反映しますand以前に選択された行を更新して、選択されなくなったことを反映します。 findViewHolderForPosition()
on RecyclerView
はここで役立ちます-最後の選択肢のposition
を追跡する場合、findViewHolderForPosition()
はそのためのViewHolder
を与えることができます選択できるので、「選択解除」できます。
RecyclerView
を管理しているアクティビティまたはフラグメントの保存済みインスタンス状態に設定することにより、構成変更全体の選択を追跡します。
Recyclerviewには選択モードのオプションはありません。単一選択と複数選択の両方に独自のロジックを追加する必要があります。 Single Choice Recyclerview の場合、ソースを gitHub に追加しました。
私はRecyclerViewに適用されるこの種の選択モード用のライブラリを作成しました。多分それは助けになるでしょう:
このライブラリは、複数選択の選択をRecyclerViewに統合するために作成されました。
Gradleとの統合は非常に簡単で、jcenterリポジトリとライブラリが必要です。
repositories {
jcenter()
}
...
dependencies {
compile 'com.davidecirillo.multichoicerecyclerview:multichoicerecyclerview:1.0.1'
}
MultiChoiceRecyclerViewをxmlファイルに追加します
<com.davidecirillo.multichoicesample.MultiChoiceRecyclerView
Android:id="@+id/multiChoiceRecyclerView"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
オブジェクトをインスタンス化し、ビューを接続します
MultiChoiceRecyclerView mMultiChoiceRecyclerView = (MultiChoiceRecyclerView) findViewById(R.id.multiChoiceRecyclerView);
アダプタをMultiChoiceAdapterに拡張し、通常の使用法に従ってRecyclerViewに追加します
public class MyAdapter extends MultiChoiceAdapter<MyViewHolder> {
public MyAdapter(ArrayList<String> stringList, Context context) {
this.mList = stringList;
this.mContext = context;
}
...
}
MyAdapter myAdapter = new MyAdapter(mList, getApplicationContext());
mMultiChoiceRecyclerView.setAdapter(myAdapter);
詳細とカスタマイズについて: https://github.com/dvdciri/MultiChoiceRecyclerView
これに従うことができます:
–データ(文字列名、ブール値を選択)
– itemClickListenerを使用したアダプター
–アクティビティまたはフラグメント
– activity_main(recyclerView)
– list_item(TextView、CheckBox)
データ
public class MultipleData {
private String mTitle;
private boolean mBoolean;
public MultipleData(String title, boolean mBoolean) {
this.mTitle = title;
this.mBoolean = mBoolean;
}
public String getTitle() {
return mTitle;
}
public void setTitle(String mTitle) {
this.mTitle = mTitle;
}
public boolean isBoolean() {
return mBoolean;
}
public void setBoolean(boolean mBoolean) {
this.mBoolean = mBoolean;
}
}
ビューactivity_main.xml(recyclerView)
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context="com.thedeveloperworldisyours.fullrecycleview.multiple.MultipleFragment">
<Android.support.v7.widget.RecyclerView
Android:id="@+id/multiple_fragment_recycler_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
</FrameLayout>
およびlist_item.xml(TextView、CheckBox)
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<TextView
Android:id="@+id/multiple_list_item_text"
Android:layout_width="match_parent"
Android:layout_height="90dp"
Android:text="@string/app_name"
Android:typeface="monospace"
Android:layout_toLeftOf="@+id/multiple_list_item_check_button"
Android:gravity="center"
Android:textSize="@dimen/multiple_list_item_size_rock_stars"/>
<RadioButton
Android:id="@+id/multiple_list_item_check_button"
Android:layout_width="wrap_content"
Android:layout_height="90dp"
Android:layout_alignParentRight="true"
Android:checked="false"
Android:clickable="false"
Android:focusable="false" />
</RelativeLayout>
ClickListenerを使用したアダプター
public class MultipleRecyclerViewAdapter extends RecyclerView
.Adapter<MultipleRecyclerViewAdapter
.DataObjectHolder> {
private List<MultipleData> mList;
private static MultipleClickListener sClickListener;
MultipleRecyclerViewAdapter(List<MultipleData> mList) {
this.mList = mList;
}
static class DataObjectHolder extends RecyclerView.ViewHolder
implements View
.OnClickListener {
TextView mTextView;
RadioButton mRadioButton;
DataObjectHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.multiple_list_item_text);
mRadioButton = (RadioButton) itemView.findViewById(R.id.multiple_list_item_check_button);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
sClickListener.onItemClick(getAdapterPosition(), v);
}
}
void changedData(int position) {
if (mList.get(position).isBoolean()) {
mList.get(position).setBoolean(false);
} else {
mList.get(position).setBoolean(true);
}
notifyDataSetChanged();
}
void setOnItemClickListener(MultipleClickListener myClickListener) {
this.sClickListener = myClickListener;
}
@Override
public DataObjectHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.multiple_list_item, parent, false);
DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
return dataObjectHolder;
}
@Override
public void onBindViewHolder(DataObjectHolder holder, int position) {
holder.mTextView.setText(mList.get(position).getTitle());
holder.mRadioButton.setChecked(mList.get(position).isBoolean());
}
@Override
public int getItemCount() {
return mList.size();
}
interface MultipleClickListener {
void onItemClick(int position, View v);
}
}
アクティビティまたはフラグメント
public class MultipleFragment extends Fragment implements MultipleRecyclerViewAdapter.MultipleClickListener{
MultipleRecyclerViewAdapter mAdapter;
public MultipleFragment() {
// Required empty public constructor
}
public static MultipleFragment newInstance() {
return new MultipleFragment();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.multiple_fragment, container, false);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.multiple_fragment_recycler_view);
MultipleData hendrix = new MultipleData("Jimi Hendrix", false);
MultipleData bowie = new MultipleData("David Bowie", false);
MultipleData morrison = new MultipleData("Jim Morrison", false);
MultipleData presley = new MultipleData("Elvis Presley", false);
MultipleData jagger = new MultipleData("Mick Jagger", false);
MultipleData cobain = new MultipleData("Kurt Cobain", false);
MultipleData dylan = new MultipleData("Bob Dylan", false);
MultipleData lennon = new MultipleData("John Lennon", false);
MultipleData mercury = new MultipleData("Freddie Mercury", false);
MultipleData elton = new MultipleData("Elton John", false);
MultipleData clapton = new MultipleData("Eric Clapton", false);
List<MultipleData> list = new ArrayList<>();
list.add(0, hendrix);
list.add(1, bowie);
list.add(2, morrison);
list.add(3, presley);
list.add(4, jagger);
list.add(5, cobain);
list.add(6, dylan);
list.add(7, lennon);
list.add(8, mercury);
list.add(9, elton);
list.add(10, clapton);
mAdapter = new MultipleRecyclerViewAdapter(list);
recyclerView.setAdapter(mAdapter);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
mAdapter.setOnItemClickListener(this);
return view;
}
@Override
public void onItemClick(int position, View v) {
mAdapter.changedData(position);
}
}
GitHubのこの例 および この複数選択の投稿 、および 単一選択のこの投稿 ハッピーコード!!!