Я создаю приложение, в котором есть просмотры карт и в каждом просмотре карт есть кнопка «выбрать изображение», просмотр изображений и некоторые данные. Я хочу, чтобы пользователь получал фото из галереи при нажатии кнопки «выбрать файл» и отобразить его и отобразить в том же виде карты 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, где нажата кнопка.
Спасибо, что уделили время.