1

ここの階層に少し苦労しています。listView で ID が delete_img のすべての ImageButton ビューへの参照を取得したいと思います。imagebutton は、XML を介して行レイアウト xml に追加されます。

基本的に、すべての行内の特定の要素の可視性を設定できるようにしたいのですが、そのような参照を取得する方法がわかりません。これを行う別の方法はありますか?メソッド deleteShow() は、これまでに取得しようとした私の試みですが、可視性を設定しようとしたときに Null ポインターを取得しているため、明らかに間違っています。

ノートフラグメント

public class NotesFragment extends ListFragment {

private CommentsDataSource datasource;
private View v = null;



public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Cursor theNotes = (Cursor) returnNotes();
    String[] projection = { MySQLiteHelper.COLUMN_ID,
            MySQLiteHelper.COLUMN_COMMENT,
            MySQLiteHelper.COLUMN_COMMENTNAME,
            MySQLiteHelper.COLUMN_FOLDERFK };
    int[] to = new int[] { R.id.id_txt, R.id.content_txt, R.id.title_text };
    @SuppressWarnings("deprecation")
    SimpleCursorAdapter sca = new SimpleCursorAdapter(getActivity(),
            R.layout.notes_list_layout, theNotes, projection, to);
    setListAdapter(sca);

    View v = inflater.inflate(R.layout.notesfragment, container, false);
    deleteShow();

    return v;
}

@Override
public void onListItemClick(ListView parent, View v, int position, long id) {

    Intent intentView = new Intent(getActivity().getApplicationContext(),
            ViewNote.class);
    intentView.putExtra("id", id);

    startActivity(intentView);
}

public Cursor returnNotes() {
    Cursor theNotesCursor = null;
    datasource = new CommentsDataSource(getActivity());
    datasource.open();
    theNotesCursor = datasource.getAllCommentsAsCursor();
    return theNotesCursor;
}

public void deleteShow() {
    ImageButton b = (ImageButton) getActivity().findViewById(R.id.delete_img);
    b.setVisibility(View.INVISIBLE);
}



public void onPause() {
    super.onPause();
    datasource.close();
}

}

4

1 に答える 1

1

ListView何が起こっているのかを理解すれば、対処するための階層はそれほど複雑ではありません。ListViewは、多数の子ビューまたはアイテムを保持するフレームワークと考えてください。これらのアイテムにはそれぞれ、 の行を構成する個々の要素で構成される子ビューがありますListView。リストを変更するには、Item(1) そのアイテムを裏付けるデータを変更して更新するArrayAdapterか、(2)Item内から変更しようとしている個人を見つけてListView、その個々のアイテムの子ビューを操作する必要があります。

notifyDataSetChanged()これを行う最も簡単な方法は、リストをサポートするアダプターのデータを変更しArrayAdapterListView. あなたのアダプターがどのように設定されているかわかりませんので、直接アドバイスするのは難しいですが、一般的な考え方は、変更しItemたいデータを裏打ちするデータを変更し、そのデータを変更してから、 を呼び出しnotifyDataSetChanged()ArrayAdapterListView変更を反映します。

個々のアイテムを直接変更するのは、はるかに複雑です。コードが提案するように、1 つのステップでそれを行うことはできません。id で個々のビューを見つけてから、その可視性を変更します。疑うように、リスト全体で動作しません。個々のリスト要素内ではなく、リスト全体、つまり外側のリスト構造内で、そこにないビューを探しているため、返される可能性が高くなりますfindViewByIdnull

プログラムで必要なことを行うには、(1)ListViewそれ自体への参照を取得する必要があります。(2) を呼び出して、リスト内で最初に表示されたビューを見つけますgetFirstVisiblePosition()。(3) 最初に表示された項目からどれだけ下に、変更したい項目があるかを把握します。(4) そのアイテムを取得します。(5) 修正する

これは、お尻の痛みに終わるだけです。単一のビューを見つけるよりも、リストを裏付けるデータを変更して更新する方がはるかに簡単です。

于 2013-04-10T17:56:27.733 に答える