- 私は自分のアプリでRecyclerviewを実装しています。アイテムをクリックして別のリストビューを更新する必要があります。そのため、アクティビティでonClickイベントを実装しました。それはうまく動作します。
- しかし、私はハイライトRecyclerViewの選択ビューを必要とし、その他は正常なままです。
- 私は、RecyclerView getChildメソッドを使用して、すべてのビューを通常にしてからハイライトを選択しました。
- 私はRecyclerViewのVisibleビューでのみ動作することを認識しています。 しかし、私はRecyclerviewのすべてのビューを正常にする必要がありました。そして、より大きな位置でgetChildAtを使用した場合、合計可視回数はNULLポインタ例外を返します。 29
RecyclerView getChildAt(position)はnullを返します
E /商品のRv:15
E /子アダプタ:30
私はE /商品順位
を得ること
- ログイン
MainActivity.java
public class MainActivity extends Activity { RecyclerView reView; ArrayList<RvModel> rvModels; revAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); reView = (RecyclerView) findViewById(R.id.reView); reView.setLayoutManager(new GridLayoutManager(MainActivity.this, 3)); rvModels = new ArrayList<>(); adapter = new revAdapter(MainActivity.this, rvModels); reView.setAdapter(adapter); prepareData(); reView.addOnItemTouchListener(new RecyclerItemClickListener(MainActivity.this, reView, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Log.e("Item Pos", "" + position); Log.e("Item Rv", "" + reView.getChildCount()); Log.e("Child Adapter", "" + reView.getAdapter().getItemCount()); for (int i = 0; i < reView.getChildCount(); i++) { View v = reView.getChildAt(i); TextView txtText = (TextView) v.findViewById(R.id.txtText); txtText.setBackgroundColor(Color.WHITE); txtText.setTextColor(Color.BLUE); } TextView txtText = (TextView) view.findViewById(R.id.txtText); txtText.setBackgroundColor(Color.BLUE); txtText.setTextColor(Color.WHITE); } @Override public void onLongItemClick(View view, int position) { } })); } private void prepareData() { rvModels.clear(); for (int i = 0; i < 30; i++) { RvModel rvModel = new RvModel(); rvModel.setTitle("Item : " + i); rvModels.add(rvModel); } adapter.notifyDataSetChanged(); } }
revAdapter.java
public class revAdapter extends RecyclerView.Adapter<revAdapter.ViewHolder> { Context context; ArrayList<RvModel> rvModels; LayoutInflater inflater; public revAdapter(Context context, ArrayList<RvModel> rvModels) { this.context = context; this.rvModels = rvModels; inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public class ViewHolder extends RecyclerView.ViewHolder { ImageView ivIcon; TextView txtText; public ViewHolder(View itemView) { super(itemView); ivIcon = (ImageView) itemView.findViewById(R.id.ivIcon); txtText = (TextView) itemView.findViewById(R.id.txtText); } } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = inflater.inflate(R.layout.rv_raw, parent, false); return new ViewHolder(itemView); } @Override public void onBindViewHolder(ViewHolder holder, int position) { RvModel rvModel = rvModels.get(position); holder.txtText.setText(rvModel.getTitle()); } @Override public int getItemCount() { return rvModels.size(); } @Override public int getItemViewType(int position) { return position; } }
rv_raw.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:padding="10dp"> <ImageView android:id="@+id/ivIcon" android:layout_width="100dp" android:layout_height="100dp" android:src="@mipmap/ic_launcher" /> <TextView android:id="@+id/txtText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout>
おかげで偉大な説明
だから、あなたの質問に応じて、あなたはいくつかの並べ替えを持っています。また、getItemViewTypeメソッドを使用したくないときは、この例ではなく、スクロール中にRecyclerビューのビューを使用していないときはいつでも更新します。そのリサイクルビューのグリッドレイアウトを使用する別のアプリ内で発生します。 –