使用Imageview,TextView&amp ;;的自定义列表视图一个按钮作为项目

时间:2013-05-22 07:24:50

标签: java android android-listview

所以..我正在创建一个列表视图,其中每一行都有一个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;
    }

}

任何意见/建议赞赏..

2 个答案:

答案 0 :(得分:1)

  1. ListView有一个方法setOnItemClickListener(),如果你想要一个行的监听器,你不必做convertView.setOnClickListener
  2. 仅当转换视图为空时,才在该按钮上设置侦听器。这意味着当convertView被回收时你不会改变监听器(这就是为什么它不能正常工作)。你应该这样做:
  3. 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();
            }
       });