0

私はRecyclerViewに関する1つのクエリを持っています。クリックしたアイテムを取得して同じレイアウトでtextviewに設定し、その後に値をtextviewに設定してアダプタを更新したいとします。RecyclerView itemclicklistnerからクリックしたアイテムを取得してtextviewに設定する方法は?

これは私のrecyclerview.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"> 

    <RelativeLayout 
     android:id="@+id/rl_container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <de.hdodenhof.circleimageview.CircleImageView 
      android:id="@+id/imageView_flag" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_marginTop="10dp" 
      android:layout_marginBottom="10dp" 
      android:layout_marginLeft="10dp" 
      android:src="@drawable/usa" /> 

     <TextView 
      android:id="@+id/textview_currency_info" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="1 USD(United States of America)" 
      android:layout_centerVertical="true" 
      android:textColor="#000" 
      android:layout_toEndOf="@+id/imageView_flag" 
      android:layout_marginStart="14dp" /> 
    </RelativeLayout> 

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

</RelativeLayout>  

これは私のフラグメントのクラスです:

public class ExchangeRatesFragment extends Fragment { 

    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 
    private OnFragmentInteractionListener mListener; 
    private String mParam1; 
    private String mParam2; 

    RetrofitClient retrofitClient; 
    RestInterface service; 

    ArrayList<ExchangeRate> exchangeRatesArraylist; 
    private RecyclerView mRecyclerView; 
    private ExchangeRateAdapter exchangeRateAdapter; 

    TextView textview_currency_info; 
    ImageView imageView_flag; 

    public ExchangeRatesFragment() {} 

    public static ExchangeRatesFragment newInstance(String param1, String param2) { 
     ExchangeRatesFragment fragment = new ExchangeRatesFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_exchange_rates, container, false); 

     exchangeRatesArraylist = new ArrayList<>(); 

     retrofitClient = new RetrofitClient(); 
     service = retrofitClient.getAPIClient(WebServiceUrls.DOMAIN_MAIN); 

     textview_currency_info = (TextView) rootView.findViewById(R.id.textview_currency_info); 
     imageView_flag = (ImageView) rootView.findViewById(R.id.imageView_flag); 

     mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view_exchange_rate); 
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
     mRecyclerView.setLayoutManager(layoutManager); 

     get_exchange_rate("USD"); 
     return rootView; 
    } 

    public void onButtonPressed(Uri uri) { 
     if (mListener != null) { 
      mListener.onFragmentInteraction(uri); 
     } 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof OnFragmentInteractionListener) { 
      mListener = (OnFragmentInteractionListener) context; 
     } else { 
      throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    public interface OnFragmentInteractionListener { 
     void onFragmentInteraction(Uri uri); 
    } 

    public void get_exchange_rate(String from){ 
     service.exchange_rate(from, new Callback<JsonElement>() { 
      @Override 
      public void success(JsonElement jsonElement, Response response) { 
       //this method call if webservice success 
       try { 
        JSONObject jsonObject = new JSONObject(jsonElement.toString()); 
        final JSONArray exchange_rate = jsonObject.getJSONArray("exchange_rate"); 
        for(int i=0; i<exchange_rate.length(); i++){ 
         JSONObject currencyNews = exchange_rate.getJSONObject(i); 
         String short_name = currencyNews.getString("short_name"); 
         String full_name = currencyNews.getString("full_name"); 
         String flag = currencyNews.getString("flag"); 
         String chang_value =currencyNews.getString("chang_value"); 
         ExchangeRate currencyConverter = new ExchangeRate(short_name, full_name, flag, chang_value); 
         exchangeRatesArraylist.add(currencyConverter); 
        } 
        exchangeRateAdapter = new ExchangeRateAdapter(getContext(), exchangeRatesArraylist); 
        mRecyclerView.setAdapter(exchangeRateAdapter); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Toast.makeText(getActivity(),"Please check your internet connection", Toast.LENGTH_LONG).show(); 
      } 
     }); 
    }  

は、これは私のアダプタクラスです:

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

    private ArrayList<ExchangeRate> mArrayList; 
    private Context context; 
    private final LayoutInflater mInflater; 

    public ExchangeRateAdapter(Context context, ArrayList<ExchangeRate> arrayList) { 
     this.mInflater = LayoutInflater.from(context); 
     mArrayList = arrayList; 
     context = context; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.exchange_rate_items, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int i) { 
     holder.relativeLayout.setOnClickListener(clickListener); 

     holder.textView_full_name.setTag(holder); 

     holder.textView_short_name.setText(mArrayList.get(i).getShort_name()); 
     holder.textView_full_name.setText(mArrayList.get(i).getFull_name()); 
     holder.textview_currency_value.setText(mArrayList.get(i).getChang_value()); 
     Picasso.with(context).load("http://uploads/country_flag/"+ mArrayList.get(i).getFlag()).into(holder.imageView_flag); 
    } 

    private View.OnClickListener clickListener = new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      ViewHolder holder = (ViewHolder) view.getTag(); 
      int position = holder.getPosition(); 

      ExchangeRate person = mArrayList.get(position); 
      String businessids = person.getFull_name(); 
      Intent intent = new Intent(context, test.class); 
      intent.putExtra("businessids", businessids); 
      context.startActivity(intent); 
     } 
    }; 

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

    class ViewHolder extends RecyclerView.ViewHolder{ 
     private TextView textView_short_name, textView_full_name, textview_currency_value; 
     private ImageView imageView_flag; 
     RelativeLayout relativeLayout; 

     ViewHolder(View itemView) { 
      super(itemView); 
      textView_short_name = (TextView)itemView.findViewById(R.id.textView_short_name); 
      textView_full_name = (TextView)itemView.findViewById(R.id.textView_full_name); 
      imageView_flag = (ImageView) itemView.findViewById(R.id.imageView_flag); 
      textview_currency_value = (TextView)itemView.findViewById(R.id.textview_currency_value); 
      relativeLayout = (RelativeLayout) itemView.findViewById(R.id.rl); 
     } 
    } 
}  

私はその多くのオプションを試してみましたSO上で公開されましたが、私は解決策はありませんでした。助けてください、どのようにこのクエリを解決するには?私がonclicklistnerをViewHolderに設定したとき、すべてのアイテムclicklistnerに-1の位置値しか得られません。

答えて

0

いくつかのこと:

あなたは相対的なレイアウトになり、クリックされたビューからタグを(取得している間、あなたはクリックリスナーを設定するところがあるとしてあなたは、"holder.textView_full_name.setTag(holder)"にタグを設定している(holder.relativeLayout.setOnClickListener(clickListener);)

。。あなたのクリックリスナーで

これはとにかく必要ありません

、あなたが期待しているものを返す必要があります'getAdapterPosition()'を呼び出す

編集:Codepathにはちょっと日付が書いてありますが、依然として適切なRecyclerViewの素晴らしい概要があります。

+0

'getAdapterPosition()'を設定したときにこのエラーが発生しました: 'java.lang.NullPointerException:仮想メソッド 'java.lang.Stringを呼び出そうとしました' java.lang.String android.content.Context.getPackageName() 'がnullの場合オブジェクト参照 '。私を助けてください。 –

+0

@A.R。、私はそれらの2つが関連しているとは思わない。スタックトレースを含め、コードを投稿してください。 – AChez9

0

あなたが、これは単に、たとえば

implementation 'io.reactivex:rxjava:1.2.1' 
implementation 'io.reactivex:rxandroid:1.2.1' 

の依存関係を使用することができます:あなたはRecyclerView

あなたがこれを記述する必要がアダプタで
adapter.busNoItemClick().doOnNext(this::getBusNum).subscribe(); 

private void getBusNum(String busNo){ 

    ((TextView)findViewById(R.id.txtBusNumberStudent)).setText(busNo); 
} 

をクリックすることができ、この場合と同様に 参考 :

@Override 
public void onBindViewHolder(AdapterBusRouteParent.ViewHolder holder, int position) { 

    holder.busNumber.setOnClickListener(view -> publishSubject.onNext(busRouteParents.get(position))); 

} 

    public Observable<String>busNoItemClick(){ 
    return publishSubject.observeOn(AndroidSchedulers.mainThread()); 
} 

これがあなたを助けてくれることを願っています。

0

一つの方法は、選択された項目を格納

  • 変数、ItemViewにOnClickistener設定
  • 、OnClickListenerで
  • を有するようになり、getAdapterPosition(AS SELECTED_INDEXを設定)と通知アダプタ。
  • onBindViewHolderメソッドで、現在の位置がSELECTED_INDEXと等しいかどうかを確認し、必要な手順を実装します。

int SELECTED_INDEX = 0; 


public void setSelectedItemIndex(int position){ 
    SELECTED_INDEX = position; 
    /*if(adapterCallback!=null) { //If you have a callback interface 
     adapterCallback.onItemClick(position); 
    }*/ 
    notifyDataSetChanged(); 
} 

ホルダークラス:onBindViewHolder方法で

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

    //Item Declarations 

    public MyViewHolder(View itemView) { 
     super(itemView); 
     //View Binding 
     itemView.setOnClickListener(this); 
    } 


    @Override 
    public void onClick(View v){ 
     if(v==itemView){ 
      setSelectedItemIndex(getAdapterPosition()); 
     } 
    } 
} 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    if(position==SELECTED_INDEX){ 
     //Implement your steps 
    } 
    else{ 
     //Default Value 
    } 
} 

はそれが役に立てば幸い!

関連する問題