1

notifyDataSetChanged()リストを更新したり、UI を乱したりせずにカスタム アダプターを呼び出す方法はありますか?

ListViewゲスト オブジェクトのリストをデータセットとして使用して、その背後にカスタム アダプターがあります。ゲストが自分の名前をタップして出席をマークすると、UI でゲストの名前の横にチェックマークが表示されるはずです。これはできますが、を呼び出すとnotifyDataSetChanged()、おそらくリストが「更新」されるため、名前のリストが一番上にプッシュされます。

ただし、を呼び出さないnotifyDataSetChanged()と、更新されたエントリを過ぎてスクロールし、もう一度スクロールすると、目盛りが消えます。これは、私が理解しているように、ListView のビューの「リサイクル」によるものですが、私の仕事が簡単になるわけではありません。

全体をリフレッシュするnotifyDataSetChanged() ことなく、どのように呼び出すのでしょうか?ListView

4

3 に答える 3

1

あなたはこのような位置を保持することができます

// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();

// ...

// restore
mList.setSelectionFromTop(index, top);
于 2013-06-25T08:15:09.090 に答える
1

Guest Class :isPresent にブール値フィールドを 1 つ用意することをお勧めします。ユーザーがリスト項目をタップするたびに、adapter.getItemAtPosition() を使用して選択した項目を取得できます。値 isPresent を true に更新します。そして目盛りを表示させます。

あなたのアダプタクラスで。isPresent 値を確認します。true にマークされている場合は、チェック マークを表示し、それ以外の場合は非表示にします。

これが両方を達成する方法です。ListItem をクリックして目盛りを表示し、リストビューをスクロールして同じ項目に戻った場合、目盛りの表示/非表示はアダプターによって処理されます。

于 2013-06-25T08:22:19.427 に答える
0

「選択したアイテム」を作りたくない場合は実際に可能です ここにコードがあります

public void updateItem(ListView listView, Activity activity) {
        if (mData == null) return;

        DebugLog.i("A", "firstCell: " + listView.getFirstVisiblePosition() + " lastCell: " + listView.getLastVisiblePosition());
        for (int firstCell = listView.getFirstVisiblePosition(); firstCell <= listView.getLastVisiblePosition(); firstCell++) {
            final DataItem item = (DataItem) getItem(firstCell); // in this case I put the this method in the Adapter and call it from Activity where the adapter is global varialbe
            View convertView = listView.getChildAt(firstCell);
            if (convertView != null) {

                final TextView titleTextView = (TextView) convertView.findViewById(R.id.item_title);
                    // here is the most important to do; you have to use Main UI thread to update the view that is why you need activity parameter in the method                
                    mActivity.runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            titleTextView.setText( item + " updated");
                        }
                    });

                }
            }
        }
于 2013-06-25T08:26:12.613 に答える