English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
模仿网易新闻客户端阅读偏好的频道选择,先看实现的页面:
直接上代码:
import android.content.res.Resources; import android.content.res.TypedArray; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.util.Log; import android.util.SparseBooleanArray; import android.view.View; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class RecyclerViewActivity extends AppCompatActivity { private RecyclerView recycler; private RecyclerAdapter mAdapter; private List<PreferCustomizableChannel> channels = new ArrayList<>(); private List<PreferCustomizableChannel> channelsSelected; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycler_view_acitivity); initData(); initUI(); findViewById(R.id.resultBTN).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int lens = channelsSelected.size(); for (int i = 0; i < lens; i++) { PreferCustomizableChannel customizableChannel = channelsSelected.get(i); if (customizableChannel.isSelected()) { Log.i("RecyclerViewActivity", "onClick: ");+customizableChannel.toString()); } } } ); } private void initData() { Resources resources = getResources(); TypedArray array = resources.obtainTypedArray(R.array.prefer_channel_icon); int len = array.length(); String[] name = resources.getStringArray(R.array.prefer_channel_name); for (int i = 0; i < len; i++) { PreferCustomizableChannel customizableChannel = new PreferCustomizableChannel(); customizableChannel.setChannel(name[i]); customizableChannel.setResId(array.getResourceId(i, 0)); customizableChannel.setSelected(false); customizableChannel.setId(i * 100); channels.add(customizableChannel); } array.recycle(); channelsSelected = channels; } private void initUI() { recycler = (RecyclerView) findViewById(R.id.recycler); final GridLayoutManager manager = new GridLayoutManager(this, 3) recycler.setLayoutManager(manager); recycler.setHasFixedSize(true); recycler.setItemAnimator(new DefaultItemAnimator()); mAdapter = new RecyclerAdapter(RecyclerViewActivity.this, channels); recycler.setAdapter(mAdapter); mAdapter.setClickListener(new OnRecyclerViewItemClickListener() { @Override public void onItemClick(View view, int position) { SparseBooleanArray selecteds = mAdapter.getSelectedItem(); int len = channels.size(); for (int i = 0; i < len; i++) { if (selecteds.get(i)) { channelsSelected.get(position).setSelected(true); } } } ); } }
Le fichier de conception RecyclerView est horizontal et vertical "match_parent", sinon, lors du clic, le gridView glissera automatiquement d'une certaine distance.
l'implémentation de l'adaptateur :
import android.support.v7.widget.RecyclerView; import android.util.SparseBooleanArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.entity.PreferCustomizableChannel; import com.listener.OnRecyclerItemClickListener; import java.util.List; import butterknife BindView; import butterknife ButterKnife; public class PreferChannelAdapter extends RecyclerView.Adapter<PreferChannelAdapter.PreferChannelHolder>{ private List<PreferCustomizableChannel> lists; private OnRecyclerItemClickListener listener; private SparseBooleanArray selectLists = new SparseBooleanArray(); public PreferChannelAdapter() { } public void setDatas(List<PreferCustomizableChannel> lists) { this.lists = lists; notifyDataSetChanged(); } public void setOnItemClickListener(OnRecyclerItemClickListener listener) { this.listener = listener; } @Override public PreferChannelHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.prefer_channel_item, null); return new PreferChannelHolder(view); } @Override public void onBindViewHolder(final PreferChannelHolder holder, final int position) { PreferCustomizableChannel channelItem = lists.get(position); holder.channelItemTV.setText(channelItem.getChannel()); holder.channelItemImg.setImageResource(channelItem.getResId()); if (!selectLists.get(position)) { holder.selectedMarkImg.setVisibility(View.GONE); } else { holder.selectedMarkImg.setVisibility(View.VISIBLE); } holder.preferChannelItemLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (holder.selectedMarkImg.getVisibility() == View.GONE) { holder.selectedMarkImg.setVisibility(View.VISIBLE); selectLists.put(position, true); } else if (holder.selectedMarkImg.getVisibility() == View.VISIBLE) { holder.selectedMarkImg.setVisibility(View.GONE); selectLists.put(position, false); } listener.onRecyclerClick(position); } ); } @Override public int getItemCount() {}} return lists.size(); } public class PreferChannelHolder extends RecyclerView.ViewHolder { @BindView(R.id.preferChannelItemLayout) RelativeLayout preferChannelItemLayout; @BindView(R.id.channelItemTV) TextView channelItemTV; @BindView(R.id.channelItemImg) ImageView channelItemImg; @BindView(R.id.selectedMarkImg) ImageView selectedMarkImg; public PreferChannelHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } } public SparseBooleanArray getSelectedItem() { return selectLists; } }
Montrez également la mise en page de l'élément :
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@"+id/preferChannelItemLayout" android:gravity="center" android:layout_gravity="center" android:layout_marginTop="10dp android:layout_width="wrap_content" android:layout_height="wrap_content"> <!--android:gravity="center" android:layout_gravity="center"--> <ImageView android:id="@"+id/channelItemImg" android:scaleType="centerInside" android:layout_width="68dp android:layout_height="wrap_content"/> <TextView android:id="@"+id/channelItemTV" android:gravity="center" android:layout_marginLeft="20dp android:layout_marginRight="20dp android:layout_marginBottom="20dp android:layout_marginTop="8dp android:layout_below="@id/channelItemImg" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@"+id/selectedMarkImg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:visibility="gone" android:layout_alignRight="@id/channelItemImg" android:src="@mipmap/prefer_selected"/> </RelativeLayout>
Autres points à noter :
SpareBooleanArrary.size() retourne la longueur déjà définie comme true, par exemple, si l'un est sélectionné, il retourne1Ainsi que10Retourne10Mais dans la sélection10En enlevant un à la fin, size() ne retourne pas9Et toujours10Cela doit être noté, donc lors de l'itération, size() n'a pas été utilisé pour obtenir la longueur.
C'est tout pour cet article, j'espère que cela aidera à votre apprentissage et que vous soutiendrez également le tutoriel d'alarme.
Déclaration : le contenu de cet article est tiré d'Internet, propriété intellectuelle de son auteur respectif. Le contenu est apporté par les utilisateurs d'Internet et téléchargé spontanément. Ce site ne détient pas de propriété, n'a pas été édité par l'homme, et n'assume aucune responsabilité juridique. Si vous trouvez du contenu présumé enfreindre les droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu présumé enfreindre les droits d'auteur.)