English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تحقيق تحديد عدة عناصر في RecyclerView لـ Android

بالنسبة لتحديد القنوات المفضلة في تطبيق وكالة الأخبار ويب، أولاً نرى الصفحة المطبقة:


المسلسل المباشر للكود:

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.helper.ItemTouchHelper;
import android.util.Log;
استيراد أندرويد يول اسبارس بولي آراي;
استيراد أندرويد فيو;
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 نقرة_النقر(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);
    للأسفل (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
      الطريقة العامة void onItemClick(View view, int position) {
        SparseBooleanArray selecteds = mAdapter.getSelectedItem();
        int len = channels.size();
        للأسفل (int i = 0; i < len; i++) {
          إذا (selecteds.get(i)) {
            channelsSelected.get(position).setSelected(true);
          }
        }
      }
    );
  }
}

ملف التصميم لريكايفر يجب أن يكون طوله وعرضه "مطابق للأب"، وإلا سيتم تمرير gridview تلقائيًا عند النقر.

تنفيذ الأداة المخصصة:;

استيراد أندرويد سبريت فيكيت ويدجت ريكايفر;
استيراد أندرويد يول اسبارس بولي آراي;
استيراد أندرويد يول أينلفتر;
استيراد أندرويد فيو;
استيراد أندرويد فيو جروب;
استيراد أندرويد ويدجت إيكون;
استيراد أندرويد ويدجت ريلاتيف لولي;
استيراد أندرويد ويدجت تيكسيت فيو;
استيراد كوم بانك كوم.إنت.بريفر كاستمير كانيل;
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#oldtoolbag.com (الرجاء استبدال #بـ @) للإبلاغ، وتقديم الدليل ذات الصلة، وإذا تم التحقق من ذلك، فإن هذا الموقع سيقوم بإزالة المحتوى المشبوه بسرعة.

أنت قد تعجبك