Как щелкнуть элемент списка после изменения его на другой макет?

Когда я нажимаю на список, он меняет этот элемент на другой макет. Но после этого я больше не могу нажимать на этот элемент. Что я должен сделать? Помогите мне, пожалуйста. Спасибо.

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView == null || convertView.getTag() == null) {
        convertView = inflater.inflate(R.layout.activity_mainlist_item, parent, false);
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);

    }else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.rl_item.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            selectedItem(position);
            notifyDataSetChanged();
            Intent intent = new Intent(mContext.getApplicationContext(), DetailActivity.class);
            mContext.startActivity(intent);
        }
    });

    if (this.clk_position == position) {
        View view = inflater.inflate(R.layout.activity_mainlist_item_p, null);
        return view;
    }
    return convertView;
}

person Junior Frogie    schedule 15.03.2016    source источник
comment
Объясните, пожалуйста, чего вы хотите на самом деле. Чтобы мы могли понять сценарий.   -  person Reaz Murshed    schedule 15.03.2016
comment
Мне жаль. Ну, во-первых, у меня есть список, элементы которого надуваются с помощью макета «activity_mainlist_item», но после того, как он щелкнул, он изменится на макет «activity_mainlist_item_p». После изменения макета «B» я больше не могу нажимать на этот элемент. Но я могу нажать на другие предметы.   -  person Junior Frogie    schedule 15.03.2016
comment
опубликовать выбранный элемент (позицию); метод, изменили ли вы представление rl_item после щелчка по элементу.   -  person Divyang Panchal    schedule 15.03.2016
comment
Да, я изменил его на новый макет после нажатия. Вот почему я не могу вызвать onClick для этого элемента. Что я должен делать? public void selectedItem (int position) { this.clk_position = position; //clk_position — глобальная переменная } @ReazMurshed   -  person Junior Frogie    schedule 15.03.2016
comment
Вам не нужно менять макет. Вместо этого вы можете использовать тот же макет и, установив видимость элемента, добиться желаемого поведения.   -  person Reaz Murshed    schedule 15.03.2016
comment
поэтому мне нужно создать еще один ViewHolder, верно?   -  person Junior Frogie    schedule 15.03.2016
comment
Да, вы можете создать еще один ViewHolder для использования другого макета. Или вы можете использовать тот же макет и установить видимость в getView.   -  person Reaz Murshed    schedule 16.03.2016


Ответы (1)


Я предлагаю использовать единый макет и разделить его на две части. Первый раздел будет видимым по умолчанию, а второй раздел будет невидимым. Когда вы нажимаете на элемент списка, сделайте первый раздел невидимым, а второй раздел видимым.

Например,

list_item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <!-- replace below TextView with the layout of activity_mainlist_item.xml -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="Layout 1"
        android:id="@+id/layout1"
        android:background="@android:color/holo_blue_bright"
        />

    <!-- replace below TextView with the layout activity_mainlist_item_p.xml and don't forget to set android:visibility="gone"  -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="Layout 2"
        android:id="@+id/layout2"
        android:visibility="gone"
        android:background="@android:color/holo_purple"
        />
</LinearLayout>

В getView() попробуйте, как показано ниже

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView == null || convertView.getTag() == null) {
        convertView = inflater.inflate(R.layout.list_item_layout, parent, false);
        holder = new ViewHolder(convertView);
        // Assuming `ViewHolder` has layout1 and layout2.
        holder.layout1 = (TextView) convertView.findViewById(R.id.layout1);
        holder.layout2 = (TextView) convertView.findViewById(R.id.layout2);
        convertView.setTag(holder);

    }else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.rl_item.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            selectedItem(position);
            notifyDataSetChanged();
            Intent intent = new Intent(mContext.getApplicationContext(), DetailActivity.class);
            mContext.startActivity(intent);
        }
    });

    if (this.clk_position == position) {
        // Here, set swap the visibility or vice versa depending on your conditions
        holder.layout1.setVisibility(View.GONE);
        holder.layout2.setVisibility(View.VISIBLE);
        return view;
    }
    return convertView;
}
person Faraz    schedule 15.03.2016
comment
Итак, когда мы инициализируем его значение, мы должны сделать это дважды, верно? - person Junior Frogie; 15.03.2016
comment
Инициализируйте свой полный макет под holder = new ViewHolder(convertView);' and depending on the condition, set visibility and its values. No need to initialize ViewHolder дважды. Я также обновлю свой ответ. - person Faraz; 15.03.2016