-1

У меня есть множество возможностей, связанных с тем, как получить элемент, который щелкнут в ресайклере, но ни один из них не работает. Код ниже должен работать, но я не понимаю, почему его нет. В андроид-студии метод getPosition() вычеркнут. У меня заканчиваются идеи, есть ли способ, по крайней мере, для того, чтобы нажать название ресайклера?Recycler View Item onClick

ViewHolder

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

    public CardView cv; 
    public TextView name; 
    public TextView description; 
    Context context; 

    public ShoppingListViewHolder(View itemView) { 
     super(itemView); 
     cv = (CardView) itemView.findViewById(R.id.cardView); 
     name = (TextView) itemView.findViewById(R.id.title); 
     description = (TextView) itemView.findViewById(R.id.description); 
     itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d("RecyclerView", "onClick:" + getPosition()); 
      } 
     }); 
    } 


    public void bindView(int position) { 

    } 

    @Override 
    public void onClick(View v) { 
     Log.d("TAG", "onClick " + getPosition() + " " + name); 
    } 

адаптер

public class MainShoppingListViewActivity extends AppCompatActivity { 

    List<Data> list = new ArrayList<>(); 
    RecyclerView recyclerView; 
    ShoppingListViewAdapter adapter; 
    Context context; 
    EditText listName; 
    Firebase ref; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_shoppinglist_view); 

     Firebase.setAndroidContext(this); 
     ref = new Firebase("https://shoppinglistshare.firebaseio.com/"); 

     // Getting the recycler view, using the Recycler View 
     recyclerView = (RecyclerView) findViewById(R.id.shopping_list_recycler_view); 
     // The setLayoutManager which contains the main container where the Recycler View is contained 
     recyclerView.setLayoutManager(new LinearLayoutManager(MainShoppingListViewActivity.this)); 

     // Floating action bar initiated, background color is set and then onClickListener to act when the 
     // button is pressed to which the createDialogBox(); method is called 
     FloatingActionButton addFloat = (FloatingActionButton) findViewById(R.id.fab); 
     addFloat.setBackgroundTintList(ColorStateList.valueOf(Color 
       .parseColor("#3F51B5"))); 
     addFloat.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       // Click action 
       createDialogBox(); 
      } 
     }); 
    } 

    /* 
    * This method is used to add a new item to the Recycler View 
    */ 
    public void addNewShoppingListItem(String val) { 
     ref = new Firebase("https://shoppinglistshare.firebaseio.com/"); 

     adapter = new ShoppingListViewAdapter(list, MainShoppingListViewActivity.this); 
     recyclerView.setAdapter(adapter); 

     adapter.addItem(new Data(val, "Created by: Me")); 
     ref.child("List Name: ").setValue(val); 
    } 

    /* 
    * This method is used to add a new item to the Recycler View 
    */ 
    public void removeShoppingListItem(String val) { 
     adapter = new ShoppingListViewAdapter(list, MainShoppingListViewActivity.this); 
     recyclerView.setAdapter(adapter); 

     adapter.addItem(new Data(val, "Created by: Me")); 
    } 

    /* 
    * This method is called inside the float action bar to create a dialog box when the floating action button is pressed. 
    */ 
    public void createDialogBox() { 

     // Alert Dialog Builder 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 

     // Using Layout Inflater class and assigned to a variable and using getLayout 
     LayoutInflater inflater = this.getLayoutInflater(); 

     // Inflate and set the layout for the dialog 
     // Pass null as the parent view because its going in the dialog layout. 
     // Using the view class to inflate the layout. 
     View rootView = inflater.inflate(R.layout.custom_alert_dialog, null); 
     listName = (EditText) rootView.findViewById(R.id.ShoppinglistName); 

     // Using the AlertDialog Builder created above as "builder" to set the view. 
     builder.setView(rootView) 
       .setPositiveButton("Create", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         String val = listName.getText().toString(); 
         if (!val.isEmpty()) { 
          addNewShoppingListItem(val); 
         } else { 
          Toast.makeText(MainShoppingListViewActivity.this, "Please enter a value", Toast.LENGTH_SHORT).show(); 
         } 
        } 
       }) 
       // Show the dialog 
       .show(); 
    } 
} 

Журналы

FATAL EXCEPTION: main 
Process: familyshopshare.com.familyshopshare, PID: 17889 
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 
    at android.widget.Toast.<init>(Toast.java:102) 
    at android.widget.Toast.makeText(Toast.java:259) 
    at familyshopshare.com.familyshopshare.ShoppingListViewHolder$1.onClick(ShoppingListViewHolder.java:33) 
    at android.view.View.performClick(View.java:5198) 
    at android.view.View$PerformClick.run(View.java:21147) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

FYI: Есть 2 onClicks в конструкторе работах и ​​регистрируют положение элемента, но когда я положил тост там сбой приложения. Тем не менее, я бы предпочел, чтобы клики обрабатывались в методе onClick –

+1

'getPosition' вычеркнуто, потому что оно устарело (нажмите' Ctrl + Q', документация сообщит вам об этом). Вероятно, вы должны использовать 'getAdapterPosition()'. Что касается вашей проблемы - показ реализации ViewHolder недостаточно, похоже, проблема в другом месте, возможно, в адаптере. Как вы создаете держатель вида? – dimsuz

+0

Вероятно, это сбой, потому что ваш 'Context' равен null, я не вижу, где вы его назначаете. Вы можете взять его из 'itemView.getContext()' – dimsuz

ответ

0

Сделано небольшие изменения, вот решение, которое я получил. Я собираюсь изменить onClick на другой метод вместо того, где он есть. Если есть какие-либо предложения о том, как я могу сделать код лучше, пожалуйста, дайте мне знать, какая-нибудь посоветует очень ценятся :)

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

public CardView cv; 
public TextView name; 
public TextView description; 
Context context; 

public ShoppingListViewHolder(View itemView) { 
    super(itemView); 
    cv = (CardView) itemView.findViewById(R.id.cardView); 
    name = (TextView) itemView.findViewById(R.id.title); 
    description = (TextView) itemView.findViewById(R.id.description); 
    itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Data test = new Data(name.getText().toString(), description.getText().toString()); 
      Toast.makeText(v.getContext(), "onClick " + test.getName(), Toast.LENGTH_SHORT).show(); 
      Log.d("RecyclerView", "onClick is this:" + getAdapterPosition()); 
     } 
    }); 
} 

@Override 
public void onClick(View v) { 
    Toast.makeText(context, "onClick " + getAdapterPosition() + " " + name, Toast.LENGTH_SHORT).show(); 
} 

}

0

Есть несколько способов, вы можете сделать это. Лично я хотел бы установить слушатель в onBindViewHolder внутри класса адаптера (там, где у вас есть viewholder):

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

    holder.YourTargetObject.setOnClickListener(new View.onClickListener(){ 
     public void onClick(View view){ 
     //do something 
     } 
    }); 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^