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); } } } }); } }
레이아웃 파일 RecyclerView 가로 세로 모두 "match_parent" 일 때, 클릭할 때 gridView가 자동으로 상승하며 거리를 이동합니다.
어댑터 구현:}
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; } }
편리한 채널 아이템 레이아웃도 같이 제공해 주세요:
<?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>
다른 주의할 점:
SpareBooleanArrary.size()가 반환하는 것은 이미 true로 설정된 길이입니다. 예를 들어, 하나를 선택하면1선택한 경우10이렇게 반환됩니다10그러나 선택한 경우10뒤에서 하나를 제거할 때, size()가 반환하는 것은9그리고 여전히10이 점을 주의해야 합니다. 따라서 순회할 때 size()를 사용하지 않았습니다.
이것이 본문의 전체 내용입니다. 여러분의 학습에 도움이 되길 바라며, 간호教程에 많은 지원을 부탁드립니다.
선언: 본문 내용은 인터넷에서 가져왔으며, 원저자에게 소유권이 있습니다. 내용은 인터넷 사용자가 자발적으로 기여하고 업로드한 것이며, 본 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해 내용을 발견하면 notice#w로 이메일을 보내 주시기 바랍니다.3codebox.com에 이메일을 보내면(#을 @으로 변경해 주세요) 신고하고 관련 증거를 제공해 주시면, 해당 도용 내용이 확인되면 즉시 해당 내용을 삭제하겠습니다.