Intereting Posts
Можете ли вы зарегистрировать приложение в меню «долгое нажатие кнопки питания»? Ошибка аутентификации при использовании HttpPost с DefaultHttpClient на Android Android ICS SurfaceHolder.lockCanvas () не удалось внутренне и возвращает null Android gms: play-services: 8.1.0 DexIndexOverflowException Как перенести файлы cookie в андроид даже после того, как приложение закрыто или помещено в фоновом режиме, нажав кнопку меню в андроиде? Есть ли способ подключиться к устройству Bluetooth Low Energy под Android 5, отображая публичный статический адрес? Philips Hue Android SDK Проверка на закат / Если R.java будет находиться под контролем версий Матч родителя для viewpager внутри scrollview не работает Сохраните файлы SharedPreferences в пользовательском каталоге или получите по умолчанию SharedPreferences dir Android ExpandableListView с использованием анимации Понимание общих методов в Java Может быть создан фрагмент только с одним экземпляром Google Maps замедляет работу в Android 2.2 при использовании преобразований CSS3 Как подключить существующий проект Android Studio к существующему хранилищу Github

Доступ к представлениям другого элемента ListView из некоторого элемента

У меня есть ListView , каждый элемент которого является пользовательским макетом. Макет состоит из двух кадров: первый – это просто TextView , второй – LinearLayout состоящий из двух изображений. Я пытаюсь сделать это, если я LinearLayout элемент ListView , если LinearLayout «ушел», он становится «видимым», а TextView отключается. Если LinearLayout «видимо», он «уходит», и TextView отключается. Вот мой следующий код:

Код:

  ListView lvw = (ListView) layout.findViewById(R.id.formats); formatAdapter adapter = new formatAdapter(act, arr); //act is context and arr is an array of String lvw.setAdapter(adapter); lvw.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { TextView tev = (TextView) arg1 .findViewById(R.id.formatN); LinearLayout extraB = (LinearLayout) arg1 .findViewById(R.id.extraButtons); if (extraB.getVisibility() == View.GONE) { extraB.setVisibility(View.VISIBLE); tev.setEnabled(false); } else { extraB.setVisibility(View.GONE); tev.setEnabled(true); } } }); 

formatAdapter.java

 public class formatAdapter extends BaseAdapter { LayoutInflater Inflater; Context con; String[] names; public formatAdapter(Context c, String[] s) { con = c; names = s; Inflater = (LayoutInflater) con .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return names.length; } @Override public Object getItem(int arg0) { return null; } @Override public long getItemId(int arg0) { return 0; } @Override public View getView(int arg0, View arg1, ViewGroup arg2) { View v1 = arg1; v1 = Inflater.inflate(R.layout.adapter_formats, null); TextView tv = (TextView) v1.findViewById(R.id.formatN); tv.setText(names[arg0]); return v1; } } 

adapter_formats.xml

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/formatN" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="10dp" /> <LinearLayout android:id="@+id/extraButtons" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:orientation="horizontal" android:visibility="gone"> <ImageView android:id="@+id/play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/cD" android:src="@drawable/img_29" /> <View android:layout_width="50dp" android:layout_height="0dp" android:contentDescription="@string/cD" /> <ImageView android:id="@+id/download" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/img_31" /> </LinearLayout> </FrameLayout> 

Теперь, я хочу, чтобы, если для любого элемента, LinearLayout видна, и если я LinearLayout на какой-то другой элемент, то элементы LinearLayout исчезнут, а TextView получит разрешение (макет по умолчанию). Позвольте мне объяснить на примере: если я установил первый элемент, его LinearLayout станет видимым. Я хочу, чтобы, если я нажму на второй элемент, линейная компоновка первого элемента автоматически исчезнет. Я попытался объяснить, но извините, если я не смог объяснить хорошо. Кто-нибудь может мне с этим помочь?

Просто нашел способ сделать это, и я чувствую себя потрясающе :), хотя этот способ не является подлинным: P Чтобы скрыть представления других списков, я сделал глобальное представление в своем классе и инициализировал его нулевым (представление – это тот же класс, который я Хочу скрыть, например, здесь, я хочу, чтобы линейная компоновка предыдущего элемента списка исчезла, поэтому я взял глобальный линейный макет). Затем внутри каждого onItemClickListener я начинаю вводить следующий код:

 if(myGlobalView!=null) { myGlobalView.hide(); } 

Кроме того, когда я вижу видимость другого элемента списка, я присваиваю это представление своему глобальному виду, следуя следующему коду:

 myGlobalView = myCurrentView; 

Надеюсь, это поможет другим людям 🙂

В адаптере удерживайте position для которой должен быть вид LinearLayout:

 public class formatAdapter extends BaseAdapter { LayoutInflater Inflater; Context con; String[] names; // Position to show private int positionToShow; // Constants // Default - All LinearLayouts are hidden final static int NO_CURRENT_SELECTION = -1 public formatAdapter(Context c, String[] s) { con = c; names = s; Inflater = (LayoutInflater) con .getSystemService(Context.LAYOUT_INFLATER_SERVICE); // Initial setting positionToShow = NO_CURRENT_SELECTION; } // Updates 'positionToShow' - used in ListView's OnItemClickListener public void setPositionToShow(int newPosition) { positionToShow = newPosition; } // Current position for which the LinearLayout should be visible public int getPositionToShow() { return positionToShow; } } 

В ListView OnItemClickListener обновите positionToShow с помощью setPositionToShow() который мы определили выше:

 lvw.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // User has clicked the same position again - toggle visibility if (yourAdapter.getPositionToShow() == arg2) { // No LinearLayouts should be visible yourAdapter.setPositionToShow( FormatAdapter.NO_CURRENT_SELECTION); } else { // User has clicked a new position // Show LinearLayout for this position yourAdapter.setPositionToShow(arg2); } // Refresh the ListView yourAdapter.notifyDataSetChanged(); } }); 

Наконец, в getView(...) вашего адаптера используйте positionToShow для управления видимостью просмотров:

 @Override public View getView(int arg0, View arg1, ViewGroup arg2) { View v1 = arg1; v1 = Inflater.inflate(R.layout.adapter_formats, null); TextView tv = (TextView) v1.findViewById(R.id.formatN); // Initialize the LinearLayout LinearLayout ll = (LinearLayout) v1.findViewById(R.id.extraButtons); tv.setText(names[arg0]); // This position's LinearLayout should be visible if (positionToShow == arg0) { ll.setVisibility(View.VISIBLE); tv.setEnabled(false); } else { // Either the position is not in view, // or 'positionToShow' is set to NO_CURRENT_SELECTION ll.setVisibility(View.GONE); tv.setEnabled(true); } return v1; } 

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

Вы можете взять переменную уровня класса, которая будет удерживать текущую выбранную позицию

private int mCurrentPosition = -1;

И вы можете заменить свой метод onItemClick() ListView на приведенный ниже код.

 @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { TextView tev = (TextView) arg1.findViewById(R.id.formatN); LinearLayout extraB = (LinearLayout) arg1 .findViewById(R.id.extraButtons); if (mCurrentPosition > -1) { View v = arg0.getChildAt(mCurrentPosition); v.findViewById(R.id.extraButtons).setVisibility(View.GONE); } if (extraB.getVisibility() == View.GONE) { extraB.setVisibility(View.VISIBLE); tev.setEnabled(false); } else { extraB.setVisibility(View.GONE); tev.setEnabled(true); } mCurrentPosition = arg2; } 

Это должно решительно решить вашу проблему. Счастливое кодирование 🙂