2017-01-05 14 views
0

Ich mache eine App, in der eine Aktivität eine Recyclerview zeigt. Ich versuche, einen Toast zu bekommen, wenn auf das Element in der Liste geklickt wird. Ich habe die verschiedenen Lösungen auf StackOverflow gesehen und sie helfen nicht.Toast innerhalb onclick recyclerview

BasicsAdapter.java

public class BasicsAdapter extends RecyclerView.Adapter<BasicsAdapter.MyViewHolder> { 

    private List<Basic> basicsList; 

    public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     public TextView title; 

     public MyViewHolder(View view){ 
      super(view); 
      title = (TextView)view.findViewById(R.id.title); 
     } 

     @Override 
     public void onClick(View v) { 

     } 
    } 

    public BasicsAdapter(List<Basic> basicsList){ 
     this.basicsList = basicsList; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.basic_list_row, parent, false); 

     itemView.setClickable(true); 
     itemView.setOnClickListener(true); 
     //itemView.setFocusableInTouchMode(true); //dont enable this 

     return new MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     Basic basic = basicsList.get(position); 
     holder.title.setText(basic.getTitle()); 
    } 

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

basics_list.java

public class basics_list extends AppCompatActivity { 
    private DrawerLayout mDrawerLayout; 
    private List<Basic> basicList = new ArrayList<>(); 
    private RecyclerView recyclerView; 
    private BasicsAdapter mAdapter; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setTitle(R.string.basics_list_name); 
     setContentView(R.layout.activity_basics_list); 

     // Adding Toolbar to Main screen 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     /*ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
     setupViewPager(viewPager); */ 

     // set recycler view 

     recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 

     mAdapter = new BasicsAdapter(basicList); 
     final RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); 
     recyclerView.setLayoutManager(mLayoutManager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.setAdapter(mAdapter); 

     prepareBasicsData(); 

     // Create Navigation drawer and inflate layout 
     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer); 

// Adding menu icon to Toolbar 
     ActionBar supportActionBar = getSupportActionBar(); 
     if (supportActionBar != null) { 
      supportActionBar.setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp); 
      supportActionBar.setDisplayHomeAsUpEnabled(true); 
     } 

// Set behavior of Navigation drawer 
     navigationView.setNavigationItemSelectedListener(
       new NavigationView.OnNavigationItemSelectedListener() { 
        // This method will trigger on item Click of navigation menu 
        @Override 
        public boolean onNavigationItemSelected(MenuItem menuItem) { 
         // Set item in checked state 
         menuItem.setChecked(true); 
         // TODO: handle navigation 
         // Closing drawer on item click 
         mDrawerLayout.closeDrawers(); 
         return true; 
        } 
       }); 


    } 

    private void prepareBasicsData() { 
     Basic basic = new Basic("Introduction to Linux"); 
     basicList.add(basic); 

     basic = new Basic("What is The Terminal"); 
     basicList.add(basic); 

     basic = new Basic("Programmers guide"); 
     basicList.add(basic); 

     mAdapter.notifyDataSetChanged(); 
    } 
} 
+0

Wo ist dein Toast Nachricht in Ihrem Code? –

+0

Ich habe es entfernt. Nichts, was ich versucht habe, hat funktioniert. getApplicationContext oder getBaseContext ist ungültig. Die Verwendung der Aktivität mit "this" funktionierte nicht –

+1

Fügen Sie einfach 'Context' als einen der Konstruktoren Ihrer Klasse hinzu, und wenn Sie die Klasse von Ihrer Aktivität initialisieren, übergeben Sie" this "und Sie haben den Kontext. –

Antwort

4

Verwenden itemView.setOnClickListener(new View.OnClickListener() {}) statt itemView.setOnClickListener(true).

Auf diese Weise wenden Sie eine OnClickListener direkt an. Es würde ähnlich aussehen:

Und Sie könnten es in den Konstruktor setzen.

+1

Eigentlich hat er eine Sichtverweis, und kann Kontext daraus, also warum braucht er eine Aktivität? –

+1

Warum müssen Sie Listener auch in onCreateViewHolder() setzen, tun Sie dies einfach im Konstruktor des View Holders. –

+1

Minor edit für oben "LENGHT.SHORT": stattdessen "Toast.LENGTH_SHORT" verwenden. – AJW

0

Geben Sie einfach Ihre OnClickListener in Ihrem ViewHolder.

public class BasicsAdapter erweitert RecyclerView.Adapter {

private List<Basic> basicsList; 

public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
    public TextView title; 

    public MyViewHolder(View view){ 
     super(view); 
     view.setOnClickListener(new View.OnClickListener() { 
      Toast.makeText(view.getContext(), "Item is clicked", LENGHT.SHORT).show(); 
     }); 
     title = (TextView)view.findViewById(R.id.title); 
    } 

} 

public BasicsAdapter(List<Basic> basicsList){ 
    this.basicsList = basicsList; 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.basic_list_row, parent, false); 

    return new MyViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    Basic basic = basicsList.get(position); 
    holder.title.setText(basic.getTitle()); 
} 

@Override 
public int getItemCount() { 
    return basicsList.size(); 
} 
} 
+0

Minor edit für oben "LENGHT.SHORT": stattdessen "Toast.LENGTH_SHORT" verwenden. – AJW

0

Dies könnte Ihnen helfen:

public class BasicsAdapter extends RecyclerView.Adapter<BasicsAdapter.MyViewHolder> { 

private List<Basic> basicsList; 

public static class MyViewHolder extends RecyclerView.ViewHolder { 
    public TextView title; 
    Context context; 

    public MyViewHolder(View view){ 
     super(view); 
     title = (TextView)view.findViewById(R.id.title); 
    } 
} 

public BasicsAdapter(Context context,List<Basic> basicsList){ 
    this.context=context; 
    this.basicsList = basicsList; 
} 

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

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    Basic basic = basicsList.get(position); 
    holder.title.setText(basic.getTitle()); 
    holder.itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
     Toast.makeText(context,"Show your text here",Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

@Override 
public int getItemCount() { 
    return basicsList.size(); 
} 
} 
Verwandte Themen