2017-05-07 7 views
-2

私は、各行のtextviewとimageviewでlistviewを持っており、クリックすると画像を拡大する方法を理解しようとしています。ユーザは、ギャラリーから画像を取得し、名前付きデータベースに保存します。彼らは、提供する目的でリゾート/ホテルの地図です。 は、これはすべてがレイアウトされている方法です。アンドロイドクリックリスト拡大表示するIm​​ageView

enter image description here

私はImageViewの上でクリックするか、単純にリストビュー自体、そして中央に拡大イメージを持つことができる場所に私のアプリを取得しようとしています画面の画面の中央に拡大されていない場合、私は新しいアクティビティで拡大した画像を開くことさえ気にしません。いずれにしても大丈夫です。私は地図を読むことができるようにしたいので、ピンチトゥーズームで何かをするのは素晴らしいことです!私はユーザーのギャラリーから画像を取得し、リストに保存し、ホテル/リゾートの名前を尋ねます。次に、情報をデータベースに保存し、それをリストビューに表示します。画像をサムネイルとしてリストビューに収めるために画像を切り抜きますが、読みやすくするためにクリックしたときにそれらを元に戻したいと思います。どんな助けでも大歓迎です!私の目標は、this質問への回答のように見えるようにすることですが、それを自分のコードに最適化する方法を理解できませんでした。

public class MapsMainActivity extends AppCompatActivity { 

    private EditText fname; 
    private ImageView pic; 
    private DatabaseHandler db; 
    private String f_name; 
    private ListView lv; 
    private dataAdapter data; 
    private Hotel dataModel; 
    private Bitmap bp; 
    private byte[] photo; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps_main); 

     db = new DatabaseHandler(this); 

     lv = (ListView) findViewById(R.id.list1); 
     pic = (ImageView) findViewById(R.id.pic); 
     fname = (EditText) findViewById(R.id.txt1); 
    } 

    public void buttonClicked(View v) 
    { 
     int id = v.getId(); 

     switch(id) 
     { 
      case R.id.save: 
       if (fname.getText().toString().trim().equals("")) 
       { 
        Toast.makeText(getApplicationContext(), "Name edit text is empty, Enter name", Toast.LENGTH_LONG).show(); 
       } 
       else 
       { 
        addHotel(); 
       } 
       break; 

      case R.id.display: 
       showRecords(); 
       Intent intent = new Intent(getApplicationContext(), display_hotels.class); 
       startActivity(intent); 
       break; 

      case R.id.pic: 
       selectImage(); 
       break; 
     } 
    } 

    public void selectImage() 
    { 
     Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); 
     photoPickerIntent.setType("image/*"); 
     startActivityForResult(photoPickerIntent, 2); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
     switch(requestCode) 
     { 
      case 2: 
       if(resultCode == RESULT_OK) 
       { 
        Uri chosenImage = data.getData(); 

        if(chosenImage != null) 
        { 
         bp = decodeUri(chosenImage, 400); 
         pic.setImageBitmap(bp); 
        } 
       } 
     } 
    } 

    protected Bitmap decodeUri(Uri selectedImage, int REQUIRED_SIZE) 
    { 
     try 
     { 
      BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 
      BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o); 

      int width_tmp = o.outWidth, height_tmp = o.outHeight; 
      int scale = 1; 
      while (true) 
      { 
       if (width_tmp/2 < REQUIRED_SIZE || height_tmp/2 < REQUIRED_SIZE) 
       { 
        break; 
       } 
       width_tmp /= 2; 
       height_tmp /= 2; 
       scale *= 2; 
      } 

      BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize = scale; 
      return BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o2); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    private byte[] profileImage(Bitmap b) 
    { 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     b.compress(Bitmap.CompressFormat.PNG, 0, bos); 
     return bos.toByteArray(); 
    } 

    private void getValues() 
    { 
     f_name = fname.getText().toString(); 
     photo = profileImage(bp); 
    } 

    private void addHotel() 
    { 
     getValues(); 

     db.addHotels(new Hotel(f_name, photo)); 
     Toast.makeText(getApplicationContext(), "Saved successfully", Toast.LENGTH_SHORT).show(); 
    } 

    private void showRecords() 
    { 
     final ArrayList<Hotel> hotels = new ArrayList<>(db.getAllHotels()); 

     data = new dataAdapter(this, hotels); 
     data.notifyDataSetChanged(); 

     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() 
     { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
      { 
       dataModel = hotels.get(position); 
       Toast.makeText(getApplicationContext(), String.valueOf(dataModel.getID()), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

} 

は、事前にありがとう:

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.display_hotels); 

    lv = (ListView) findViewById(R.id.list1); 

    db = new DatabaseHandler(this); 

    pic = (ImageView) findViewById(R.id.pic); 
    fname = (EditText) findViewById(R.id.txt1); 

    final ArrayList<Hotel> hotels = new ArrayList<>(db.getAllHotels()); 

    data = new dataAdapter(this, hotels); 

    data.sort(new Comparator<Hotel>() 
    { 
     @Override 
     public int compare(Hotel arg0, Hotel arg1) 
     { 
      return arg0.getFName().compareTo(arg1.getFName()); 
     } 
    }); 

    data.notifyDataSetChanged(); 
    lv.setAdapter(data); 

    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
     { 
      Intent i = new Intent(getApplicationContext(), display_full_image.class); 
      startActivity(i); 
     } 
    }); 
} 

そして、私の主な活動:

public class dataAdapter extends ArrayAdapter<Hotel> { 

    Context context; 
    ArrayList<Hotel> mHotel; 

    public dataAdapter(Context context, ArrayList<Hotel> hotel) 
    { 
     super(context, R.layout.listhotels, hotel); 
     this.context = context; 
     this.mHotel = hotel; 
    } 

    public class Holder 
    { 
     TextView nameFV; 
     ImageView pic; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     Hotel data = getItem(position); 

     Holder viewHolder; 

     if (convertView == null) 
     { 
      viewHolder = new Holder(); 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(R.layout.listhotels, parent, false); 

      viewHolder.nameFV = (TextView) convertView.findViewById(R.id.txtViewer); 
      viewHolder.pic = (ImageView) convertView.findViewById(R.id.imgView); 

      convertView.setTag(viewHolder); 
     } 
     else 
     { 
      viewHolder = (Holder) convertView.getTag(); 
     } 

     viewHolder.nameFV.setText(data.getFName()); 
     viewHolder.pic.setImageBitmap(convertToBitmap(data.getImage())); 

     return convertView; 
    } 

    private Bitmap convertToBitmap(byte[] b) 
    { 
     return BitmapFactory.decodeByteArray(b, 0, b.length); 
    } 
} 

私のコードは、ホテルのリストを表示するには、次のように

マイアダプタクラスです私を助けることができる人に。私は大いに感謝します。これは2日以内に予定されているモバイルアプリケーション開発クラスの最終プロジェクト用です。私は実際にそれを完了するのにはとても近くています。あなたの時間をありがとう。

+0

を処理するためにそこにlibrabryをピンチズームを有効にする場合はそのためのあなたインターネットで多くの例を見つけることができます。つまり、画像のサムネイルをlistviewの項目に表示します。フルページの場合は、フルイメージを使用します。あなたはあまりにも多くのコードを投稿した。私はそれを見ていない。 – greenapps

+0

あなたはちょうどあなたのlistItemのイメージをクリックすると、選択されたイメージで拡大したイメージビューを表示したかったのですか? –

+0

@ankit purwarはい、まさに私がやろうとしていることです。 –

答えて

1

使用私はいけない。このgetViewメソッド()

@Override 
      public View getView(int position, View convertView, ViewGroup parent) 
      { 
       Hotel data = getItem(position); 

       Holder viewHolder; 

       if (convertView == null) 
       { 
        viewHolder = new Holder(); 
        LayoutInflater inflater = LayoutInflater.from(getContext()); 
        convertView = inflater.inflate(R.layout.listhotels, parent, false); 

        viewHolder.nameFV = (TextView) convertView.findViewById(R.id.txtViewer); 
        viewHolder.pic = (ImageView) convertView.findViewById(R.id.imgView); 

        convertView.setTag(viewHolder); 
       } 
       else 
       { 
        viewHolder = (Holder) convertView.getTag(); 
       } 

       viewHolder.nameFV.setText(data.getFName()); 
       viewHolder.pic.setImageBitmap(convertToBitmap(data.getImage())); 
     viewHolder.pic.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 

         Dialog settingsDialog = new Dialog(context); 
         settingsDialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); 

         RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(500, 500); 
         lp.addRule(RelativeLayout.CENTER_IN_PARENT); 
         ImageView iv = new ImageView(context); 
         iv.setLayoutParams(lp); 
         iv.setImageResource(R.drawable.img3); 
//use in your case iv.setImageBitmap(convertToBitmap(data.getImage())); 
         settingsDialog.addContentView(iv,lp); 
         settingsDialog.show(); 

        } 
       }); 

       return convertView; 
      } 
+0

これは私が必要とするものです。手伝ってくれてどうもありがとう!! –

+0

@AnthonyBoley助けてくれてうれしい、歓声をあげる!! :) –

0

新しいアクティビティを開始して完全なイメージを表示すると、imgeDataがインテントで余分に渡されます。 FullImageActivit getIntent extraでは、イメージデータを取得してimageViewに表示します。 とあなたはかなり一般的であるタスクに問題があるかを理解し、それが check this

関連する問題