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

Android RecyclerView zur Auswahl mehrerer Items

Nachahmung der频道选择功能,如网易新闻客户端,先看实现的页面:


direkt zum Code:

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);
          }
        }
      }
    );
  }
}

Die Layout-Datei RecyclerView ist sowohl horizontal als auch vertical "match_parent", andernfalls wird die gridView automatisch um einen bestimmten Abstand nach oben geschoben, wenn darauf geklickt wird.

Adapter-Implementierung:

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;
  }
}

Bitte auch die Layout für das Element hinzufügen:

<?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>

Andere zu beachtende Punkte:

SpareBooleanArrary.size() gibt die Länge der bereits auf true gesetzten Werte zurück, z.B. wenn ein Wert ausgewählt wird, gibt es1wurde10wird10Während10Wenn Sie einen entfernen, gibt size() nicht zurück9Anstatt dies zu tun10Dieses Punkt sollte beachtet werden, daher wurde bei der Durchsuchung nicht size() zur Längenbestimmung verwendet.

Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und dass Sie die呐喊教程 weiter unterstützen.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrecht des jeweiligen Autors. Der Inhalt wurde von Internetnutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Diese Website übernimmt keine rechtlichen Verantwortlichkeiten. Wenn Sie urheberrechtlich geschützte Inhalte entdecken, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @, wenn Sie eine Beschwerde einreichen, und fügen Sie relevante Beweise bei. Sobald die Beschwerde bestätigt wird, wird diese Website die beanstandeten urheberrechtlichen Inhalte sofort löschen.)

Gefällt mir