10

メニューのように機能する 4 つのグリッド要素 (2*2) を持つ recyclerview があります。ただし、それらをクリックしても波及効果は表示されません。ビューが押されたことを視覚的に確認することなく、次のアクティビティに移動するだけです。誰でも助けることができますか?

主な活動

public class MainActivity extends AppCompatActivity implements MainMenuAdapter.OnItemClickListener {

    Toolbar toolbar;
    private static List<ViewModel> tileItems = new ArrayList<>();

    static {
        tileItems.add(new ViewModel("Activity", "#3F51B5", R.drawable.activity));
        tileItems.add(new ViewModel("Profile", "#E91E63", R.drawable.profile));
        tileItems.add(new ViewModel("Training", "#FF5722", R.drawable.training));
        tileItems.add(new ViewModel("Diet", "#4CAF50", R.drawable.diet));
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
        MainAdapter adapter = new MainAdapter(tileItems, MainActivity.this);
        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(this);


        // Toolbar
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

    }

    @Override
    public void onBackPressed() {
        this.moveTaskToBack(true);
//        this.finishAffinity();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override public void onItemClick(View view, ViewModel viewModel) {
    }
}

メインアダプター

public class MainAdapter extends RecyclerView.Adapter<MainMenuAdapter.ViewHolder> implements View.OnClickListener {

    private List<ViewModel> items;
    private OnItemClickListener onItemClickListener;
    private Context context;

    // Adapter constructor
    public MainAdapter(List<ViewModel> items, Context context) {
        this.items = items;
        this.context = context;
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_item, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {

        final ViewModel dataItem = items.get(position);
        viewHolder.colorBlock.setBackgroundColor(dataItem.getColor());
        viewHolder.menuName.setText(dataItem.getName());
        viewHolder.menuIcon.setImageResource(dataItem.getImage());
        viewHolder.itemView.setTag(dataItem);
        if (dataItem.getActivity() != null) {
            viewHolder.colorBlock.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent i = new Intent(context, dataItem.getActivity());
                    context.startActivity(i);

                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    @Override public void onClick(final View v) {
        // Give some time to the ripple to finish the effect
        if (onItemClickListener != null) {
            new Handler().postDelayed(new Runnable() {
                @Override public void run() {
                    onItemClickListener.onItemClick(v, (ViewModel) v.getTag());
                }
            }, 200);
        }
    }

    /** This is our ViewHolder class */
    public static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView menuName;
        public View colorBlock;
        public ImageView menuIcon;

        public ViewHolder(View convertView) {
            super(convertView); // Must call super() first

            menuName = (TextView) convertView.findViewById(R.id.menuName);
            colorBlock = (View) convertView.findViewById(R.id.colorBlock);
            menuIcon = (ImageView) convertView.findViewById(R.id.menuItem);
        }
    }

    public interface OnItemClickListener {

        void onItemClick(View view, ViewModel viewModel);

    }
}

activity_main.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_below="@id/toolbar"
        android:layout_width= "match_parent"
        android:layout_height = "match_parent" />

</RelativeLayout>

main_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"
    android:focusable="true"
    android:foreground="?android:attr/selectableItemBackground">

    <View
        android:id="@+id/colorBlock"
        android:layout_width="match_parent"
        android:layout_height="170dp" />

    <ImageView
        android:id="@+id/menuItem"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_centerHorizontal="true"
        android:padding="16dp"
        />

    <TextView
        android:id="@+id/menuName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:textColor="@android:color/white"
        android:textSize="16sp"/>
</RelativeLayout>
4

1 に答える 1

15

?android:selectableItemBackgroundmain_item.xml の背景をまたはに設定すると、リップル効果が発生します (@Budius のコメントは間違っています) ?selectableItemBackground。2番目のものへの参照を見つけました。ただし、AndroidStudio は com.android.support:design で非公開であると警告しました。そのプライベート バージョンを使用しようとすると、アプリがクラッシュしました。「android:」プレフィックスが付いた最初のものを推測しましたが、出来上がりです。

もしかしてandroid:foreground、たまたま設定してる?私はそれを試しましたが、私の RecyclerView アイテムには何も起こりませんでした。

更新された RelativeLayout は次のようになります。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true"
android:foreground="?android:attr/selectableItemBackground"
android:background="?android:selectableItemBackground">

android:background="?android:attr/selectableItemBackground"リップルを開始する作業も見てきました。また、selectableItemBackground が main_item.xml のルート要素にある必要はないことにも言及します。ルート項目で背景色を使用してから、ネストされた ViewGroup で selectableItemBackground を設定しています。

私の答えは、マテリアル デザイン appcompat を使用しない参照フレームから来ています。material design appcompat サポート ライブラリを使用している場合は、違いがあると思います。

于 2015-09-05T11:26:41.750 に答える