2017-04-17 2 views
0

Ich habe eine einfache RecycleView-Komponente erstellt. Erstellen Sie anschließend eine neue Aktivität für diese Komponente. In einer Reihe habe ich eine TextView und Button. Was ich tun möchte, ist etwas in einem Objekt zu ändern, das genau in eine Zeile gesetzt wurde.Schaltfläche reagiert nicht beim Klicken in RecycleView

Zuerst habe ich initialisiert die Button:

public class RecycleViewAllWashesActivity extends Activity { 
    private Button isFavorite; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.row_recycleview); 
     isFavorite = (Button) findViewById(R.id.addToFav); 
     isFavorite.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.w("myApp", String.valueOf(v.getId())); 
       int id = v.getId(); 
      } 
     }); 
    } 
} 

Der Adapter von RecycleView wie folgt aussieht:

@Override 
    public MyAdapter.WashLocationViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     Context context = parent.getContext(); 
     LayoutInflater inflater = LayoutInflater.from(context); 

     // Inflate the custom layout 
     View view = inflater.inflate(R.layout.row_recycleview, parent, false); 

     // Return a new holder instance 
     WashLocationViewHolder viewHolder = new WashLocationViewHolder(view); 
     return viewHolder; 
    } 

    // Involves populating data into the item through holder 
    @Override 
    public void onBindViewHolder(MyAdapter.WashLocationViewHolder viewHolder, int position) { 
     // Get the data model based on position 
     WashLocation w = washLocations.get(position); 
     String info = w.getWashName(); 

     // Set item views based on your views and data model 
     TextView textView = viewHolder.info; 
     textView.setText(info); 

     Integer fav = w.getFav(); 
     Boolean favorite = fav == 1 ? true : false; 
     Button addToFav = viewHolder.favorite; 
     addToFav.setText(favorite == true ? "Usuń z ulubionych" : "Dodaj do ulubionych"); 
    } 

Fragen:

  1. Wie das Objekt erhalten, die in gesetzt wurde eine Reihe?
  2. Wenn ich die Button (Code oben) angeklickt hat, reagiert es nicht, auch der dort eingestellte Breakpoint reagiert nicht? -> das Ding in der Konsole, die ich sehen, während auf die Schaltfläche klicken ist: 04-17 13:11:00.137 7671-7671/com.example.micha.locationtest D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN

=========================== === Update:

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

    private List<WashLocation> washLocations; 
    private OnItemClickListener onItemClickListener; 
    private LayoutInflater layoutInflater; 

    public MyAdapter(List<WashLocation> washLocations, Context context) { 
     layoutInflater = LayoutInflater.from(context); 
     this.washLocations = washLocations; 
    } 

    @Override 
    public MyAdapter.ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = layoutInflater.inflate(R.layout.row_recycleview, parent, false); 
     return new ItemHolder(itemView, this); 
    } 

    @Override 
    public void onBindViewHolder(MyAdapter.ItemHolder holder, int position) { 
     // Get the data model based on position 
     WashLocation w = washLocations.get(position); 
     String info = w.getWashName(); 

     // Set item views based on your views and data model 
     TextView textView = holder.info; 
     textView.setText(info); 

     Integer fav = w.getFav(); 
     Boolean favorite = fav == 1 ? true : false; 
     Button addToFav = holder.favorite; 
     addToFav.setText(favorite == true ? "Usuń z ulubionych" : "Dodaj do ulubionych"); 
    } 

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

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

    public OnItemClickListener getOnItemClickListener() { 
     return onItemClickListener; 
    } 

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

    /* public void add(int location, String iName){ 
     itemsName.add(location, iName); 
     notifyItemInserted(location); 
    } 

    public void remove(int location){ 
     if(location >= itemsName.size()) 
      return; 

     itemsName.remove(location); 
     notifyItemRemoved(location); 
    }*/ 

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

     private MyAdapter parent; 
     TextView textItemName; 
     public TextView info; 
     public Button favorite; 

     public ItemHolder(View itemView, MyAdapter parent) { 
      super(itemView); 
      itemView.setOnClickListener(this); 
      this.parent = parent; 
      info = (TextView) itemView.findViewById(R.id.textView); 
      favorite = (Button) itemView.findViewById(R.id.addToFav); 
     } 

     public void setItemName(CharSequence name) { 
      textItemName.setText(name); 
     } 

     public CharSequence getItemName() { 
      return textItemName.getText(); 
     } 

     @Override 
     public void onClick(View v) { 
      final OnItemClickListener listener = parent.getOnItemClickListener(); 
      if (listener != null) { 
       listener.onItemClick(this, getPosition()); 
      } 
     } 
    } 
} 

Die Aktivitätsklasse:

final DataBaseHelper dataBaseHelper = new DataBaseHelper(getApplicationContext()); 
washLocations = dataBaseHelper.getWashLocation(); 

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 
mAdapter = new MyAdapter(washLocations, this); 
mAdapter.setOnItemClickListener(this); 
mRecyclerView.setAdapter(mAdapter); 
mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 



@Override 
    public void onItemClick(MyAdapter.ItemHolder item, int position) { 
     Log.d("myApp", "fdsgfds"); 
    } 
+0

Theres kein Fehlercode. Ich habe dir in der zweiten Frage – bielas

+1

gesagt, schau dir dieses einfache Beispiel von recyclerView an. Ich vermute du hast die Umsetzung missverstanden ... http: //android-er.blogspot.de/2015/07/simple-recyclerview-example.html – Opiatefuchs

+0

Ich habe dich nicht richtig verstanden .. kannst du mir sagen, was wann passieren soll Du klickst auf isFavorite button? – Raghavendra

Antwort

0

In Recycle überprüfen Sie eine OnClickListener für die Ansichten explizit festlegen. Es hat keine Standardmethoden, um Klickereignisse wie die Listenansicht zu behandeln.

Sie müssen in einen Onclick Zuhörer für Ihre Taste, um Ihre WashLocationViewHolder

Sie ein Click-Ereignis dort erhalten. Vom Ansichtshalter können Sie das Ereignis über eine Schnittstelle an Ihr Fragment oder Ihre Aktivität zurücksenden.

Wenn Sie weitere Hilfe diesbezüglich benötigen, erwähnen Sie es in den Kommentaren. Ich werde Ihnen einige Beispiele zur Verfügung stellen.

Wie bekomme ich das Objekt, das in eine Zeile gesetzt wurde?

Um dies zu tun Sie das Objekt als einen Tag mit der setTag(Object) Methode im Layout oder die Taste, für die Sie einen Klick Zuhörer Bereitstellung festlegen. Dann können Sie das Objekt mit der Methode getTag() aus der Ansicht abrufen.

Hoffe, das hilft.

Verwandte Themen