Как выбрать изображение из галереи и отобразить его в CardView, когда нажата кнопка внутри того же CardView в ReclerView - PullRequest
0 голосов
/ 20 июня 2019

Я создаю приложение, в котором есть просмотры карт и в каждом просмотре карт есть кнопка «выбрать изображение», просмотр изображений и некоторые данные. Я хочу, чтобы пользователь получал фото из галереи при нажатии кнопки «выбрать файл» и отобразить его и отобразить в том же виде карты RecyclerView.

Я попробовал это в моей основной деятельности:

    mButtonChooseImage = findViewById(R.id.button_choose_image);

   // I got an error in this line 
   mButtonChooseImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            openFileChooser();
        }
    });

    private void openFileChooser(){
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(intent,PICK_IMAGE_REQUEST);

}

    @Override
    protected void onActivityResult(int requestCode, int resultCode, 
    @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && 
     data != null
            && data.getData() != null){
        mImageUri = data.getData();

        Picasso.with(this).load(mImageUri).into(mImageView);
    }
}

Я также пытался в RecyclerViewAdapter сделать функцию openFileChooser (), но она не работает, потому что я не могу вызвать onActivityResult в моем recyclerViewAdapter. как мы можем восстановить результат onActivityResult внутри адаптера? Я читал кое-что об интерфейсах, но я не смог реализовать это.

это мой макет моей активности:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/darker_gray"/>

</RelativeLayout>

это мой макет example_item:

   <?xml version="1.0" encoding="utf-8"?>
 <android.support.v7.widget.CardView 
 xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardCornerRadius="10dp">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:src="@drawable/ic_launcher_background" />

    //this is my button"choose image"
    <Button
        android:id="@+id/button_choose_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="choose file" />


    <TextView
        android:id="@+id/text_view_creator"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="creator name"
        android:textColor="@android:color/black"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/text_view_ingredients"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ingredients:"
        android:textColor="@android:color/black"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/text_view_likes"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="like: "
        android:textColor="@android:color/black"
        android:textSize="20sp" />


   </LinearLayout>

 </android.support.v7.widget.CardView>

это моя основная деятельность:

public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private ExampleAdapter mExampleAdapter;
private ArrayList<ExampleItem> mExamplelist;
private RequestQueue mRequestQueue;

private static final int PICK_IMAGE_REQUEST = 1;

private Button mButtonChooseImage;

private ImageView mImageView;

private Uri mImageUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    mRecyclerView = findViewById(R.id.recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mExamplelist= new ArrayList<>();
    mRequestQueue= Volley.newRequestQueue(this);

    parseJSON();

    mButtonChooseImage = findViewById(R.id.button_choose_image);
   //I have an error in this line
   mButtonChooseImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            openFileChooser();
        }
    });

}
//this is my openFilechooser function
private void openFileChooser(){
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(intent,PICK_IMAGE_REQUEST);

}
  //this is my overrided onActivityresult function
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null
            && data.getData() != null){
        mImageUri = data.getData();

        Picasso.with(this).load(mImageUri).into(mImageView);
    }
}

private void parseJSON(){


    String url = "https://srehwald.github.io/eat-api/mensa-garching/2019/24.json";

    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {

                        mExamplelist = new ArrayList<ExampleItem>();
                        //loop in days
                        JSONArray jsonArray = response.getJSONArray("days");
                        for (int i=0;i<jsonArray.length();i++){
                            JSONObject day = jsonArray.getJSONObject(i);

                            String dishesarray = day.getString("dishes");
                            String date = day.getString("date");


                            //loop in dishes
                            JSONArray JsonDishes = new JSONArray(dishesarray);
                            for (int j=0;j<(JsonDishes.length());j++){
                                 JSONObject json_obj=JsonDishes.getJSONObject(j);

                                 String namedishes=json_obj.getString("name");
                                 Double dishes_price=json_obj.getDouble("price");
                                String ingredients=json_obj.getString("ingredients");

                                mExamplelist.add(new ExampleItem("test",namedishes,dishes_price,ingredients));

                            }

                        }

                        mExampleAdapter = new ExampleAdapter(MainActivity.this, mExamplelist);
                        mRecyclerView.setAdapter(mExampleAdapter);

                    } catch (JSONException e)
                    {

                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

    mRequestQueue.add(request);
 }
}

и это мой ReyclerViewadapter:

  public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {

private Context mContext;
private ArrayList<ExampleItem> mExampleList;


public ExampleAdapter(Context context, ArrayList<ExampleItem> exampleList){
    mContext = context;
    mExampleList = exampleList;

}

@NonNull
@Override
public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(mContext).inflate(R.layout.example_item, parent, false);
      ExampleViewHolder evh  = new ExampleViewHolder(v);
      return evh;

}

@Override
public void onBindViewHolder(@NonNull ExampleViewHolder holder, int position) {
ExampleItem currentItem = mExampleList.get(position);
String imageUrl = currentItem.getmImageUrl();
String creatorName = currentItem.getMcreator();
String ingredients = currentItem.getMingredients();
    Double likeCount= currentItem.getmLikes();

holder.mTextViewCreator.setText(creatorName);
holder.mTextViewLikes.setText("like: "+likeCount);
holder.mingredients.setText("Ingredients :"+ingredients);
Picasso.with(mContext).load(imageUrl).fit().centerInside().into(holder.mImageView);


}


@Override
public int getItemCount() {

    return mExampleList.size();
}

public class ExampleViewHolder extends RecyclerView.ViewHolder{
public ImageView mImageView;
public TextView mTextViewCreator;
public TextView mTextViewLikes;
public TextView mingredients;
public Button mTakephoto;

public ExampleViewHolder(@NonNull View itemView) {
    super(itemView);
    mImageView=itemView.findViewById(R.id.image_view);
    mTextViewCreator=itemView.findViewById(R.id.text_view_creator);
    mTextViewLikes=itemView.findViewById(R.id.text_view_likes);
    mingredients=itemView.findViewById(R.id.text_view_ingredients);
    mTakephoto=itemView.findViewById(R.id.button_choose_image);




   }
 }

}

Я ожидаю, что пользователь сможет выбрать изображение из галереи, когда кнопка «выбрать изображение», и отключит его в том же Cardview, где нажата кнопка.

Спасибо, что уделили время.

...