2017-03-13 24 views
1

Ehi、私はインターネット上で見つけたサンプルアプリケーションを改造しています。 (learn2crack) ReclycerViewで1行のIDを取得したいとします。ここにコードがあります。RecyclerView単一アイテムID

メイン

private void initViews(){ 
    RecyclerView recyclerView = (RecyclerView)findViewById(R.id.card_recycler_view); 
    recyclerView.setHasFixedSize(true); 
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); 
    recyclerView.setLayoutManager(layoutManager); 

    ArrayList<AndroidVersion> androidVersions = prepareData(); 
    DataAdapter adapter = new DataAdapter(getApplicationContext(),androidVersions); 
    recyclerView.setAdapter(adapter); 
    recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener(){ 

     @Override 
     public void onTouchEvent(RecyclerView recycler, MotionEvent event) { 
      Toast.makeText(getApplicationContext(),"Here i need the ID of the clicked row",Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public boolean onInterceptTouchEvent(RecyclerView recycler, MotionEvent event) { 
      return true; 
     } 

     @Override 
     public void onRequestDisallowInterceptTouchEvent(boolean a){ 

     } 

    }); 

} 
private ArrayList<AndroidVersion> prepareData(){ 

    ArrayList<AndroidVersion> android_version = new ArrayList<>(); 
    for(int i=0;i<android_version_names.length;i++){ 
     AndroidVersion androidVersion = new AndroidVersion(); 
     androidVersion.setAndroid_version_name(android_version_names[i]); 
     androidVersion.setAndroid_image_url(android_image_urls[i]); 
     android_version.add(androidVersion); 
    } 
    return android_version; 
} 

アダプタ

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> { 
private ArrayList<AndroidVersion> android_versions; 
private Context context; 


public DataAdapter(Context context,ArrayList<AndroidVersion> android_versions) { 
    this.context = context; 
    this.android_versions = android_versions; 

} 

@Override 
public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_layout, viewGroup, false); 
    return new ViewHolder(view); 
} 

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

    viewHolder.tv_android.setText(android_versions.get(i).getAndroid_version_name()); 
    Picasso.with(context).load(android_versions.get(i).getAndroid_image_url()).resize(120, 60).into(viewHolder.img_android); 
    viewHolder.tv_android.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View argi) { 
      //Toast.makeText(context,String.valueOf(i),Toast.LENGTH_SHORT).show(); 

     } 
    }); 

} 

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

public class ViewHolder extends RecyclerView.ViewHolder{ 
    TextView tv_android; 
    ImageView img_android; 
    public ViewHolder(View view) { 
     super(view); 

     tv_android = (TextView)view.findViewById(R.id.tv_android); 
     img_android = (ImageView)view.findViewById(R.id.img_android); 
    } 
} 

あなたが見ることができるように、私はいくつかの変更をしました。私が実装しようとしているbeahviourはこれです: ReclyclerViewボタンの1つをクリックすると、その "id"(同じことを私がアダプタで使用した、これがコメントの背後にあります)を印刷します。 ロードします。すべてのクリック/カテゴリごとに別のリサイクル・ビューがありますので、スイッチケースが必要になりますが、リサイクル・ビューからすべてのIDを取得する必要があります。 「アダプター・バージョン」を使用すると、 "、" 2 "などがありますが、私はメインで作業する必要があるので、InitViews()をもう一度呼び出すか、その修正版を呼び出すことができます int id1 = recycleritem.getid (); 何かアイデア? ありがとうございます。

答えて

1

RecyclerViewのイベントでは使用しないでください自己。

OnClickonBindViewHolderに設定してください。それが発砲されると、タッチされた項目の行でActivityにコールバックします。

はインターフェース

MyAdapter adp=new MyAdapter(new MyAdapter.InterfaceCommands() { 
     @Override 
     public void OnItemPressed(int position) { 
      // do something 
     } 
    }); 

不完全例アダプターとアダプターを作成します。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.VH> { 

    public MyAdapter(InterfaceCommands i) { 
     MyCommands = i; 
    } 

    public interface InterfaceCommands { 

     public void OnItemPressed(int position); 

    } 

    private InterfaceCommands MyCommands; 

    @Override 
    public void onBindViewHolder(final MyAdapter.VH holder, final int position) { 

     // Set Up ViewHolder pattern 
     // .... 

     holder.containerView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       int position = holder.getAdapterPosition(); 

       MyCommands.OnItemPressed(position); 

      } 
     }); 

    } 

} 
+0

サンプルを投稿できますか?またはリンク? ありがとう アクティビティを呼び戻す方法がわかりません –

+0

これを試してみます。ありがとう:) ...私はMainActivity、右で宣言された関数を呼び出すことはできませんか? –

+0

インターフェイスをアダプタに渡すことで行います。 – Kuffs

0

変更に

private ArrayList<AndroidVersion> android_version; 

.... 
.... 

@Override 
public void onClick(int position) { 
    AndroidVersion version = android_version.get(position); 
    // do your task with retrieved AndroidVersion 
} 

new DataAdapter(getApplicationContext(),androidVersions, itemClickListener); 
以下のようなアダプタのコンストラクタをあなたの活動で、このインタフェースを実装し、アダプタ入力の参照を保持ItemClickListener

public interface ItemClickListener { 
    void onClick(int position); 
} 

と呼ばれるインターフェースを作成します。

DataAdapterクラス内

viewHolder.tv_android.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View argi) { 
      //Toast.makeText(context,String.valueOf(i),Toast.LENGTH_SHORT).show(); 
      if(itemClickListener != null) { 
       itemClickListener.onClick(i); 
      } 
     } 
    }); 
+0

ありがとう! –

+0

あなたは大歓迎です!ハッピーコーディング:) –

+0

あなたのコードに続いていくつかの問題が残っています... AndroidVersion version = android.get(position); ^このアンドロイドは、私にエラーを返します。 私は代替ソリューションを試していますが、それでも解決できません。 –

関連する問題