所以..我正在创建一个列表视图,其中每一行都有一个Imageview(用于预览图像),一个textView和一个按钮(用于删除图像)。
问题:
点击该项目&按钮点击我生成一个吐司,显示项目编号#。
但有时代码工作正常,有时只显示错误的项目编号。
更新:
我忘了添加textview中显示的值是:“flag:#”,其中#是项目的当前计数。我无法理解的总是正确但不是我得到的祝酒信息:s
后台工作:
页面顶部有一个按钮,用户可以通过该按钮点击照片,当他从相机应用程序返回时,列表视图会更新
代码:
public class PicMgr extends ListActivity {
public String storeID;
public String date;
TextView picMsg;
DBAdapter dbEngine = new DBAdapter(this);
ProgressDialog PDpicTasker;
private static final String DATASUBDIRECTORY = "pics";
private static int TAKE_PICTURE = 1;
public String fIMGname;
public static String outletpicpathIO;
private Uri outputFileUri;
public String fnameIMG;
public static String[] imgs;
public static String[] comments;
private EfficientAdapter adap;
public static String[] dataLV;
private void TakePhoto() {
fIMGname = storeID + "_"+ date;
dbEngine.open();
//String fIMGname;
int countExistingPics = 0;
countExistingPics = dbEngine.getExistingPicNos(storeID);
countExistingPics = countExistingPics + 1;
fIMGname = fIMGname + "_" +countExistingPics;
dbEngine.close();
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File dirORIGimg = new File(Environment.getExternalStorageDirectory(),DATASUBDIRECTORY);
if (!dirORIGimg.exists()) {
dirORIGimg.mkdirs();
}
//newfilename = "newfilename123";
File file = new File(dirORIGimg, fIMGname + ".jpg");
//Toast.makeText(getApplicationContext(), "inside TakePhoto(): "+newfilename, Toast.LENGTH_SHORT).show();
outputFileUri = Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(intent, TAKE_PICTURE);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
System.out.println("GetPic- onActivityResult - resultCode: "+resultCode);
if (requestCode == TAKE_PICTURE && resultCode == Activity.RESULT_OK) {
// ShowMessage(outputFileUri.toString());
//if (data != null) {
Toast.makeText(getApplicationContext(),outputFileUri.toString(), Toast.LENGTH_SHORT).show();
System.out.println("outputFileUri.toStr: "+outputFileUri.toString());
outletpicpathIO = outputFileUri.toString().trim();
if(!outletpicpathIO.isEmpty()){
try {
new GetCompressedPic().execute().get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//}
}
}
private class GetPicPath extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.i("GetPicPathTasker", "Ready to get start -GetCompressedPic-");
}
@Override
protected Void doInBackground(Void... params) {
try {
runOnUiThread(new Runnable() {
public void run() {
try {
TakePhoto(); // get pic
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
Log.i("GetPicPathTasker", "GetCompressedPic Failed!", e);
}
finally {
Log.i("GetPicPathTasker", "GetCompressedPic Completed...");
}
return null;
}
@Override
protected void onCancelled() {
Log.i("GetPicPathTasker", "GetCompressedPic Cancelled");
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Log.i("GetPicPathTasker", "GetCompressedPic cycle completed");
}
}
private class GetCompressedPic extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.i("PicBGtasker", "Ready to get start -GetCompressedPic-");
PDpicTasker = ProgressDialog.show(PicMgr.this, null, null);
//PDpicTasker.setContentView(R.layout.loader);
PDpicTasker.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
}
@Override
protected Void doInBackground(Void... params) {
try {
Options opts = new BitmapFactory.Options();
opts.inSampleSize = 2; // for 1/2 the image to be loaded
//Bitmap finalBitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeFile(outletpicpathIO, opts), 640, 480, false);
System.out.println("outletpicpathIO: "+outletpicpathIO);
fnameIMG = new File(outletpicpathIO).getAbsolutePath();
fnameIMG = fnameIMG.replace("/file:", "");
fnameIMG = fnameIMG.trim();
System.out.println("fnameIMG: "+fnameIMG);
Bitmap finalBitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeFile(fnameIMG), 640, 480, false);
//Bitmap finalBitmap = BitmapFactory.decodeFile(outletpicpathIO);
dbEngine.open();
dbEngine.savePicPath(storeID, fnameIMG);
dbEngine.close();
ByteArrayOutputStream streamIMG = new ByteArrayOutputStream();
File dir = new File(Environment.getExternalStorageDirectory(),DATASUBDIRECTORY);
if (!dir.exists()) {
dir.mkdirs();
}
String exportFileName = fIMGname+".jpg";
File fileIMG = new File(dir, exportFileName);
fileIMG.createNewFile();
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 50, streamIMG);
FileOutputStream fo = new FileOutputStream(fileIMG);
fo.write(streamIMG.toByteArray());
fo.close();
} catch (Exception e) {
Log.i("PicBGtasker", "GetCompressedPic Failed!", e);
}
finally {
Log.i("PicBGtasker", "GetCompressedPic Completed...");
}
return null;
}
@Override
protected void onCancelled() {
Log.i("PicBGtasker", "GetCompressedPic Cancelled");
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Log.i("PicBGtasker", "GetCompressedPic cycle completed");
PDpicTasker.dismiss();
}
}
// ><
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pic_mgr);
Intent StoreData = getIntent();
storeID = StoreData.getStringExtra("storeID");
date = StoreData.getStringExtra("date");
System.out.println("storeID >> "+storeID);
picMsg = (TextView)findViewById(R.id.textView1_PicMsg);
Button outletPic = (Button) findViewById(R.id.Button01_outletpic);
outletPic.setOnClickListener(new View.OnClickListener() {
public void onClick(View v2) {
//TakePhoto(); // get pic
//async(S)
try {
new GetPicPath().execute().get();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ExecutionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
Button saveNcont = (Button) findViewById(R.id.picMgr_saveNcont);
saveNcont.setOnClickListener(new View.OnClickListener() {
public void onClick(View v2) {
/*dbEngine.open();
dbEngine.savePicPath(storeID, fnameIMG);
dbEngine.close();*/
// save comments
}
});
Button backk = (Button) findViewById(R.id.picMgr_back);
backk.setOnClickListener(new View.OnClickListener() {
public void onClick(View v2) {
finish();
}
});
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//
picMsg.setText("Please Click on \"Take Photograph\" button to start taking Pictures");
dbEngine.open();
int maxLIMIT = dbEngine.getExistingPicNos(storeID);
System.out.println("maxLIMIT existing pics count: "+maxLIMIT);
if(maxLIMIT > 0){
imgs = dbEngine.getImgsPath(storeID);
comments = dbEngine.getImgsComment(storeID);
dataLV=new String[maxLIMIT];
for(int limitx = 0; limitx < maxLIMIT; limitx++){
dataLV[limitx]=""+limitx;
}
System.out.println("dataLV:"+dataLV.toString());
picMsg.setText("Please \"Delete\" non-required Photographs shown below \nor Click on \"Take Photograph\" button to start taking more Pictures");
adap = new EfficientAdapter(this);
setListAdapter(adap);
}
//
dbEngine.close();
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
Toast.makeText(this, "Click-" + String.valueOf(position),
Toast.LENGTH_SHORT).show();
}
public static class EfficientAdapter extends BaseAdapter implements
Filterable {
private LayoutInflater mInflater;
private Bitmap mIcon1;
private Context context;
public EfficientAdapter(Context context) {
// Cache the LayoutInflate to avoid asking for a new one each time.
mInflater = LayoutInflater.from(context);
this.context = context;
}
/**
* Make a view to hold each row.
*
* @see android.widget.ListAdapter#getView(int, android.view.View,
* android.view.ViewGroup)
*/
public View getView(final int position, View convertView,
ViewGroup parent) {
// A ViewHolder keeps references to children views to avoid
// unneccessary calls
// to findViewById() on each row.
ViewHolder holder;
// When convertView is not null, we can reuse it directly, there is
// no need
// to reinflate it. We only inflate a new View when the convertView
// supplied
// by ListView is null.
if (convertView == null) {
convertView = mInflater.inflate(R.layout.listview_layout, null);
// Creates a ViewHolder and store references to the two children
// views
// we want to bind data to.
holder = new ViewHolder();
holder.textLine = (TextView) convertView
.findViewById(R.id.textLine);
holder.iconLine = (ImageView) convertView
.findViewById(R.id.iconLine);
holder.txt = (EditText) convertView.findViewById(R.id.txt);
holder.buttonLine = (Button) convertView
.findViewById(R.id.buttonLine);
convertView.setOnClickListener(new OnClickListener() {
private int pos = position;
@Override
public void onClick(View v) {
Toast.makeText(context, "Click-" + String.valueOf(pos),
Toast.LENGTH_SHORT).show();
}
});
holder.buttonLine.setOnClickListener(new OnClickListener() {
private int pos = position;
@Override
public void onClick(View v) {
Toast.makeText(context,
"Delete-" + String.valueOf(pos),
Toast.LENGTH_SHORT).show();
}
});
convertView.setTag(holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag();
}
// Get flag name and id
String filename = "flag_" + String.valueOf(position);
/*
* int id = context.getResources().getIdentifier(filename,
* "drawable", context.getString(R.string.package_str));
*/
mIcon1 = BitmapFactory.decodeFile(imgs[position]);
// Bind the data efficiently with the holder.
holder.iconLine.setImageBitmap(mIcon1);
holder.textLine.setText("flag " + String.valueOf(position));
holder.txt.setText(comments[position]);
return convertView;
}
static class ViewHolder {
TextView textLine;
ImageView iconLine;
EditText txt;
Button buttonLine;
}
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return dataLV.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
//String sendBack = PicMgr.dataLV[position];
return dataLV[position];
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_pic_mgr, menu);
return true;
}
}
任何意见/建议赞赏..
答案 0 :(得分:1)
ListView
有一个方法setOnItemClickListener()
,如果你想要一个行的监听器,你不必做convertView.setOnClickListener
。convertView
被回收时你不会改变监听器(这就是为什么它不能正常工作)。你应该这样做:public View getView(final int position,View convertView, ViewGroup parent){ ViewHolder持有人; if(convertView == null){ convertView = mInflater.inflate(R.layout.listview_layout,null); holder = new ViewHolder(); holder.textLine =(TextView)convertView .findViewById(R.id.textLine); holder.iconLine =(ImageView)convertView .findViewById(R.id.iconLine);
holder.txt = (EditText) convertView.findViewById(R.id.txt);
holder.buttonLine = (Button) convertView
.findViewById(R.id.buttonLine);
holder.buttonLine.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,
"Delete-" + v.getTag().toString(),
Toast.LENGTH_SHORT).show();
}
});
convertView.setTag(holder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag();
}
holder.buttonLine.setTag(position);
//rest of the method
return convertView;
}
答案 1 :(得分:1)
holder.buttonLine.setTag(position);
holder.buttonLine.setOnClickListener(new OnClickListener() {
private int pos = position;
@Override
public void onClick(View v) {
Toast.makeText(context,"Delete-" + String.valueOf(holder.buttonLine.getTag().toString()),
Toast.LENGTH_SHORT).show();
}
});