0

YMMVでも、私は奇妙なジレンマと考えています。ListViewsで再利用されたウィジェットを特定する方法

私はListViewの各行と行を記述するレイアウトファイルを使用しています(これについてはあまりエキゾチックではありません)。

アンドロイド:ID = "@ + 1 ID/CheckBox1を" アンドロイド:ID = "@ + ID/checkBox2" アンドロイド:ID = "@ + ID/checkBox3 Iのような、それぞれに割り当てられたIDを有しています「
アンドロイド:ID =」@ + ID/contactLabel」//

は今、これが意味をなすようには見えないのTextView、これらのIDは一意である必要がありますように、その第二 行のidは何ですか?つまり、「行1」がcheckbox1、checkbox2、checkbox3、およびcontactLabelの指定されたIDを尊重する場合、「行2」のIDは何ですか?

私は興味がありますが、チェックボックスの値をSharedPreferencesオブジェクトに保存する必要があるため、知りたいことがあります。

これを回避する方法についてのヒントはありますか?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 更新

私は解決する必要がある最初の事ListViewのクリックにどのように応答するかです。これは、このすべてに関連する私の現在の難問である:

ListViewコントロールは、それがクリックされています知っていない、または私は私のListActivityに、このイベントハンドラを追加しました私に

を教えてくれません。

@Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     String item = (String) getListAdapter().getItem(position); 
     Toast.makeText(this, item + " selected", Toast.LENGTH_LONG).show(); 
    } 

...しかし、呼び出されていません。表示されている連絡先をクリックしますが、移動しません。まだ喜びが...私は両方の「トースト」の行にブレークポイントを置いていない、と彼らは決して達しなかっ取得...

lv.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, 
     int position, long id) { 
     Toast.makeText(getApplicationContext(), 
      "Click ListItem Number " + position, Toast.LENGTH_LONG) 
      .show(); 
    } 
}); 

は、私はまた、このようにそれを試してみました。

が、私はここで読む:

http://www.vogella.de/articles/AndroidListView/article.html#listsactivity_layout

が...それは、「ケースで、あなたの活動に多くのちょうどリストビューを必要とする、あなたは ListActivityのためにあなた自身のレイアウトを使用することができます。」

...リストビューに加えてヘッダーとフッターを追加するので

「この場合、レイアウトには、android:id 属性が@android:id/listに設定されたListView要素が必要です。

だから、私は、レイアウトにこれを追加しました:

を...しかし、それは何の違い一つの方法または他のを行うものではありません。

答えて

1

ListViewウィジェット内のアイテムのIDは、getView()メソッドで膨張させたときにその親ビューで参照されます。

詳しくは、ListViewアダプターのようなものがあります。

public View getView(int position, View convertView, ViewGroup viewGroup) { 
     if (convertView == null) { 
      convertView = LayoutInflater.from(ctx).inflate(R.layout.list_view_item, null); 
      } 

変換ビューとして新しいビューインスタンスが存在します。 covertView.findViewById(R.id.checkBox1)convertView.findViewById(R.id.checkBox2)などを使用してウィジェットにアクセスできます。

これらのビューのそれぞれは、ListViewの子です。 ListViewgetChildCount()getChildAt()の方法を使用して、それぞれの個別のビューを参照することができます。 しかし、convertViewビューを使用してビューをリサイクルすることをお勧めします。この場合、一度に画面上のビューのみを参照することになります。

はまた、SharedPreferencesに関して、あなたのListViewのすべてのビューはCheckboxTextViewウィジェット内の値を置く実際のオブジェクトになりAdapterサブクラスによって移入されています。このAdapterには、あなたが提供するデータセットがあります。どのような場合でもデータセットから値が設定されたリストアイテムからデータセットを検索するのではなく、データセットの値を直接参照するのはなぜですか?誰かがCheckBoxをクリックするとListViewからデータセットに書き込むことができるので、ListViewのすべてのアイテムへの参照が簡単にできます。


UPDATE:追加されましたダミーのソースコード

OK。 hypothicalリストから始めましょう。 5つの項目をリストに表示する必要があります。わかりやすくするために、それぞれがTextViewCheckboxと仮定します。だから私のコンテナクラスがある:私はこのリストを表示したい私のActivityで今

class Item { 
    String textView; 
    boolean checked; 
} 

、私はクラス変数として、項目のArrayList(あなただけの任意のデータ構造について、使用することができます)を入れました。次に、私はListViewの参照を取得し、アダプタを割り当てます。

class MyActivity extends Activity { 
    ArrayList<Item> listItems; 
    ..... 
    onCreate(Bundle icicle) { 
     ..... 
     ListView listView = (ListView) findViewById(R.id.listView1); // this will be you list view 
     MyAdapter listAdapter = new MyAdapter(); 
     listView.setAdapter(listAdapter); 
     .... 
     // Rest of your Activity 
     .... 
     MyAdapter extends BaseAdapter { 

      int getItemCount() { 
       return listItems.size(); 
      } 

      Item getItem(int position) { 
       return listItems.get(position); 
      } 

      View getView(int position, View convertView, ViewGroup parent) { 
       // Here's the important part 
       Item currentItem = listItems.getItem(position); // Since the array is a class variable, you can do either get or getItem 

       ..... // do the standard individual item inflating .... 

       checkbox = convertView.findViewById(R.id.checkbox); 
       checkbox.OnItemSelectedListener(new OnItemSelectedListener() { // or whatever listener there should be... I didn't check 
        ... // do whatever... 
        currentItem.setChecked(true); 
      } 

あなただけのアイテム・クラスを反復処理し、真であるものを見つけるか、またはあなたは参照がリストビューの個々のメンバーを同定持っているので、あなたがListener以内にあなたが好きなアクションを実行、クリックされたどのようなアイテム取得したい場合にはデータセット(ここではlistItemsのArrayList)。

お詫び申し上げます。何もチェックしなかった。

+0

ありがとうございます。これが利用可能であることを示すサンプルコードがあるとしますか? –

+0

Nah ...問題がある場合は実装を見てうれしいです –

+0

データセットからvalを参照することは、実際にはわかりません(実際にはほとんど手がかりがありません)。連絡先がロードされました。どの連絡先が自分のチェックボックスに関連付けられているかを推測する方法はありますか? –

関連する問題