2016-08-30 41 views
0

我想創建一個類似於Instagram的圖庫的應用程序,其中向圖庫添加一張照片創建一個縮略圖,該縮略圖出現在GridView的開頭,而不是結束。從網格開始的左側添加GridView項目(android)

這是我的代碼。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#f0f0f0"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
     <Button 
      android:id="@+id/bUploadImage" 
      android:text="Upload Image" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 
     <GridView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/gridview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:columnWidth="90dp" 
      android:numColumns="3" 
      android:verticalSpacing="1dp" 
      android:horizontalSpacing="3dp" 
      android:stretchMode="columnWidth" 
      android:gravity="center" 
      android:rotationY="180" 
      /> 
    </LinearLayout> 

</RelativeLayout> 

ImageAdapter

public class ImageAdapter extends ArrayAdapter { 
    private Context mContext; 
    private ArrayList<Image> items; 

    public ImageAdapter(Context context, int textViewResourceId, ArrayList<Image> items) { 
     super(context, textViewResourceId, items); 
     this.mContext = context; 
     this.items = items; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     notifyDataSetChanged(); 
     ImageView imageView; 
     if (convertView == null) { 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(480, 500)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(1, 1, 1, 1); 
     } else { 
      imageView = (ImageView) convertView; 
     } 
     imageView.setImageBitmap((items.get(position)).getBitmap()); 
     return imageView; 
    } 

    public void notifyDatasetChanged(ArrayList<Image> items) { 
     this.items = items; 
    } 

} 

MainActivity

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

    private static final int RESULT_LOAD_IMAGE = 1; 
    private ImageAdapter adapter; 
    private ArrayList<Image> items = new ArrayList<Image>(); 

    Button bUploadImage; 


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

     bUploadImage = (Button)findViewById(R.id.bUploadImage); 
     bUploadImage.setOnClickListener(this); 

     GridView gridview = (GridView) findViewById(R.id.gridview); 
     adapter = new ImageAdapter(this,0,items); 
     gridview.setAdapter(adapter); 

    } 

    @Override 
    public void onClick(View v) { 
     switch(v.getId()){ 
      case R.id.bUploadImage: 
       Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       startActivityForResult(galleryIntent, RESULT_LOAD_IMAGE); 
       break; 

     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && data != null){ 
      Uri selectedImage = data.getData(); 
      try { 
       Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage); 
       Image i = new Image(); 
       i.setBitmap(bitmap); 
       items.add(i); 
      } catch(Exception e){ 
       e.printStackTrace(); 
       Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); 
      } 
      adapter.notifyDatasetChanged(items); 

     } 
    } 
} 

回答

0

請注意,您的notifyDatasetChanged實際上不會通知任何事情。它只是改變對數組的引用,但ArrayAdapter的內部列表不變。您只需撥打adapter.add(bitmap)即可自行觸發notifyDatasetChanged。所有的工作已經在ArrayAdapter執行中完成。

解決您的問題更改適配器看起來像這樣:

public class ImageAdapter extends ArrayAdapter<Bitmap> { 
    public ImageAdapter(Context context, int textViewResourceId, ArrayList<Bitmap> items) { 
     super(context, textViewResourceId, items); 
     Bitmap bm = BitmapFactory.decodeResource(context.getResources(), 
       android.R.drawable.btn_plus); 
     //set btn_plus as first element in array 
     insert(bm, 0); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView; 
     if (convertView == null) { 
      imageView = new ImageView(getContext()); 
      imageView.setLayoutParams(new GridView.LayoutParams(480, 500)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(1, 1, 1, 1); 
     } else { 
      imageView = (ImageView) convertView; 
     } 

     imageView.setImageBitmap(getItem(position)); 
     return imageView; 
    } 
} 

而且追蹤GridView項目單擊事件中,你需要訂閱setOnItemClickListener,而不是setOnClickListener

gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     if (position == 0) { 
      Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      startActivityForResult(galleryIntent, RESULT_LOAD_IMAGE); 
      return; 
     } 

     //Handle click on image 
    } 
}); 
+0

非常有用的答案。與上面的回答者一起實施,它工作得很好。 –

+0

@y_arl如果我已經回答了您的問題,請將其標記爲答案。 – j2ko

0

嘗試指定它應該去

list.add(0, yourObject); 

班次目前的元素在該位置的位置(如果有的話)和任何蘇後面的元素在右邊。