2011-07-24 19 views
1

小さな買い物リストアプリを作っています。このアプリでは、リストビューのアイテムが購入済みとしてマークされている場合、そのアイテムはラインと交差します。私の問題は、リストが最初に表示されたときに、リスト内で購入済みとマークされているアイテムがあれば、最初のアイテムは買われたとしてマークされているように見えます。それは私の配列アダプタリストビューの最初の項目が正しく表示されない

public class ListAdapter extends BaseAdapter{ 
Context context; 
ArrayList<List_Item> items; 

public ListAdapter(Context context, ArrayList<List_Item> list){ 
    this.context = context; 
    items = list; 
} 

@Override 
public int getCount() { 
    if(items != null) 
     return items.size(); 
    else 
     return 0; 
} 

@Override 
public Object getItem(int index) { 
    return items.get(index); 
} 

@Override 
public long getItemId(int index) { 
    return 0; 
} 

@Override 
public View getView(int pos, View convertView, ViewGroup parent) { 
    View view = convertView; 
    Holder holder = new Holder(); 

    if(convertView == null){ 
     view = LayoutInflater.from(context).inflate(R.layout.complex_list_item, parent, false); 
    } 

    holder.main = (TextView)view.findViewById(R.id.LItextView1); 
    holder.second = (TextView)view.findViewById(R.id.LItextView2); 

    List_Item item = items.get(pos); 

    holder.main.setText(item.name); 
    holder.second.setText(item.qtyToBuy + " " + item.unit + "(s) @ $" + item.price 
               + " per " + item.unit.toLowerCase()); 

    if(item.bought){ 
     holder.main.setBackgroundResource(R.drawable.strikeout); 
    } 


    return view; 
} 

class Holder{ 
    TextView main; 
    TextView second; 
} 

} 

ため

コードは、なぜこの出来事である必要があるとして、最初の項目が表示さを買って何の項目がマークされていない場合

image example of problem

?どうすればこの問題を解決できますか?どんな提案も大歓迎です。

+0

あなたはあなたがクリックしてそれらをクロス購入しました? –

+0

はい、この問題は、アイテムをクリックしているときではなく、ファイルから保存したデータを表示しているときに発生します – user11559

答えて

3

問題は、convertViewがリスト内の各項目に対して再利用されることです。 毎回新しいholderを作成しますが、ビューから参照される値を割り当てています。

だから何が起こるかのいずれかのエントリのために、あなたはこれを呼び出し、背景画像を設定することである -

if(item.bought){ 
    holder.main.setBackgroundResource(R.drawable.strikeout); 
} 

これは単に現在のリスト項目入力の背景画像を設定されていない - それは設定していますTextViewの背景イメージが各アイテムに再利用されています。そしてその背景画像はその時点の参照番号TextViewに設定されています。使用するたびにリセットする必要があります。何かのような -

if(item.bought){ 
    holder.main.setBackgroundResource(R.drawable.strikeout); 
} else { 
    holder.main.setBackgroundResource(R.drawable.normal); 
} 
+0

ありがとうございます:) – user11559

0

また、交差したアイテムが再び保存され、再び表示されますか?右?次にcursorに新しいデータを入力して.notifyDataSetChanged()と呼び出し、リストに新しいデータを再入力した後に.notifyDatasetInvalidated();と呼ぶとうまくいきます。これは、アイテムを交差させるか、リストを表示するたびに実行されます。

+0

クリックすると、実際にデータを保存していましたが、アダプタに新しいデータリストを再表示します。あなたが言ったことを試してみましたが、今問題が残っているのは、リスト項目をクリックしたときだけです。 – user11559

+0

位置が正しくありませんか?それがポジションであれば、これは 'position = position - listview.getFirstVisibleItem();' –

関連する問題