2

Androidカメラを使用して動画用のシンプルなアプリを開発しています。私のアプリには、「Make Video」という名前のボタンと、アプリで記録されたビデオ名を表示するためのリスト ビューがあります。[ビデオを作成] ボタンをクリックすると、録画用にモバイル カメラが開きますが、録画が完了すると、カメラに 2 つのオプションが表示されます。「保存」と「破棄」。「保存」オプションをクリックして、録画したビデオの名前をリスト ビューに追加します。この点でいくつかのコードを開発しましたが、正常に動作しますが、 onActivityResult メソッドのリストビューに録画したビデオの名前を追加してリストビューを更新する方法の問題に直面しています。私を助けてください、私はあなたにとても感謝しています.

以下のコードを確認できます。

public class MainActivity extends ListActivity 
{

    private ArrayList<String> cameraVideoList = new ArrayList<String>();

    Context ctx;
//  Resources res;

     int REQUEST_VIDEO_CAPTURED =1;
     Uri uriVideo = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ctx = getApplicationContext();


        Button makeVideo = (Button) findViewById(R.id.button1);
        makeVideo.setOnClickListener(new OnClickListener() 
        {
            public void onClick(View v) 
            {
                //Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                Intent intent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
                startActivityForResult(intent, REQUEST_VIDEO_CAPTURED);

            }
        });

        ListView videoList = getListView();

        videoList.setOnItemClickListener(new OnItemClickListener()
        {
           @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3) 
           {
                Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show();

            }
        });

        setListAdapter(new ImageAndTextAdapter(ctx, R.layout.list_item_icon_text, cameraVideoList));


    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK)
        {
            if (requestCode == REQUEST_VIDEO_CAPTURED) 
            {
                uriVideo = data.getData();
//                Toast.makeText(MainActivity.this, uriVideo.getPath(),
//                        Toast.LENGTH_LONG).show();
//                
//                Toast.makeText(MainActivity.this, uriVideo.toString(),
//                        Toast.LENGTH_LONG).show();

                cameraVideoList.add(getFileNameFromUrl(uriVideo.getPath().toString()));

            }
        }
    }

    public String getFileNameFromUrl(String path) 
    {
        String[] pathArray = path.split("/");
        return pathArray[pathArray.length - 1];
    }

    public class ImageAndTextAdapter extends ArrayAdapter<String>
    {
        private LayoutInflater mInflater;
        private ArrayList<String> mStrings;
        private int mViewResourceId;

        public ImageAndTextAdapter(Context context, int textViewResourceId,ArrayList<String> objects) 
        {
            super(context, textViewResourceId, objects);
            mInflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            mStrings = objects;
            mViewResourceId = textViewResourceId;
        }

        public View getView(int position, View convertView, ViewGroup parent) 
        {
            convertView = mInflater.inflate(mViewResourceId, null);

            ImageView iv = (ImageView)convertView.findViewById(R.id.icon);
            iv.setImageResource(R.drawable.video_icon);

            TextView tv = (TextView)convertView.findViewById(R.id.text);
            tv.setText(mStrings.get(position));

            return convertView;
        }
    }

}
4

2 に答える 2

2

あなたは正しい道を進んでいますが、ここではいくつかの変更が必要です。

  1. カスタム アダプター クラス オブジェクトを作成すると、リスト オブジェクトのデータを変更するときにリスト ビュー コンテンツのアダプターによって通知する必要があるため、機能しません。

ImageAndTextAdapter adapter;グローバルおよびプライベート オブジェクトとして宣言する

onCreate(){

    adapter = new ImageAndTextAdapter(ctx, R.layout.list_item_icon_text, cameraVideoList);
    videoList.setAdapter(adapter);

}

リストオブジェクトに新しいレコードを追加した後、 onActivityResult で、アダプタークラスの notifyDataSetChange() を呼び出すだけです

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK)
    {
        if (requestCode == REQUEST_VIDEO_CAPTURED) 
        {
            uriVideo = data.getData();

            cameraVideoList.add(getFileNameFromUrl(uriVideo.getPath().toString()));

            adapter.notifyDatasetChanged(); // here
        }
    }
}
于 2013-02-16T07:26:32.447 に答える
2

最初の方法。

この行で。ImageAndTextAdapter到達不能なオブジェクトを作成しました。

setListAdapter(new ImageAndTextAdapter(ctx, R.layout.list_item_icon_text, cameraVideoList));

ImageAndTextAdapterオブジェクトを変数に抽出する

adapter = new ImageAndTextAdapter(ctx, R.layout.list_item_icon_text, cameraVideoList);
  setListAdapter(adapter);

このonActivityResult()呼びかけnotifyDataSetChanged()の声明からImageAndTextAdapter

if (requestCode == REQUEST_VIDEO_CAPTURED) 
{
     uriVideo = data.getData();
//   Toast.makeText(MainActivity.this, uriVideo.getPath(),
//    Toast.LENGTH_LONG).show();
//                
//   Toast.makeText(MainActivity.this, uriVideo.toString(),
//   Toast.LENGTH_LONG).show();

     cameraVideoList.add(getFileNameFromUrl(uriVideo.getPath().toString()));

     adapter.notifyDataSetChanged();
}

第二の方法。あなたは呼び出すことができます((ImageAndTextAdapter) getAdapter()).notifyDataSetChanged()

あなたのonActivityResult()実装では、このようにすることができます

if (requestCode == REQUEST_VIDEO_CAPTURED) 
{
     uriVideo = data.getData();

     cameraVideoList.add(getFileNameFromUrl(uriVideo.getPath().toString()));

     ((ImageAndTextAdapter) getAdapter()).notifyDataSetChanged(); // 
}
于 2013-02-16T07:26:52.537 に答える