Android 如何在onActivityResult方法的自定义listView中添加项?

Android 如何在onActivityResult方法的自定义listView中添加项?,android,listview,Android,Listview,我正在使用android摄像头开发一个简单的视频应用程序。在我的应用程序中,我有一个名为“制作视频”的按钮和一个列表视图,用于显示我的应用程序录制的视频名称。现在,当我点击“制作视频”按钮时,它会打开我的移动摄像机进行录制,但当我完成录制时,摄像机会给我两个选项。“保存”和“丢弃”。现在,通过单击“保存”选项,我想将录制的视频的名称添加到我的列表视图中。我已经在这方面开发了一些代码,效果很好,但我面临的问题是如何在onActivityResult方法的listview中添加录制视频的名称并更新我

我正在使用android摄像头开发一个简单的视频应用程序。在我的应用程序中,我有一个名为“制作视频”的按钮和一个列表视图,用于显示我的应用程序录制的视频名称。现在,当我点击“制作视频”按钮时,它会打开我的移动摄像机进行录制,但当我完成录制时,摄像机会给我两个选项。“保存”和“丢弃”。现在,通过单击“保存”选项,我想将录制的视频的名称添加到我的列表视图中。我已经在这方面开发了一些代码,效果很好,但我面临的问题是如何在onActivityResult方法的listview中添加录制视频的名称并更新我的列表视图。请帮助我,我将非常感谢你

你可以在下面查看我的代码

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;
        }
    }

}
public类MainActivity扩展了ListActivity
{
private ArrayList CameravideList=新建ArrayList();
上下文ctx;
//资源和资源;
int-REQUEST\u-VIDEO\u-CAPTURED=1;
Uri uriVideo=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ctx=getApplicationContext();
按钮makeVideo=(按钮)findViewById(R.id.button1);
setOnClickListener(新的OnClickListener()
{
公共void onClick(视图v)
{
//Intent Intent=新Intent(android.provider.MediaStore.ACTION\u IMAGE\u CAPTURE);
意图=新意图(android.provider.MediaStore.ACTION\u VIDEO\u CAPTURE);
startActivityForResult(意图、请求、视频捕获);
}
});
ListView videoList=getListView();
videoList.setOnItemClickListener(新的OnItemClickListener()
{
@凌驾
public void onItemClick(适配器视图arg0、视图arg1、内部位置、长arg3)
{
Toast.makeText(MainActivity.this,“+”位置,Toast.LENGTH_SHORT.show();
}
});
setListAdapter(新的ImageAndTextAdapter(ctx,R.layout.list_item_icon_text,cameraVideoList));
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据)
{
//TODO自动生成的方法存根
super.onActivityResult(请求代码、结果代码、数据);
if(resultCode==RESULT\u OK)
{
if(requestCode==请求\u视频\u捕获)
{
uriVideo=data.getData();
//Toast.makeText(MainActivity.this,uriVideo.getPath(),
//Toast.LENGTH_LONG).show();
//                
//Toast.makeText(MainActivity.this,uriVideo.toString(),
//Toast.LENGTH_LONG).show();
添加(getFileNameFromUrl(uriVideo.getPath().toString());
}
}
}
公共字符串getFileNameFromUrl(字符串路径)
{
String[]pathArray=path.split(“/”);
返回pathArray[pathArray.length-1];
}
公共类ImageAndTextAdapter扩展了ArrayAdapter
{
私人停车场;
私有数组列表mStrings;
私有int-mViewResourceId;
公共ImageAndTextAdapter(上下文上下文、int-textViewResourceId、ArrayList对象)
{
超级(上下文、textViewResourceId、对象);
mInflater=(LayoutInflater)ctx.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
mStrings=对象;
mViewResourceId=textViewResourceId;
}
公共视图getView(int位置、视图转换视图、视图组父视图)
{
convertView=mInflater.inflate(mViewResourceId,null);
ImageView iv=(ImageView)convertView.findViewById(R.id.icon);
iv.setImageResource(R.drawable.video_图标);
TextView tv=(TextView)convertView.findViewById(R.id.text);
tv.setText(mStrings.get(position));
返回视图;
}
}
}

当您走上正确的道路时,这里需要进行一些更改

  • 当您创建自定义适配器类对象时,该类对象不起作用,因为当您更改列表对象中的数据时,必须由适配器通知列表视图内容
  • 声明
    imageandtextapter适配器作为全局和私有对象

    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
            }
        }
    }
    

    你们走的路是对的,但这里需要一些改变

  • 当您创建自定义适配器类对象时,该类对象不起作用,因为当您更改列表对象中的数据时,必须由适配器通知列表视图内容
  • 声明
    imageandtextapter适配器作为全局和私有对象

    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
            }
        }
    }
    

    第一条路。

    在这条线上。您创建了无法访问的
    ImageAndTextAdapter
    对象

    setListAdapter(new ImageAndTextAdapter(ctx, R.layout.list_item_icon_text, cameraVideoList));
    
    提取变量中的
    imageandtextapter
    对象

    adapter = new ImageAndTextAdapter(ctx, R.layout.list_item_icon_text, cameraVideoList);
      setListAdapter(adapter);
    
    onActivityResult()的
    语句调用
    ImageAndTextAdapter的
    notifyDataSetChanged()

    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(); // 
    }
    

    第一条路。

    在这条线上。您创建了无法访问的
    ImageAndTextAdapter
    对象

    setListAdapter(new ImageAndTextAdapter(ctx, R.layout.list_item_icon_text, cameraVideoList));
    
    提取变量中的
    imageandtextapter
    对象

    adapter = new ImageAndTextAdapter(ctx, R.layout.list_item_icon_text, cameraVideoList);
      setListAdapter(adapter);
    
    onActivityResult()的
    语句调用
    ImageAndTextAdapter的
    notifyDataSetChanged()

    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()).notifyDataSet等