Falsche ListView - Selektion

  • Antworten:1
Michael Kunz
  • Forum-Beiträge: 1

27.01.2012, 07:57:25 via Website

Hi Leute,

mich macht meine ListView noch irre . Ich versuchte nun schon einige Zeit folgendes Problem zu lösen. Habe eine Liste in der eine Textview liegt. Sobald ich ein Objekt anklicke, soll sich dessen Background ändern. Das klappt auch schon alles.
Aber Probleme gibt es wenn ich in meiner Liste scrollen muss. Wenn ich z.B. das erste Element selektiere und scrolle dann nach unten, ist auch automatisch das nächste sichtbare Element mit selektiert.

Hier mal mein Code:

1public class MyCustomAdapter extends ArrayAdapter<BasketItem> {
2 private View row;
3 // used to keep selected position in ListView
4 private int selectedPos = -1; // init value for not-selected
5
6 private final Activity context;
7 private final List<BasketItem> list;
8
9
10 public MyCustomAdapter(Activity context, int textViewResourceId,
11 ArrayList<BasketItem> list) {
12
13 super(context, R.layout.condiment_list_items,list);
14 this.context = context;
15 this.list = list;
16
17 }
18
19 class ViewHolder {
20 protected TextView text;
21 protected CheckBox checkbox;
22 //protected ImageView icon;
23 }
24
25 public void setSelectedPosition(int pos){
26 selectedPos = pos;
27 // inform the view of this change
28 notifyDataSetChanged();
29 }
30
31 public int getSelectedPosition(){
32 return selectedPos;
33 }
34
35 @Override
36 public void notifyDataSetChanged() {
37 super.notifyDataSetChanged();
38 }
39
40
41 public View getView(final int position, View convertView, ViewGroup parent) {
42 View view = null;
43 if (convertView == null) {
44 LayoutInflater inflator = context.getLayoutInflater();
45 view = inflator.inflate(R.layout.condiment_list_items, null);
46 final ViewHolder viewHolder = new ViewHolder();
47 //viewHolder.icon = (ImageView)view.findViewById(R.id.iv_loeschen_icon);
48 viewHolder.text = (TextView) view.findViewById(R.id.tx_condiment_list_items);
49 viewHolder.text.setTag(list.get(position));
50 viewHolder.text.setBackgroundDrawable(null);
51 viewHolder.text.setOnClickListener(new OnClickListener() {
52 @Override
53 public void onClick(View v) {
54 BasketItem item = (BasketItem)
55 v.getTag();
56 if(item.getKorb() == 0){
57 item.setKorb(1);
58 v.setBackgroundDrawable(getResources().getDrawable(R.drawable.strike_out));
59 Toast.makeText(mContext, item.getZutat(), Toast.LENGTH_LONG).show();
60 }else{
61 item.setKorb(0);
62 v.setBackgroundDrawable(null);
63 }
64 }
65 });
66
67
68 viewHolder.text.setOnLongClickListener(new OnLongClickListener() {
69 @Override
70 public boolean onLongClick(View v) {
71 ArrayList<BasketItem> list = new ArrayList<BasketItem>();
72 BasketItem item = (BasketItem) viewHolder.text.getTag();
73 list.add(item);
74 Intent intent = new Intent(mContext, ContextMenuHelperCondimentList.class);
75 intent.putParcelableArrayListExtra ("list", (ArrayList<? extends Parcelable>) list);
76 startActivity(intent);
77 return true;
78 }
79 });
80 view.setTag(viewHolder);
81 viewHolder.text.setTag(list.get(position));
82
83 if(list.get(position).getKorb()==1){
84 viewHolder.text.setBackgroundDrawable(getResources().getDrawable(R.drawable.strike_out));
85 }else{
86 viewHolder.text.setBackgroundDrawable(null);
87 }
88
89 } else {
90 view = convertView;
91 }
92 ViewHolder holder = (ViewHolder) view.getTag();
93 holder.text.setText(list.get(position).getZutat());
94 holder.text.setTypeface(mFontNormal);
95 return view;
96 }
97
98 }

Danke und Viele Grüße

Mic

— geändert am 27.01.2012, 07:57:52

Antworten
Felix
  • Forum-Beiträge: 259

27.01.2012, 20:04:47 via Website

Tach!

Du würdest es deinen potentiellen Helfern einfacher machen, und damit deine Chancen auf qualifizierte Antworten erhöhen, wenn du Code posten würdest, mit dem man das Problem nachvollziehen kann. Das was du da zeigst, ist nur ein ListAdapter und Eclipse zeigt mir 29 Fehler, die ich erst einmal beseitigen muss. Darunter sind einige Dinge, die ich mir aus den Fingern saugen müsste (Klasse BasketItem) und solche, die mir zeigen, dass der Code selbst bei dir in der Form nicht gelaufen sein kann (getResources()-Aufruf ohne dass ein Context vorlag oder angegeben wurde, Verwendungen von nicht vorhandenen Variablen (mContext, mFontNormal)). Überflüssige Dinge (Methoden notifyDataSetChanged und setOnLongClickListener, vielleicht auch die ViewHolder-Geschichte) tragen zum Problem nichts bei, benötigen aber (wenn auch nur minimal) Zeit beim Lesen und Verstehen des Codes. Zudem vermisse ich die Activity, die benötigten Ressourcen (vor allem Layout. Grafiken sind oft entbehrlich und Verweise darauf können entfernt werden) und die Erzeugung von Beispieldaten. Ich bitte also um den Code, der auf ein Minimum reduziert wurde, so dass das Problem zu sehen ist, der aber auch lauffähig ist. Nur Kleinigkeiten, die problemlos hinzugefügt werden können (zum Beispiel Activity im Manifest eintragen oder die import-Litanei), können wegbleiben.

Zum eigentlichen Problem kann ich nichts sagen, weil ich es unter den gegebenen Umständen nicht untersuchen kann.


Felix.

Antworten