0

所以..我正在创建一个列表视图,其中每一行都有一个 Imageview(用于预览图像)、一个 textView 和一个按钮(用于删除图像)。

问题:

单击项目并单击按钮时,我正在生成一个显示项目编号的 toast。#。

但有时代码可以正常工作,有时只是显示错误的项目编号。

更新:

我忘了补充一下,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;
    }

}

任何意见/建议表示赞赏..

4

2 回答 2

1
  1. ListView一个方法,如果您想要行的侦听器,则setOnItemClickListener()不必这样做。convertView.setOnClickListener
  2. 仅当转换视图为空时,您才在该按钮上设置侦听器。这意味着您不会在convertView回收时更改侦听器(这就是它无法正常工作的原因)。你应该这样做:

public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.listview_layout, null); 持有人 = 新的 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;

}

于 2013-05-22T07:43:41.540 回答
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();
            }
       });
于 2013-05-22T07:43:43.033 回答