Ändern ListView hintergrund - seltsames Verhalten
Ich habe ein problem mit dem ändern der hintergrund von einer Ansicht in eine ListView.
, Was ich brauche:
Ändern Sie den hintergrund einer Zeile onClick()
, Was tatsächlich passiert:
Der hintergrund wird geändert (Auswahl) nach dem drücken z.B. der erste Eintrag. Aber nach unten scrollen, der 8. Eintrag ausgewählt wird, zu.
Blättern Sie zurück zum Anfang der ersten nicht mehr aktiviert. Der zweite Eintrag ist jetzt ausgewählt.
Weiter zu scrollen und es geht weiter springen...
, Was ich bin dong in den Code:
Ich habe Kanäle und onClick() ich toggle ein Attribut der Kanal boolean ausgewählt
und dann habe ich den hintergrund ändern.
Ich bin dabei nur onClick() das ist, warum ich verstehe nicht, warum es actuelly passiert auf der anderen Einträge auch.
Eine Sache, die ich bemerkt ist: Es scheint nur die "Zeichnung"-Teil, weil das Element, das ausgewählt "durch es selbst" hat immer noch die ausgewählt Wert auf false
Ich denke, es scheint sich was zu tun mit der Wiederverwendung der Blick in die benutzerdefinierte ListAdapters getView(...)
Code des onClick() in ListActivity:
@Override
protected ViewHolder createHolder(View v) {
//createHolder will be called only as long, as the ListView is not
//filled
TextView title = (TextView) v
.findViewById(R.id.tv_title_channel_list_adapter);
TextView content = (TextView) v
.findViewById(R.id.tv_content_channel_list_adapter);
ImageView icon = (ImageView) v
.findViewById(R.id.icon_channel_list_adapter);
if (title == null || content == null || icon == null) {
Log.e("ERROR on findViewById",
"Couldn't find Title, Content or Icon");
}
ViewHolder mvh = new MyViewHolder(title, content, icon);
//We make the views become clickable
//so, it is not necessary to use the android:clickable attribute in
//XML
v.setOnClickListener(new ChannelListAdapter.OnClickListener(mvh) {
public void onClick(View v, ViewHolder viewHolder) {
//we toggle the enabled state and also switch the the
//background
MyViewHolder mvh = (MyViewHolder) viewHolder;
Channel ch = (Channel) mvh.data;
ch.setSelected(!ch.getSelected()); //toggle
if (ch.getSelected()) {
v.setBackgroundResource(R.drawable.row_blue_selected);
} else {
v.setBackgroundResource(R.drawable.row_blue);
}
//TESTING
Log.d("onClick() Channel", "onClick() Channel: "
+ ch.getTitle() + " selected: " + ch.getSelected());
}
});
return mvh;
}
Code von getView(...):
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder;
//When view is not null, we can reuse it directly, there is no need
//to reinflate it.
//We only inflate a new View when the view supplied by ListView is
//null.
if (view == null) {
view = mInflater.inflate(mViewId, null);
//call own implementation
holder = createHolder(view);
//TEST
//we set the holder as tag
view.setTag(holder);
} else {
//get holder back...much faster than inflate
holder = (ViewHolder) view.getTag();
}
//we must update the object's reference
holder.data = getItem(position);
//<EDIT SOLUTION>
if(getItem(position).get_id() == channelList.get(position).get_id()){
if(getItem(position).getSelected())
{
view.setBackgroundResource(R.drawable.row_blue_selected);
}
else{
view.setBackgroundResource(R.drawable.row_blue);
}
}
//</EDIT SOLUTION>
//call the own implementation
bindHolder(holder);
return view;
}
Ich würde wirklich zu schätzen jede Idee, wie dieses Problem zu lösen! 🙂
Wenn mehr Informationen benötigt werden bitte sagen Sie es mir.
Vielen Dank im Voraus!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Sie mich Ihnen zeigen, die code, die ich benutze für jeden
ListView
und ordnungsgemäß zu kontrollieren das click-Ereignis für die änderung der hintergrund und tut nichts weiterofficeslistitemlayout.xml die Datei wird wie folgt hinzufügen drawable und dementsprechend gestalten Sie den folgenden code in RelativeLayout
Hoffe, es wird helfen 🙂