Есть ли существенная разница между идентификатором и тегом? Какой из них будет более подходящим?

#java #android #json

#java #Android #json

Вопрос:

Я использую LayoutInflater для добавления динамических представлений каждый раз, когда я нажимаю функцию button. Я пытаюсь добавить тег / идентификатор в представление, чтобы я мог идентифицировать каждый элемент.

Я пробовал setTag, а также setId, но, похоже, в конечном итоге всегда не удается найти элемент

 public void onAddField(View v) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    final View rowView = inflater.inflate(R.layout.field, null);
    rowView.setTag(a);
    //rowView.setId(a);
    getdata2();
    parentLinearLayout.addView(rowView, parentLinearLayout.getChildCount() - 1);
    Log.d(String.valueOf(parentLinearLayout.getChildAt(a).getId()), "onAddField: "   type2_workout_mySpinner.findViewWithTag(a).);
    getdata2();
    a = a  1;
}

private void getdata2() {
    StringRequest stringRequest = new StringRequest("http://.../getDataCategories.php",
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    JSONObject j = null;
                    try {
                        j = new JSONObject(response);
                        result = j.getJSONArray(JSON_ARRAY);
                        catdetails(result);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                }
            });
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}



private void catdetails(JSONArray j) {
    for (int i = 0; i < j.length(); i  ) {
        try {
            JSONObject json = j.getJSONObject(i);
            arrayList2.add(json.getString(CategoryType_idArray));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    type2_workout_mySpinner.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, arrayList2));
}
  

Я хотел бы иметь возможность использовать класс getter для получения значений каждого элемента, который я добавил, например, значение нескольких выбранных значений spinner

Комментарии:

1. Семантически ИДЕНТИФИКАТОР — это в значительной степени то, что он говорит; способ идентифицировать данное View . Теги больше похожи на метаданные, дополнительную информацию, которую вы хотите прикрепить к View . Тем не менее, в любом случае вам нужно вызвать соответствующий findView*() метод для некоторого предка желаемого View . Единственным экземпляром любого из этих методов, который я вижу в вашем коде, является findViewWithTag(a) , который, кажется, вызывается на Spinner , но ваши динамически созданные View s не будут в этом. Вы пробовали вызывать любой из них на parentLinearLayout ?

2. @MikeM. спасибо за ваш ответ. Что-то вроде parentLinearLayout.getChildAt(a).findViewWithTag(a)? Если да, то как бы мне связать это со счетчиками? Должно ли это происходить в другом методе или это будет в методе onAddField?

3. Вам не нужен getChildAt(a) (хотя, если порядок и количество строк постоянны, вы могли бы просто использовать это вместо любого из findView*() методов). Я действительно не понимаю, как Spinner вписывается во все это.

4. @MikeM. Добавляемое мной представление содержит счетчик, поэтому в основном то, что я пытаюсь делать, это каждый раз, когда я добавляю новое представление в свой список, я хочу выбрать значение из счетчика из этого представления, и на экране в конечном итоге появится список просмотров с несколькими счетчиками.

5. спасибо @MikeM. это сработало!