Android
 Computer >> コンピューター >  >> プログラミング >> Android

Android RecyclerViewで選択したアイテムを適切に強調表示するにはどうすればよいですか?


この例は、AndroidRecyclerViewで選択したアイテムを適切に強調表示する方法を示しています。

ステップ1 − Android Studioで新しいプロジェクトを作成し、[ファイル]⇒[新しいプロジェクト]に移動して、新しいプロジェクトを作成するために必要なすべての詳細を入力します。

build.gradle(モジュール:app)に次の依存関係を追加します

implementation 'com.android.support:recyclerview-v7:28.0.0'

ステップ2 −次のコードをres / layout/activity_main.xmlに追加します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="https://schemas.android.com/apk/res/android"
   xmlns:tools="https://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:padding="4dp"
   tools:context=".MainActivity">
   <androidx.recyclerview.widget.RecyclerView
      android:id="@+id/recyclerView"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:paddingBottom="8dp" />
</RelativeLayout>

ステップ3 −レイアウトリソースファイル(list_layout.xml)を作成し、次のコードを追加します−

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="https://schemas.android.com/apk/res/android"
   android:id="@+id/container"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@drawable/background_selector"
   android:padding="16dp">
   <TextView
      android:id="@+id/awardTitle"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginTop="10dp"
      android:text="New Text"
      android:textSize="18sp"
      android:textStyle="bold" />
   <TextView
      android:id="@+id/awardYear"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_below="@+id/awardTitle"
      android:layout_alignStart="@+id/awardTitle"
      android:layout_marginTop="20dp"
      android:text="New Text"
      android:textColor="#000" />
   <TextView
      android:id="@+id/playerName"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentEnd="true"
      android:text="New Text" />
</RelativeLayout>

ステップ4 −以下のようにドローアブルリソースファイルを作成し、それぞれのコードを追加します-

background_selector.xml −

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="https://schemas.android.com/apk/res/android">
   <item android:drawable="@color/colorAccent" android:state_pressed="false" android:state_selected="true" />
   <item android:drawable="@android:color/white" android:state_selected="false" />
</selector>

line_divider.xml −

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="https://schemas.android.com/apk/res/android" android:shape="rectangle">
   <size
      android:width="2dp"
      android:height="2dp" />
   <solid android:color="@color/colorPrimaryDark" />
</shape>

ステップ5 −以下のようにJavaクラスファイルを作成し、それぞれのコードを追加します-

ItemObject

class ItemObject {
   private String awardTitle;
   private String awardYear;
   private String player;
   ItemObject(String awardTitle, String awardYear, String player) {
      this.awardTitle = awardTitle;
      this.awardYear = awardYear;
      this.player = player;
   }
   String getAwardTitle() {
      return awardTitle;
   }
   String getAwardYear() {
      return awardYear;
   }
   String getPlayer() {
      return player;
   }
}

RecyclerViewAdapter −

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class RecyclerViewAdapter extends
RecyclerView.Adapter<RecyclerViewHolders> {
   private List<ItemObject> itemList;
   RecyclerViewAdapter(Context context, List<ItemObject> itemList) {
      this.itemList = itemList;
   }
   @NonNull
   @Override
   public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
      View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_layout, null);
      return new RecyclerViewHolders(layoutView);
   }
   @Override
   public void onBindViewHolder(RecyclerViewHolders holder, int position) {
      holder.awardTitle.setText("Award Title: " + itemList.get(position).getAwardTitle());
      holder.awardYear.setText("Award Year: " + itemList.get(position).getAwardYear());
      holder.player.setText("Player Name: " + itemList.get(position).getPlayer());
   }
   @Override
   public int getItemCount() {
      return this.itemList.size();
   }
}

RecyclerViewHolders

import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
class RecyclerViewHolders extends RecyclerView.ViewHolder implements
View.OnClickListener {
   TextView awardTitle;
   TextView awardYear;
   TextView player;
   private SparseBooleanArray selectedItems = new SparseBooleanArray();
   RecyclerViewHolders(View itemView) {
      super(itemView);
      itemView.setOnClickListener(this);
      awardTitle = itemView.findViewById(R.id.awardTitle);
      awardYear = itemView.findViewById(R.id.awardYear);
      player = itemView.findViewById(R.id.playerName);
   }
   @Override
   public void onClick(View view) {
      if (selectedItems.get(getAdapterPosition(), false)) {
         selectedItems.delete(getAdapterPosition());
         view.setSelected(false);
      }
       else {
         selectedItems.put(getAdapterPosition(), true);
         view.setSelected(true);
      }
   }
}

SimpleItemDecoration

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
class SimpleItemDecoration extends RecyclerView.ItemDecoration {
   private Drawable drawable;
   SimpleItemDecoration(Context context) {
      drawable = ContextCompat.getDrawable(context, R.drawable.line_divider);
   }
   @Override
   public void onDrawOver(@NonNull Canvas canvas, RecyclerView parent, @NonNull RecyclerView.State state) {
      int left = parent.getPaddingLeft();
      int right = parent.getWidth() - parent.getPaddingRight();
      int childCount = parent.getChildCount();
      for (int i = 0; i < childCount; i++) {
         View child = parent.getChildAt(i);
         RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
         int top = child.getBottom() + params.bottomMargin;
         int bottom = top + drawable.getIntrinsicHeight();
         drawable.setBounds(left, top, right, bottom);
         drawable.draw(canvas);
      }
   }
}

ステップ6 −次のコードをsrc / MainActivity.java

に追加します
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      RecyclerView recyclerView = findViewById(R.id.recyclerView);
      recyclerView.addItemDecoration(new SimpleItemDecoration(this));
      LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
      recyclerView.setLayoutManager(layoutManager);
      List<ItemObject> posts = returnListItems();
      RecyclerViewAdapter adapter = new RecyclerViewAdapter(MainActivity.this, posts);
      recyclerView.setAdapter(adapter);
   }
   private List<ItemObject> returnListItems() {
      List<ItemObject> items = new ArrayList<>();
      items.add(new ItemObject("Ballon'd'or", "2007", "Ricardo KaKa"));
      items.add(new ItemObject("Ballon'd'or", "2008", "Cristiano Ronaldo"));
      items.add(new ItemObject("Ballon'd'or", "2009 - 2012, 2015", "Lionel Messi"));
      items.add(new ItemObject("Ballon'd'or", "2013, 2014, 2016, 2017", "Cristiano Ronaldo"));
      items.add(new ItemObject("Ballon'd'or", "2018", "Luca Modric"));
      items.add(new ItemObject("Ballon'd'or", "2019", "Haven't decided yet"));
      return items;
   }
}

ステップ7 −次のコードをandroidManifest.xmlに追加します

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:roundIcon="@mipmap/ic_launcher_round"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
      <activity android:name=".MainActivity">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>
</manifest>

アプリケーションを実行してみましょう。実際のAndroidモバイルデバイスをコンピューターに接続していると思います。 Android Studioからアプリを実行するには、プロジェクトのアクティビティファイルの1つを開き、ツールバーの[実行]アイコンをクリックします。オプションとしてモバイルデバイスを選択し、デフォルトの画面を表示するモバイルデバイスを確認します-

Android RecyclerViewで選択したアイテムを適切に強調表示するにはどうすればよいですか?


  1. スピナーの選択したアイテムをAndroidの位置ではなく値で設定するにはどうすればよいですか?

    この例は、Spinnerの選択したアイテムを、Androidの位置ではなく値で設定する方法を示しています。 ステップ1 − Android Studioで新しいプロジェクトを作成し、[ファイル]⇒[新しいプロジェクト]に移動して、新しいプロジェクトを作成するために必要なすべての詳細を入力します。 ステップ2 −次のコードをres / layout/activity_main.xmlに追加します。 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=

  2. AndroidのTextViewでテキストを正当化する方法は?

    この例は、AndroidのTextViewでテキストを正当化する方法を示しています。 ステップ1 − Android Studioで新しいプロジェクトを作成し、[ファイル]⇒[新しいプロジェクト]に移動して、新しいプロジェクトを作成するために必要なすべての詳細を入力します。 ステップ2 −次のコードをres / layout/activity_main.xmlに追加します。 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http: