web-dev-qa-db-ja.com

RecyclerView CardViewクリックされたアイテムデータをアクティビティに渡す

クリックされたカードビューデータをアクティビティに渡すことについて質問があります。

  1. 「詳細」と呼ばれるアクティビティがあり、そのレイアウトに2つのTextView、タイトルと説明が含まれています。

  2. Recyclerviewコードと項目データを含むフラグメント(tab_1)をセットアップしました。これらの各項目には、タイトルと説明が含まれています。

私が欲しいもの:

ユーザーがアイテムをクリックすると、詳細アクティビティが開き、詳細レイアウトのタイトルが変更され、クリックしたアイテムのタイトルが変わります。

私は例として他のアクティビティを作成するように管理し、それを開始するつもりで、さらにStackoverflowのおかげで「addOnTouchlistener」を追加しました。その方法を見つけました。

では、これをどうやって生かすのでしょうか? Stackoverflowで利用可能な答えの多くの方法を試しましたが、すべてが機能しないか、私の要求に関連していません。

これが私のファイルです:

itemsdata.Java:

public class itemsdata {
int CatPic;
String title;
String Descr;
int Exapnd;
int expand_no;

tab_1.Java(フラグメント)

public class tab_1 extends Fragment implements SearchView.OnQueryTextListener {

private RecyclerView mRecyclerView;
public RecyclingViewAdapter adapter;
private Activity context;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View layout = inflater.inflate(R.layout.tab_1, container, false);
    mRecyclerView = (RecyclerView)layout.findViewById(R.id.recycler_view);
    mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener
            (getContext(), new RecyclerItemClickListener.OnItemClickListener() {

                @Override
                public void onItemClick(View view, int position) {
                    Intent i = new Intent(view.getContext(), DetailsActivity.class);
                    view.getContext().startActivity(i);
                }
            }));
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    adapter = new RecyclingViewAdapter(getActivity(),Listed());
    mRecyclerView.setAdapter(adapter);
    return layout;

}


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.main, menu);

    final MenuItem item = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setOnQueryTextListener(this);
}

@Override
public boolean onQueryTextChange(String query) {
    final List<itemsdata> filteredModelList = filter(Listed(), query);
    adapter.animateTo(filteredModelList);
    mRecyclerView.scrollToPosition(0);
    return true;
}

@Override
public boolean onQueryTextSubmit(String query) {
    return true;
}

private List<itemsdata> filter(List<itemsdata> models, String query) {
    query = query.toLowerCase();

    final List<itemsdata> filteredModelList = new ArrayList<>();
    for (itemsdata model : models) {
        final String text = model.title.toLowerCase();
        if (text.contains(query)) {
            filteredModelList.add(model);
        }
    }
    return filteredModelList;
}

public List<itemsdata> Listed()
{
    //Titles Strings
    String sys_title1 = getString(R.string.system_item_title_1);
    String sys_title2 = getString(R.string.system_item_title_2);
    String sys_title3 = getString(R.string.system_item_title_3);

    //Description Strings
    String sys_descr1 = getString(R.string.system_item_desc_1);
    String sys_descr2 = getString(R.string.system_item_desc_2);
    String sys_descr3 = getString(R.string.system_item_desc_3);

    //Adding New Cards
    List<itemsdata> data = new ArrayList<>();

    //Categories Icons New Items ** Make It The Same
    int[] icons = {
            R.drawable.facebook_icon ,
            R.drawable.Twitter_icon ,
            R.drawable.Twitter_icon
    };

    //Expand Button New Items
    int[] expandbutton = {
            R.drawable.expanded ,
            R.drawable.expanded ,
            R.drawable.expanded
    };

    //UnExpand Button New Items
    int[] unexpandbutton = {
            R.drawable.ca_expand ,
            R.drawable.ca_expand ,
            R.drawable.ca_expand
    };

    //Titles New Items
    String[] titles = {
            sys_title1 ,
            sys_title2 ,
            sys_title3
    };

    //Description New Items
    String[] Description = {
            sys_descr1 ,
            sys_descr2 ,
            sys_descr3
    };


    for(int i = 0;i<titles.length && i < icons.length  && i < Description.length && i < unexpandbutton.length && i < expandbutton.length  ; i++)
    {
        itemsdata current = new itemsdata();
        current.CatPic = icons[i];
        current.title = titles[i];
        current.Descr = Description[i];
        current.expand_no = unexpandbutton[i];
        current.Exapnd = expandbutton[i];
        data.add(current);
    }
    return data;
}

}

詳細アクティビティ:

public class DetailsActivity extends AppCompatActivity{

TextView title;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.details);
    title = (TextView)findViewById(R.id.details_title);
}

編集:私はそれを作りました、私はフラグメントを開くボタンを追加し、データをアダプターに渡しました、しかし私はそれをアダプターではなくtab_1.Javaを介して欲しいので、私はアイテムをクリックしたいのですがボタンではなく、フラグメントを開きます。ここでは、アダプタコードからのスナップ(OnBindViewHolderで追加しました)

OnClickをセットアップしてVew.setOnClick ..etcを実装しましたが、アイテムをクリックしても何も起こりません。

 @Override
public void onBindViewHolder(final MyRecycleViewHolder holder, int position) {

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(v.getContext(),DetailsActivity.class);
            v.getContext().startActivity(i);
        }
    });

    //Referencing Data
    final itemsdata currentobject = mdata.get(position);
    //Referencing Items
    holder.ProbTitle.setText(currentobject.title);
    holder.ProbDescr.setText(currentobject.Descr);
    holder.CategoryPic.setImageResource(currentobject.CatPic);
    holder.ExpandButton.setImageResource(currentobject.Exapnd);
    holder.ExpandNoButton.setImageResource(currentobject.expand_no);
        //What Happen When You Click Expand Button .
    holder.ExpandButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(v.getContext(), DetailsActivity.class);
            i.putExtra("TitleKey",holder.ProbTitle.getText().toString());
            v.getContext().startActivity(i);
            }
        }
    );

public static class MyRecycleViewHolder extends RecyclerView.ViewHolder
{



    SwipeLayout swipeLayout;
    //Defining Items .
    TextView ProbTitle;
    ImageButton ExpandButton;
    TextView ProbDescr;
    ImageButton ExpandNoButton;
    ImageView CategoryPic;
    /*
    TextView Card_Star;
    TextView Card_UnStar;
    */
    TextView Card_Share;

    //Referencing Resources
    public MyRecycleViewHolder(final View itemView) {
        super(itemView);
        ProbTitle = (TextView) itemView.findViewById(R.id.prob_title);
        CategoryPic = (ImageView) itemView.findViewById(R.id.cat_pic);
        ProbDescr = (TextView) itemView.findViewById(R.id.prob_descr);
        ExpandButton = (ImageButton) itemView.findViewById(R.id.expand_button);
        ExpandNoButton = (ImageButton) itemView.findViewById(R.id.expand_no_button);
        /*
        Card_Star = (TextView) itemView.findViewById(R.id.card_star);
        Card_UnStar = (TextView) itemView.findViewById(R.id.card_unstar);
        */
        Card_Share = (TextView) itemView.findViewById(R.id.card_share);
        swipeLayout = (SwipeLayout) itemView.findViewById(R.id.swipe);

    }
9
Jaeger

Interfaceを含むアダプタ内にmethodsを作成します。そして、あなたのアダプターを実装している間、それらのメソッドはあなたの活動に実装され、あなたはあなたが望むどんな行動も実行することができます。

    public class Adapter extends RecyclerView.Adapter<MyRecycleViewHolder> {

    public interface Callbacks {
        public void onButtonClicked(String titleKey);
    }

    private Callbacks mCallbacks;

    public Adapter() {

    }

    @Override
    public MyRecycleViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_details, null);
        return new MyRecycleViewHolder(v);
    }

    @Override
    public void onBindViewHolder(final MyRecycleViewHolder holder, final int i) {

        holder.ExpandButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mCallbacks != null) {
                    mCallbacks.onButtonClicked(holder.ProbTitle.getText().toString());
                }
            }
        });

    }


    @Override
    public int getItemCount() {
        return;
    }

    public void setCallbacks(Callbacks callbacks) {
        this.mCallbacks = callbacks;
    }
}   
3
Vipul Asri

あなたはあなたのonItemClick()でこれを試すことができます

Intent i = new Intent(view.getContext(), DetailsActivity.class); i.putExtra("title", yourTitle); i.putExtra("description", yourDescription); view.getContext().startActivity(i);

そして、DetailActivityでoncreateするとき、これを行います

String title = getIntent().getStringExtra("title"); String description = getIntent().getStringExtra("description");

タイトルと説明をDetailActivityに渡すことができます

1
chichiangho

まず、「itemsdata」オブジェクトを作成してParcelableを実装します。確認できます こちら 。 onItemClickメソッドで、intent.putExtra( "key"、listOfDataItems.get(position));を使用してオブジェクトをDetailsアクティビティに渡します。 DetailsActivityでは、getParcelable( "key")を使用してカスタムオブジェクトを取得できます

1
Stefan

上記の方法はすべて機能しましたが、少し長いので、これは私にとってはうまくいきました:

Cardview cardview;
            cardView = (CardView)itemView.findViewById(R.id.cv);

        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent (view.getContext(), DetailsActivity.class);
                i.putExtra("TitleKey",ProbTitle.getText().toString());
                i.putExtra("DescrKey",ProbDescr.getText().toString());
                view.getContext().startActivity(i);
            }
        });

そして、Details.Javaで:

    TextView title;
TextView Descr;
        title = (TextView)findViewById(R.id.details_title);
    Descr = (TextView)findViewById(R.id.details_descr);

    String titleresult = result.getExtras().getString("TitleKey");
    String Descrresult = result.getExtras().getString("DescrKey");

    title.setText(titleresult);
    Descr.setText(Descrresult);
1
Jaeger

IMO、あなたはsetOnClickListener of Adapterの内部にRecyclerViewを実装します。次のサンプルコードを参照して、そのロジックをコードに適用できます。それが役に立てば幸い!

public class MyRVAdapter extends RecyclerView.Adapter<MyRVAdapter.ViewHolder> {

    Context mContext;
    List<String> mStringList;

    public MyRVAdapter(Context mContext, List<String> mStringList) {
        this.mContext = mContext;
        this.mStringList = mStringList;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, parent, false);
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView textView1 = (TextView) v.findViewById(R.id.textView1);
                TextView textView2 = (TextView) v.findViewById(R.id.textView2);
                Bundle bundle = new Bundle();
                bundle.putString("key1", textView1.getText().toString());
                bundle.putString("key2", textView2.getText().toString());

                passToAnotherActivity(bundle);
            }
        });
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        // do something...
    }

    @Override
    public int getItemCount() {
        if (mStringList != null) {
            return mStringList.size();
        }
        return 0;
    }

    private void passToAnotherActivity(Bundle bundle) {
        if (mContext == null)
            return;
        if (mContext instanceof MainActivity) {
            MainActivity activity = (MainActivity) mContext;
            activity.passToAnotherActivity(bundle); // this method must be implemented inside `MainActivity`
        }
    }

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public ViewHolder(View itemView) {
            super(itemView);
            // do something...
        }

        @Override
        public void onClick(View v) {
        }
    }
}
0
BNK