Recyclerview, je ne peux pas obtenir de point de vue avec getChildAt(position). Nulle référence d'objet
Je suis à l'aide d'un recyclerView à l'intérieur de ma navigation tiroir et je suis en utilisant cette bibliothèque Twoway-vue pour obtenir de cliquer et de soutien à la sélection.
Il fonctionne parfaitement et je peux changer la couleur du texte et les icônes sans problèmes à l'intérieur OnClick méthode pour chaque position:
itemClickSupport.setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View view, int position, long id) {
TypedValue typedValue = new TypedValue();
MainActivity.this.getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true);
final int color = typedValue.data;
//TODO Icon and text colors
for (int i = 0; i < drawerTitles.length; i++){
if (i == position){
ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon);
TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle);
imageViewDrawerIcon.setColorFilter(color);
if(Build.VERSION.SDK_INT > 15){
imageViewDrawerIcon.setImageAlpha(255);
}else{
imageViewDrawerIcon.setAlpha(255);
}
textViewDrawerTitle.setTextColor(color);
RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem);
relativeLayoutDrawerItem.setFocusableInTouchMode(true);
}else{
ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon);
TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle);
imageViewDrawerIcon.setColorFilter(getResources().getColor(R.color.md_text));
if(Build.VERSION.SDK_INT > 15){
imageViewDrawerIcon.setImageAlpha(138);
}else{
imageViewDrawerIcon.setAlpha(138);
}
textViewDrawerTitle.setTextColor(getResources().getColor(R.color.md_text));
RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem);
relativeLayoutDrawerItem.setFocusableInTouchMode(false);
}
}
//TODO Fragments (closedrawers before setfragment)
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after some time
}
}, 250);
mDrawerLayout.closeDrawers();
}
});
Le problème est que je veux accéder au premier élément, comme dans la méthode, mais avant elle (pour définir le premier élément sélectionné, avec des couleurs différentes, etc).
Mais j'ai un crash (référence nulle) lorsque j'essaie d'obtenir le premier point à l'extérieur OnClick méthode:
ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(0).findViewById(R.id.imageViewDrawerIcon);
Tous les code:
//Setup RecyclerView inside drawer
recyclerViewDrawer = (RecyclerView) findViewById(R.id.recyclerViewDrawer);
recyclerViewDrawer.setHasFixedSize(true);
recyclerViewDrawer.setLayoutManager(new LinearLayoutManager(MainActivity.this));
ArrayList<DrawerItem> drawerItems = new ArrayList<>();
final String[] drawerTitles = getResources().getStringArray(R.array.drawer);
final TypedArray drawerIcons = getResources().obtainTypedArray(R.array.drawerIcons);
for (int i = 0; i < drawerTitles.length; i++) {
drawerItems.add(new DrawerItem(drawerTitles[i], drawerIcons.getDrawable(i)));
}
drawerIcons.recycle();
adapterDrawer = new DrawerAdapter(drawerItems);
recyclerViewDrawer.setAdapter(adapterDrawer);
//Here is the problem
ImageView imageViewDrawerIcon2 = (ImageView) recyclerViewDrawer.getChildAt(0).findViewById(R.id.imageViewDrawerIcon);
//RecyclerView item listener.
ItemClickSupport itemClickSupport = ItemClickSupport.addTo(recyclerViewDrawer);
itemClickSupport.setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View view, int position, long id) {
TypedValue typedValue = new TypedValue();
MainActivity.this.getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true);
final int color = typedValue.data;
//TODO Icon and text colors
for (int i = 0; i < drawerTitles.length; i++){
if (i == position){
ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon);
TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle);
imageViewDrawerIcon.setColorFilter(color);
if(Build.VERSION.SDK_INT > 15){
imageViewDrawerIcon.setImageAlpha(255);
}else{
imageViewDrawerIcon.setAlpha(255);
}
textViewDrawerTitle.setTextColor(color);
RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem);
relativeLayoutDrawerItem.setFocusableInTouchMode(true);
}else{
ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon);
TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle);
imageViewDrawerIcon.setColorFilter(getResources().getColor(R.color.md_text));
if(Build.VERSION.SDK_INT > 15){
imageViewDrawerIcon.setImageAlpha(138);
}else{
imageViewDrawerIcon.setAlpha(138);
}
textViewDrawerTitle.setTextColor(getResources().getColor(R.color.md_text));
RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem);
relativeLayoutDrawerItem.setFocusableInTouchMode(false);
}
}
//TODO Fragments (closedrawers before setfragment)
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after some time
}
}, 250);
mDrawerLayout.closeDrawers();
}
});
OriginalL'auteur JavierSegoviaCordoba | 2015-02-03
Vous devez vous connecter pour publier un commentaire.
Dans mon cas, c'est un travail comme un charme
Il donne l'avertissement "Avant d'Android 4.1, la méthode int android.de soutien.v7.widget de.ListViewCompat.lookForSelectablePosition(int, boolean) aurait incorrectement substituée package-méthode privée dans android.widget de.ListView"
il retourne
null
Il semble qu'il ne fonctionne que si l'élément est visible tout de suite, inutile. Même si je l'appelle
layoutManager.scrollToPosition(position)
avant d'appelerfindViewByPosition(position)
cela ne fonctionne toujours pasOriginalL'auteur Dmitriy Melekhov
J'ai résolu enfin avec ce (source):
En passant, si quelqu'un a une meilleure solution, je voudrais savoir s'il.
getChildViiew(0)
nul avec cette approche. Personnellement, je ne peux pas le reproduire. À l'aide desetAdapter
déclenche l'enfant de voir l'inflation donc, idéalement, il y aurait une fonction de callback qui est appelée lorsque la vue enfant est gonflé et ajouté à la RecyclerViewOriginalL'auteur JavierSegoviaCordoba
Je voudrais utiliser findViewHolderForAdapterPosition() ou findViewByPosition() au lieu de trouver la racine de la vue à l'index. La façon de vous assurer que le chargement des données est à vous, cependant.
OriginalL'auteur AllDayAmazing
Cela a fonctionné pour moi.
Nice, cela a fonctionné parfaitement pour l'obtention de l'affiche des enfants et des viewholders à l'aide de
getChildAt()
etgetChildViewHolder()
De noter, c'est que vous ne pouvez pas manipuler de nombreux éléments de l'INTERFACE utilisateur avec cela, puisque vous travaillez à partir d'un autre thread. Vous devrez mettre en place la communication inter-thread.
OriginalL'auteur Herman