Android 向列表中动态添加条目
我正在使用intent调用本机相机来捕获图像,在“活动结果”中,我试图为捕获的图像提供标题并将其添加到列表中,但没有成功,我在将项目添加到列表中时出错。从设备上,应用力关闭,我无法找出错误。有人能给我建议一下将元素添加到列表中的正确方法吗。应该将其添加到适配器还是基础ArrayList?请帮我做这个 我的代码如下:Android 向列表中动态添加条目,android,Android,我正在使用intent调用本机相机来捕获图像,在“活动结果”中,我试图为捕获的图像提供标题并将其添加到列表中,但没有成功,我在将项目添加到列表中时出错。从设备上,应用力关闭,我无法找出错误。有人能给我建议一下将元素添加到列表中的正确方法吗。应该将其添加到适配器还是基础ArrayList?请帮我做这个 我的代码如下: public class AttachmentsActivity extends ListActivity { private AttachmentListAdapter m_ad
public class AttachmentsActivity extends ListActivity {
private AttachmentListAdapter m_adapter;
private ArrayList<MediaData> m_orders = null;
StringBuffer nameBuffer;
private String captureDateTime;
private Uri uri;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
m_orders = new ArrayList<MediaData>();
Enumeration<MediaData> enumeration = DashboardManager.getInstance()
.getAttachmentList().elements();
while (enumeration.hasMoreElements()) {
m_orders.add((MediaData) enumeration.nextElement());
}
this.m_adapter = new AttachmentListAdapter(this,
android.R.layout.simple_list_item_1, m_orders);
setListAdapter(this.m_adapter);
this.m_adapter.notifyDataSetChanged();
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.removeGroup(1);
if (DashboardManager.getInstance().isEnableCamera()) {
menu.add(1, 1, Menu.NONE, "Camera");
}
if (DashboardManager.getInstance().isEnableAudio()) {
menu.add(1, 2, Menu.NONE, "Audio");
}
return true;
}
private class AttachmentListAdapter extends ArrayAdapter<MediaData> {
private ArrayList<MediaData> items;
private LayoutInflater mInflater;
private Bitmap high;
private Bitmap medium;
private Bitmap low;
private LinearLayout linearLayout;
private TextView[] textViews;
private Context context;
private Vector tableHeaders;
private int width;
private StringBuffer firstLine;
public AttachmentListAdapter(Context context, int textViewResourceId,
ArrayList<MediaData> items) {
super(context, textViewResourceId, items);
this.context = context;
System.out.println("Inside NotificationListAdapter");
System.out.println(items);
this.items = items;
firstLine = new StringBuffer();
mInflater = LayoutInflater.from(context);
Display display = getWindowManager().getDefaultDisplay();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MediaData mediaData = items.get(position);
ViewHolder holder = null;
if (mediaData != null) {
if (convertView == null) {
holder = new ViewHolder();
// holder.content = (TextView) mInflater.inflate(
// R.layout.column, null);
holder.content = new TextView(context);
holder.content.setGravity(Gravity.CENTER_VERTICAL);
holder.content.setHeight(25);
convertView = mInflater.inflate(R.layout.table_row, null);
linearLayout = (LinearLayout) convertView
.findViewById(R.id.linearLayout);
linearLayout.addView(holder.content);
}
firstLine.delete(0, firstLine.length());
firstLine.append(mediaData.getType()).append(" ")
.append(mediaData.toString());
holder.content.setText(firstLine.toString());
}
return linearLayout;
}
}
static class ViewHolder {
TextView content;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case 1:
nameBuffer = new StringBuffer();
if (DashboardManager.getInstance().getWaterMarkingText().length() > 0) {
nameBuffer.append(
DashboardManager.getInstance().getWaterMarkingText())
.append("_");
}
captureDateTime = Calander.getSubmitDateTime(new Date());
nameBuffer
.append(captureDateTime)
.append("_")
.append(MobileBaseService.getInstance()
.getApplicationUser().getUserId()).append(".jpg");
String dirString = "/sdcard/pravaa/";
File dir = new File(dirString);
if(!dir.exists()) dir.mkdir();
File attachment=new File(dirString+nameBuffer.toString());
uri=Uri.fromFile(attachment);
System.out.println("URI:" + attachment.toURI());
int resultCode = 1337;
startActivityForResult(AttachmentUtility.getCameraIntent(uri),
resultCode);
}
return true;
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
switch (requestCode) {
case 1337:
// TODO Auto-generated method stub String
String dirString="/sdcard/pravaa/"; //Toast
File attachment=new File(dirString+nameBuffer.toString());
if(attachment.exists()){
try {
FileInputStream fis;
fis = new FileInputStream(attachment);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Bitmap bi = BitmapFactory.decodeStream(fis);
bi.compress(CompressFormat.JPEG, 100, baos);
byte[]attData = baos.toByteArray();
fis.close();
if (attData.length>0) {
MediaData mediaData = new MediaData();
mediaData.setAttachmentUri(uri);
mediaData.setType(ApplicationStore.MEDIA_TYPE_IMAGE);
mediaData.setData(attData);
mediaData.setNewAttachment(true);
mediaData.setNote("");
mediaData.setTransactionId(MobileBaseService.getInstance().getNextTransactionId());
mediaData.setCaptureDataTime(captureDateTime);
mediaData.setCaption(mediaData.getCaptureDataTime() + "_" + MobileBaseService.getInstance().getApplicationUser().getUserId());
mediaData.setNumber(nameBuffer.toString());
if (DashboardManager.getInstance().isEnableGps() && ApplicationManager.getInstance().isGpsEnabled()) {
mediaData.setGpsEnabled(true);
Location location= ApplicationManager.getInstance().getLocation();
if (location != null) {
mediaData.getGpsData().setLattitude(location.getLatitude());
mediaData.getGpsData().setLongitude(location.getLongitude());
mediaData.getGpsData().setAltidude(location.getAltitude());
mediaData.getGpsData().setAccuracy("Y");
mediaData.getGpsData().setDateTime(Calander.getSubmitDateTime(new Date()));
} else {
// ApplicationManager.getInstance().Log(Level.TRACE, "Could not obtain GPS for Attachment " + mediaData.getNumber());
mediaData.getGpsData().setLattitude(0);
mediaData.getGpsData().setLongitude(0);
mediaData.getGpsData().setAltidude(0);
mediaData.getGpsData().setAccuracy("N");
mediaData.getGpsData().setDateTime("");
}
} else {
mediaData.getGpsData().setLattitude(0);
mediaData.getGpsData().setLongitude(0);
mediaData.getGpsData().setAltidude(0);
mediaData.getGpsData().setAccuracy("N");
mediaData.getGpsData().setDateTime(Calander.getSubmitDateTime(new Date()));
}
**//Commenting this line of code does not cause the crash**
m_adapter.add(mediaData);
}
} catch (FileNotFoundException e) {
//e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
}catch (Exception e) {
}
}
break;
}
}
}
}
E/AndroidRuntime( 1367): java.lang.NullPointerException
E/AndroidRuntime( 1367): at com.pravaa.dashboard.ui.components.Attachment
sActivity$AttachmentListAdapter.getView(AttachmentsActivity.java:149)
E/AndroidRuntime( 1367): at android.widget.AbsListView.obtainView(AbsList
View.java:1427)
E/AndroidRuntime( 1367): at android.widget.ListView.makeAndAddView(ListVi
ew.java:1802)
E/AndroidRuntime( 1367): at android.widget.ListView.fillSpecific(ListView
.java:1347)
E/AndroidRuntime( 1367): at android.widget.ListView.layoutChildren(ListVi
ew.java:1633)
E/AndroidRuntime( 1367): at android.widget.AbsListView.onLayout(AbsListVi
ew.java:1280)
E/AndroidRuntime( 1367): at android.view.View.layout(View.java:7035)
E/AndroidRuntime( 1367): at android.widget.FrameLayout.onLayout(FrameLayo
ut.java:333)
E/AndroidRuntime( 1367): at android.view.View.layout(View.java:7035)
E/AndroidRuntime( 1367): at android.widget.LinearLayout.setChildFrame(Lin
earLayout.java:1249)
E/AndroidRuntime( 1367): at android.widget.LinearLayout.layoutVertical(Li
nearLayout.java:1125)
E/AndroidRuntime( 1367): at android.widget.LinearLayout.onLayout(LinearLa
yout.java:1042)
E/AndroidRuntime( 1367): at android.view.View.layout(View.java:7035)
E/AndroidRuntime( 1367): at android.widget.FrameLayout.onLayout(FrameLayo
ut.java:333)
E/AndroidRuntime( 1367): at android.view.View.layout(View.java:7035)
E/AndroidRuntime( 1367): at android.view.ViewRoot.performTraversals(ViewR
oot.java:1045)
E/AndroidRuntime( 1367): at android.view.ViewRoot.handleMessage(ViewRoot.
java:1727)
E/AndroidRuntime( 1367): at android.os.Handler.dispatchMessage(Handler.ja
va:99)
E/AndroidRuntime( 1367): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 1367): at android.app.ActivityThread.main(ActivityThrea
d.java:4633)
E/AndroidRuntime( 1367): at java.lang.reflect.Method.invokeNative(Native
Method)
E/AndroidRuntime( 1367): at java.lang.reflect.Method.invoke(Method.java:5
21)
E/AndroidRuntime( 1367): at com.android.internal.os.ZygoteInit$MethodAndA
rgsCaller.run(ZygoteInit.java:858)
E/AndroidRuntime( 1367): at com.android.internal.os.ZygoteInit.main(Zygot
eInit.java:616)
E/AndroidRuntime( 1367): at dalvik.system.NativeStart.main(Native Method)
错误发生在以下行holder.content.setText(firstLine.toString())在AttachmentListAdapter的getView()方法中。
请帮我做这个。提前感谢。如果
convertView
不是null
,您不需要为holder
赋值。要正确使用此“holder”技术,请将holder保存在convertView
(标记)中,并在convertView
不为空时检索它(在中进行了很好的解释,请查看!)
还有其他一些奇怪的事情(例如,
linearLayout
为什么是成员变量),您应该看看。您必须在这里提供更多细节。代码和堆栈跟踪会有帮助。您好,我将发布代码,但在从设备运行时无法获取整个堆栈跟踪。在模拟器上,当我调用相机并捕获图像时,我得到一个强制关闭错误。adb logcat
在命令promt中会给出完整路径。您好,我已将代码粘贴到这里。我还将尝试获取日志。请帮我解决这个问题。我需要至少一个行号和错误类型,然后才能通过所有这些代码找到你的问题。你好,Stephan,非常感谢你,这对我来说非常有效。我仍然没有完全重构代码,需要清理。当我向适配器动态添加值时,它只显示最后添加的值,前面的条目将丢失,并且当我调试适配器的ArrayList时,它在任何时候都只有一个条目。我是不是错过了什么?请帮我做这个。提前谢谢。
ViewHolder holder = null;
if (mediaData != null) {
if (convertView == null) {
holder = new ViewHolder();
// holder.content = (TextView) mInflater.inflate(
// R.layout.column, null);
holder.content = new TextView(context);
holder.content.setGravity(Gravity.CENTER_VERTICAL);
holder.content.setHeight(25);
convertView = mInflater.inflate(R.layout.table_row, null);
convertView.setTag(holder);
linearLayout = (LinearLayout) convertView
.findViewById(R.id.linearLayout);
linearLayout.addView(holder.content);
} else {
holder = convertView.getTag();
}
firstLine.delete(0, firstLine.length());
firstLine.append(mediaData.getType()).append(" ")
.append(mediaData.toString());
holder.content.setText(firstLine.toString());
}