0

私がやろうとしているのは、リストビューのカスタマー アダプターからメイン アクティビティにある ArrayList にアクセスすることです。

私はクリック可能にするリストビューを持っています。これは、カスタマーアダプター (onclick が存在する場所) 内で行いました。ユーザーがクリックすると、キャプション (テキスト) が入力され、メイン アクティビティの配列リスト (文字列) が更新されます。

このトピックに関する他のいくつかの質問を読みましたが、これを機能させる方法がわかりません。

コード スニペットは基本的な arraylist(string) とリストビュー用のカスタム アダプターに過ぎないため、コード スニペットを投稿する必要はありませんでした。コードが必要な場合は投稿できます。ありがとう!

アダプターコードの一部:

public class PhotoAdapter extends ArrayAdapter<Photo> {

    private final ArrayList<Photo> objects;

    public PhotoAdapter(Context context, int textViewResourceId,
            ArrayList<Photo> objects) {
        super(context, textViewResourceId, objects);
        this.objects = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final Photo i = objects.get(position);
        View v = convertView;

        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.listview_row, null);
                v.setClickable(true);
                v.setFocusable(true);
        }

メインアクティビティのコードは次のとおりです

public ArrayList<Photo> m_photos = new ArrayList<Photo>();
public ArrayList<String> m_photo_captions = new ArrayList<String>();
private PhotoAdapter m_adapter;

this.list1 = (ListView) findViewById(R.id.lstPhotos);
        m_adapter = new PhotoAdapter(this, R.layout.listview_row, m_photos);
        LayoutInflater infalter = getLayoutInflater();
list1.setAdapter(m_adapter);

if (Intent.ACTION_SEND_MULTIPLE.equals(action)
                && intentGallery.hasExtra(Intent.EXTRA_STREAM)) {
            ArrayList<Parcelable> list = intentGallery
                    .getParcelableArrayListExtra(Intent.EXTRA_STREAM);
            for (Parcelable p : list) {
                Uri uri = (Uri) p;
                imagePath = getPath(uri);
                m_photos.add(new Photo(imagePath, ""));
                m_photo_locations.add(imagePath);
                m_photo_captions.add("");
                m_adapter.notifyDataSetChanged();
            }
        }

onclick リスナー

    list1.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View v,
                int position, long id) {
            // Do whatever you want with m_photo_captions here
            Log.v("listview", "listview item clicked");
            appErrorAlert("test", "test");
        }
    });
4

2 に答える 2

3

アクセスする ArrayList をグローバル インスタンス変数として定義すると、カスタム アダプタ内からアクセスできます。

また、問題のコード スニペットを提供していただけると助かります。

于 2012-08-28T02:13:17.147 に答える
1

コードを投稿したので、Mohamed A. Karim とは異なるアプローチをお勧めします。


アクティビティのメンバーにアクセスOnClickListenerしますが、行全体に単純なものを設定しようとしています。Adapter必要なリストに既にアクセスできる を設定しOnItemClickListenerListViewみませんか?

list1.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        // Do whatever you want with m_photo_captions here
    }
});

次に、 touch イベントが に到達する前にそれをインターセプトするものをすべて削除しますListViewgetView()次のように、少し小さくて高速にすることもできます。

public class PhotoAdapter extends ArrayAdapter<Photo> {
    LayoutInflater mInflater;

    public PhotoAdapter(Context context, int textViewResourceId,
            ArrayList<Photo> objects) {
        super(context, textViewResourceId, objects);
        mInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final Photo i = get(position);
        View v = convertView;

        if (v == null) {
            v = mInflater.inflate(R.layout.listview_row, null);
            // Initialize your ViewHolder here!
        }

        // Update your TextViews, ImageViews, etc here
        ...
    }
}

それが役立つことを願っています!

于 2012-08-28T03:53:47.010 に答える