活動

8

にRecyclerView CardViewクリックさ項目データを渡す私はここでの活動にクリックcardviewデータを渡すことについての質問、および完全な物語があります。活動

  1. を私は中2 TextViewsを含む「詳細」と呼ばれる活動を、持っていますそのレイアウト、タイトル&説明。

  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); 
} 

編集:I私はそれを作った、私はボタンを押してフラグメントを開き、データをアダプターに渡しましたが、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); 

    } 

答えて

1

あなたがそうあなたがタイトルを渡すことができ、この

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

を行い、あなたのDetailActivityであなたのonItemClick()

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

とするときOnCreate関数でこれを行う試みることとDetailActivityへの説明

+0

あなたの方法を獲得した、編集をご確認くださいその文字列を取得する際の問題は、アダプターからのみ可能ですが、tab_1.javaからは不可能です。 – Jaeger

+0

@AboHani RecyclerViewはonItemClickListenerとonItemLongClickListenerを提供しません。アダプタでのみ設定する必要があります。このようなアダプタでインターフェイスを作成することもできます。OnItemClickLitener { void onItemClick(View view、int position); void onItemLongClick(ビュービュー、int位置); } 'をクリックし、各アイテムがクリックされたときや長くクリックされたときに呼び出すので、今すぐtab_1.javaにリスナーを設定できます。 – chichiangho

+0

ええ、最初はこのように追加しましたが、データを渡すことができませんでした。とにかく、アダプタのcardviewを参照し、intent.putExtrasを使用してデータを渡してデータを渡しました。 btw、あなたがsearchviewの知識を持っているなら、私のプロフィールで私の質問をチェックしてください。 – Jaeger

0

IMOでは、AdapterRecyclerViewの内部にsetOnClickListenerを実装します。私の次のサンプルコードを参照し、そのロジックをコードに適用することができます。それが役に立てば幸い!

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) { 
     } 
    } 
} 
1

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

2

methodsを含むアダプタ内部Interfaceを作成します。そしてあなたのアダプターを実装している間、それらのメソッドはあなたのアクティビティーに実装され、必要なアクションを実行することができます。

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; 
    } 
} 
1

すべての上記の方法は働いたが、ちょっと長いので、この1は私の仕事:

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); 
+0

誰かが理解できなかった場合、私の問題はクリックされたアイテムのタイトルを渡すことにあったので、これは私のために働いてくれました。 。 – Jaeger

+1

getExtras()で使用する "結果"は何ですか?getString()? – AJW

+0

"Intent result = getIntent()"で使用されていますか? – AJW