【问题标题】:How do I implement multiple intent from each Card from CardView with RecyclerView?如何使用 RecyclerView 从 CardView 中的每个 Card 实现多个意图?
【发布时间】:2020-07-10 22:04:08
【问题描述】:
  1. 当我的 CardView 卡片被点击时,我想实现一个新的意图。我已经为其中一张卡实施了。适配器是否有任何其他方式能够识别位置并为每张卡带来新的活动?就像使用模板布局将每张卡片链接到它们各自的活动一样。 (每张卡片的新活动将具有相同的布局,只是不同的文本和图像)。

  2. 我在卡片上添加了一个 ImageButton。但是,当我单击 ImageButton 时,它并没有将我带到新的活动中。单击卡片边缘/部分而不是图像本身将起作用。我的代码有什么遗漏吗?我似乎无法得到它。

这是我的代码:

MuaActivity.java

    package android.com.example.weddingappfinale;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.inputmethod.EditorInfo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

import Adapters.MuaAdapter;
import CustomerActivities.ShimaMatinActivity;

public class MuaActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private MuaAdapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

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

        getSupportActionBar().setTitle("Make Up Artists");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        final ArrayList<MuaView> muaView = new ArrayList<>();
        muaView.add(new MuaView(R.drawable.mua_image, "Shima Matin Bridal Services"));
        muaView.add(new MuaView(R.drawable.mua_image, "Aake Up Artist Pte Ltd"));
        muaView.add(new MuaView(R.drawable.mua_image, "Lake Up Artist 3Pte Ltd"));
        muaView.add(new MuaView(R.drawable.mua_image, "f Up Artist Pte Ltd"));

        // ArrayList

        mRecyclerView = findViewById(R.id.recycler_view_list);
        mRecyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(this);
        mAdapter = new MuaAdapter(muaView);

        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);

        mAdapter.setOnItemClickListener(new MuaAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                Intent i = new Intent (MuaActivity.this, ShimaMatinActivity.class);
                startActivity(i);
                finish();
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.search, menu);

        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchItem.getActionView();

        searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                mAdapter.getFilter().filter(newText);
                return false;
            }
        });
        return true;
    }
}

MuaAdapter.java

    package Adapters;

import android.com.example.weddingappfinale.MuaView;
import android.com.example.weddingappfinale.R;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageButton;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MuaAdapter extends RecyclerView.Adapter<MuaAdapter.MuaViewHolder> implements Filterable {
    private ArrayList<MuaView> mMuaView;
    private ArrayList<MuaView> mMuaViewFull;
    private OnItemClickListener mListener;

    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        mListener = listener;
    }

    public static class MuaViewHolder extends RecyclerView.ViewHolder {
        public ImageButton mImageButton;
        public TextView mTextView1;

        public MuaViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
            super(itemView);
            mImageButton = itemView.findViewById(R.id.mua_imageButton);
            mTextView1 = itemView.findViewById(R.id.mua_title);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null) {
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION) {
                            listener.onItemClick(position);
                        }
                    }
                }
            });
        }
    }

    public MuaAdapter(ArrayList<MuaView> muaView) {
        this.mMuaView = muaView;
        mMuaViewFull = new ArrayList<>(muaView);
    }

    @NonNull
    @Override
    public MuaViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.mua_view, parent, false);
        MuaViewHolder mvh = new MuaViewHolder(v, mListener);
        return mvh;
    }

    @Override
    public void onBindViewHolder(@NonNull MuaViewHolder holder, int position) {
        MuaView currentView = mMuaView.get(position);

        holder.mImageButton.setImageResource(currentView.getImageResource());
        holder.mTextView1.setText(currentView.getText1());
    }

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

    public Filter getFilter() {
        return MuaFilter;
    }

    private Filter MuaFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<MuaView> filteredList = new ArrayList<>();

            if (constraint == null || constraint.length() == 0) {
                filteredList.addAll(mMuaViewFull);
            } else {
                String filterPattern = constraint.toString().toLowerCase().trim();

                for (MuaView item : mMuaViewFull) {
                    if (item.getText1().toLowerCase().contains(filterPattern)) {
                        filteredList.add(item);
                    }
                }
            }

            FilterResults results = new FilterResults();
            results.values = filteredList;

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mMuaView.clear();
            mMuaView.addAll((ArrayList) results.values);
            notifyDataSetChanged();

        }
    };
}

【问题讨论】:

    标签: android-studio android-activity android-recyclerview android-cardview


    【解决方案1】:

    第一个问题的答案: 您可以使用 intent.putExtra() 将项目的位置传递给新活动。 在新活动中,您可以使用 intent.getExtra() 读出数字并根据您获得的数字设置您想要的布局内容。 这样你就只有一个 Activity 而不是很多。 活动一

    Intent intent = new Intent(this, Shima.class);
    intent.putExtra("position_value", position);
    startActivity(intent);
    

    活动 2

    Intent intent = getIntent();
    int position = intent.getIntExtra("position_value", 0); // 0 is the default value
    // set a layout based on position with switch case or if...
    switch (position){
       case 1:
             setContentView(R.layout.activity_card_one);
             break;
       case 2:
             setContentView(R.layout.activity_card_two);
             break;
    ....
    

    第二个问题: 见here

    基本上和

    一样

    itemView.setOnClickListener(new View.OnClickListener() {...

    您可以使用类似的方法根据单击的项目设置图像

    private Integer images[] = {R.drawable.pic1, R.drawable.pic2, R.drawable.pic3}
    

    imageView.setImageResource(images[position]);
    

    (可能位置-1,不确定recyclerView中的第一项是1还是0)

    【讨论】:

    • 您好,感谢您的回复。我还没有尝试过,但这是否意味着对于每个位置,我都会得到我想要的布局?还是只有一种布局?
    • 嗨,你可以有一个你写的模板布局,但如果你想为一些/或所有位置有一些不同的模板,你可以简单地使用 setContentView 加载不同的布局。(R.layout.your_layout)在 onCreate 中取决于您的意图,因此您会获得每个位置所需的布局。
    • 嗨,巴德,我做对了。但是,每张卡都打开相同的布局。我相信这与职位有关。如何设置每个 cardView 的位置以使每个 cardView 都有自己的布局?谢谢。
    • 您好,您是否已经为每张卡片创建了布局文件?如果没有为每个布局创建您想要在 res -> 布局文件夹中的新布局。比您可以使用带有项目位置的开关盒并调用 setContentView(R.layout.activity_Card_one);
    • 它们遵循单一布局,但具有不同的图像和文本。像这样 [youtube.com/watch?v=ZXoGG2XTjzU]
    猜你喜欢
    • 2016-10-07
    • 2018-12-09
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多