Android Listview загружает изображение из String click

У меня есть список элементов, после нажатия на список открывается новое действие с подробностями. Проблема в том, что я не могу реализовать - загрузка изображения после нажатия на определенную строку из подробной активности. Например, в MainActivity есть:

String one[] = {"dog", "cat", "horse", "snail"};
String two[] = {"aaa", "bbb", "ccc", "ddd"};
String three[] = {"111", "**222**", "333", "**222**"};

Откройте приложение, щелкните второй элемент списка (кошка) и откройте новое действие с подробностями (все строки для кошки) Мне нужно, в этом случае, после нажатия на «Строка три» - если строка 222, открыть изображение (drawable/222.jpg), в данном случае это для «кошки» и «улитки». И после нажатия на "333" показать изображение 333.jpg...

Если это возможно, было бы лучше открыть изображение с помощью кнопки «Назад», чтобы вернуться к подробной деятельности.

Упрощенная основная активность:

String one[] = {"dog", "cat", "horse", "snail"};
String two[] = {"aaa", "bbb", "ccc", "ddd"};
String three[] = {"111", "222", "333", "222"};



List<ItemsModel> itemsModelList = new ArrayList<>();

ListView listView;

CustomAdapter customAdapter;

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

    setContentView(R.layout.activity_main);
    listView = findViewById(R.id.listview);


    for(int i = 0;i < one.length;i++){

        ItemsModel itemsModel = new ItemsModel(one[i],two[i],three[i]);

        itemsModelList.add(itemsModel);

    }

    customAdapter = new CustomAdapter(itemsModelList,this);

    listView.setAdapter(customAdapter);


}


@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {

    int id = item.getItemId();


    if (id == R.id.searchView){

        return true;
    }
    return super.onOptionsItemSelected(item);
}


public class CustomAdapter extends BaseAdapter implements Filterable {

    private List<ItemsModel> itemsModelsl;
    private List<ItemsModel> itemsModelListFiltered;
    private Context context;

    public CustomAdapter(List<ItemsModel> itemsModelsl, Context context) {
        this.itemsModelsl = itemsModelsl;
        this.itemsModelListFiltered = itemsModelsl;
        this.context = context;
    }



    @Override
    public int getCount() {
        return itemsModelListFiltered.size();
    }

    @Override
    public Object getItem(int position) {
        return itemsModelListFiltered.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = getLayoutInflater().inflate(R.layout.row_items,null);


        TextView one = view.findViewById(R.id.one);
        TextView two = view.findViewById(R.id.two);

        one.setText(itemsModelListFiltered.get(position).getone());
        two.setText(itemsModelListFiltered.get(position).gettwo());

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("main activity","item clicked");
                startActivity(new Intent(MainActivity.this, ItemsActivity.class).putExtra("items",itemsModelListFiltered.get(position)));

            }
        });

        return view;
    }

////Модель Предмета:

public class ItemsModel implements Serializable {

    private String one;
    private String two;
    private String three;

    public ItemsModel(String one, String two, String three) {
        this.one = one;
        this.two = two;
        this.three = three;

    }

    public String getone() {
        return one;
    }

    public void setone(String one) {
        this.one = one;
    }

    public String gettwo() {return two; }

    public void settwo(String two) { this.two = two; }

    public String getthree() {return three; }

    public void setthree(String three) { this.three = three; }

///

Если нужен Itemactivity или activity.xml скопирую.

Так в чем проблема?

Zain 20.12.2020 00:42

Мне не удалось реализовать это в коде -> если строка 222, открыть изображение (drawable/222.jpg)

Namma 20.12.2020 00:52
1
2
90
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для файла внутри папки res/drawable имя файла не может начинаться с цифры, например 111.jpg, 222.jpg и т. д. Поэтому для этого вы можете добавить префикс, начинающийся с буквы, например image_111.jpg, image_222.jpg и т. д.

Решение

В ItemsActivity используйте getIdentifier(String, String, String), чтобы получить идентификатор ресурса (R.drawable.image_222) по имени ресурса (image_222).

public class ItemActivity extends AppCompatActivity  {

    TextView textView;
    TextView textView2;
    TextView textView3;

    ItemsModel itemsModel;

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

        textView = findViewById(R.id.textView);
        textView2 = findViewById(R.id.textView2);
        textView3 = findViewById(R.id.textView3);

        Intent intent = getIntent();
        if (intent.getExtras() != null) {
            itemsModel = (ItemsModel) intent.getSerializableExtra("items");
            textView2.setText(itemsModel.getone());
            textView.setText(itemsModel.gettwo());
            textView3.setText(itemsModel.getthree());
            textView3.setClickable(true);
            textView3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Get drawable name
                    String drawableName = "image_" + itemsModel.getthree();

                    // Find drawable resource id by drawable name
                    int drawableResId = getResources().getIdentifier(
                            drawableName,
                            "drawable",
                            getPackageName());

                    showImageDetail(drawableResId);
                }
            });
        }
    }

    private void showImageDetail(int imageResId) {
        // Using a dialog or activity to open image detail.
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        ImageView imageView = new ImageView(this);
        imageView.setImageResource(imageResId);
        builder.setView(imageView);
        builder.create().show();
    }
}

Обновлять

Первая проблема заключается в распознавании «222», когда String three [] является, например, «xxx & 222», поэтому мне нужно распознавать «222» внутри строки отверстий. В какой-то большей строке будут и 222, и 333, могу ли я щелкнуть по обоим? Один покажет image_222, другой image_333.

Это довольно сложно немного. Например, значение three может быть

333 ггг 444 ххх и 222

В этом случае вы должны перебрать строку и найти номер изображения, например 333, 444, 222, и вычислить его начальный и конечный индекс, а затем использовать метод SpannableStringBuilder.setSpan(), чтобы установить прослушиватель кликов для каждого номера изображения. .

В следующем коде я буду использовать

  • Java Regex, чтобы найти все номера изображений в значении three.

  • SpannableStringBuilder.setSpan() метод для установки прослушивателя кликов по номерам изображений.

Код

public class ItemsActivity extends AppCompatActivity {

    TextView textView;
    TextView textView2;
    TextView textView3;

    ItemsModel itemsModel;

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

        textView = findViewById(R.id.textView);
        textView2 = findViewById(R.id.textView2);
        textView3 = findViewById(R.id.textView3);

        Intent intent = getIntent();
        if (intent.getExtras() != null) {
            itemsModel = (ItemsModel) intent.getSerializableExtra("items");
            textView.setText(itemsModel.getone());
            textView2.setText(itemsModel.gettwo());

            String three = itemsModel.getthree();
            SpannableStringBuilder builder = new SpannableStringBuilder(three);

            String regex = three;
            Pattern pattern = Pattern.compile("(\\d{3})");
            Matcher matcher = pattern.matcher(regex);
            while (matcher.find()) {
                String imageNumber = matcher.group(0);
                int numberStartIndex = three.indexOf(imageNumber);
                int numberEndIndex = numberStartIndex + imageNumber.length();

                builder.setSpan(new ClickableSpan() {
                    @Override
                    public void onClick(@NonNull View widget) {
                        showImageDetailByImageNumber(imageNumber);
                    }
                }, numberStartIndex, numberEndIndex, SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE);

                regex = three.substring(numberEndIndex);
                matcher = pattern.matcher(regex);
            }

            textView3.setMovementMethod(LinkMovementMethod.getInstance());
            textView3.setText(builder);
        }
    }

    /**
     * Find the image drawable (image_222.jpg) based on its number name (222)
     * @param imageNumber The image number like 111, 222, 333.
     */
    private void showImageDetailByImageNumber(String imageNumber) {
        // Get drawable name
        String drawableName = "image_" + imageNumber;

        // Find drawable resource id by drawable name
        int drawableResId = getResources().getIdentifier(
                drawableName,
                "drawable",
                getPackageName());

        // Using a dialog or activity to open image detail.
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        ImageView imageView = new ImageView(this);
        imageView.setImageResource(drawableResId);
        builder.setView(imageView);
        builder.create().show();
    }
}

Вторая проблема заключается в том, что имя изображения папки с возможностью рисования должно содержать маленькие буквы и цифры. Мне понадобится строка с заглавными буквами (например, A222)

В Android имя файла внутри drawable должно начинаться со строчной буквы, поэтому я думаю, что вы используете только префикс для изображения внутри этой папки, например image_, img_ или любой другой префикс, который соответствует вашим требованиям.

Спасибо, сынок, может быть, я плохо объяснил. Я не хочу открывать image_222 во втором действии, во втором действии будет так: 1 строка: кошка, под этим- 2 ряд: bbb и под этим "222", а во втором действии после нажатия на "222" он должен открыть image_222. В новом действии или во всплывающем окне «window.

Namma 20.12.2020 02:06

@Namma Я обновил ответ, пожалуйста, дайте мне знать, соответствует ли он вашим требованиям.

Son Truong 20.12.2020 02:37

Я просто добавил новый ответ, чтобы было понятно, и есть прикрепленное изображение, как это должно выглядеть. Спасибо за помощь

Namma 20.12.2020 11:52

@Namma Пожалуйста, посмотрите мой обновленный ответ, основанный на вашем коде.

Son Truong 20.12.2020 12:02

Есть какая-то проблема, я не могу войти во вторую активность, когда нажимаю на список, на кошку или что-то еще. Он открыл папку загрузки. Я проверю код еще раз

Namma 20.12.2020 13:16

Что-то не так, с этим не могу войти во вторую активность. Учтите, что строка three[] должна быть текстом без изображения. После нажатия на текст во втором действии должно загрузиться изображение. Без нажатия на текст 222 не должно отображаться изображение. Таким образом, третья строка останется 222, а не image_222. Спасибо

Namma 20.12.2020 13:32

Это визуальный ответ i.stack.imgur.com/sdyyC.jpg

Namma 20.12.2020 13:34

Вы имеете в виду, что три текста будут иметь только номер 222, но при нажатии на него будет загружен файл изображения с именем image_222.jpg, это правильно?

Son Truong 20.12.2020 14:01

Как называется файл изображения для текста «222» в папке с возможностью рисования?

Son Truong 20.12.2020 14:17

Это верно. После щелчка по списку Cat открывается вторая активность с «подробностями для Cat», например Cat, bbb, 222, и если щелкнуть по 222, должно открыться изображение. Имя изображения может быть image_222.jpg, я думаю, что я хорошо выразил это на фото - (визуальный ответ) выше Спасибо за помощь сыну

Namma 20.12.2020 15:42

Я обновил ответ, пожалуйста, проверьте еще раз.

Son Truong 20.12.2020 15:44

То же самое, когда я нажимаю «Список», второго действия вообще нет, папка загрузки открывается, поэтому я не могу проверить код для изображения. Я просто копирую код в ItemsActivity, мой код был в порядке для второго действия, возможно, есть некоторая коллизия.

Namma 20.12.2020 15:55

Не могли бы вы дважды проверить код, в котором вы начинаете второе действие, кажется, в вашем коде что-то идет не так.

Son Truong 20.12.2020 16:04

Подождите, все в порядке. Позвольте мне проверить, я напишу в течение 5 мин.

Namma 20.12.2020 16:05

Успокойтесь, пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы.

Son Truong 20.12.2020 16:06

Убедитесь, что в папке drawable есть файл с именем image_222.jpg.

Son Truong 20.12.2020 16:08

У меня проблема, чтобы попробовать это на устройстве, но на эмуляторе работает отлично. ТЫ ЛУЧШИЙ Сын. Спасибо за время и терпение.

Namma 20.12.2020 16:12

Попробуйте удалить, а затем снова установите приложение на устройство.

Son Truong 20.12.2020 16:13

Можем ли мы немного изменить код. У меня есть 2 проблемы, это не так важно, но если это возможно, будет хорошо. Первая проблема заключается в распознавании «222», когда String three [] является, например, «xxx & 222», поэтому мне нужно распознавать «222» внутри строки отверстий. В какой-то большей строке будут и 222, и 333, могу ли я щелкнуть по обоим? Один покажет image_222, другой image_333. Вторая проблема заключается в том, что внутри имени изображения папки с возможностью рисования должны быть маленькие буквы и цифры. Мне понадобится строка с заглавными буквами (например, A222. Самая важная часть уже решена Сыном, если это сложно, просто проигнорируйте это.

Namma 20.12.2020 17:59

@Namma Я обновляю ответ, пожалуйста, проверьте еще раз.

Son Truong 21.12.2020 02:55

Вот и все. Большое спасибо еще раз. (и извините за отправку сюда в комментариях, я не могу начать обсуждение в чате с этими пунктами)

Namma 21.12.2020 11:01

Хорошо, я только что сделал это визуальным, это должно быть так.

В этот момент первая и вторая активность выполняются нормально, но это все. Теперь мне нужно реализовать часть кода для второго действия, как на изображении, которое я даю. При нажатии на «222» (во втором действии) должно открыться drawable/image_222.jpg При нажатии на «333» (во втором действии) должно открыться drawable/image_333.jpg Строка 222 будет в нескольких местах, например даю для Кота и для Улитки. Итак, насколько я понимаю, это должно быть что-то вроде этого: если «три равно» «222» при нажатии показывает «drawable image_222.jpg» (я знаю, что это выглядит плохо, я просто упростил это)

Вниз коротко ItemActivity:

  TextView textView;
TextView textView2;
TextView textView3;

ItemsModel itemsModel;


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


    textView = findViewById(R.id.textView);
    textView2 = findViewById(R.id.textView2);
    textView3 = findViewById(R.id.textView3);


    Intent intent = getIntent();
    if (intent.getExtras() != null){
        itemsModel = (ItemsModel) intent.getSerializableExtra("items");
        textView2.setText(itemsModel.getone());
        textView.setText(itemsModel.gettwo());
        textView3.setText(itemsModel.getthree());


    }

/// https://i.stack.imgur.com/sdyyC.jpg

Другие вопросы по теме