Как отобразить новый вид при длительном нажатии на элемент в ListView?
У меня есть настроенный ListView, который содержит 30 элементов, когда я долго нажимаю на конкретный элемент, я хочу скрыть этот конкретный элемент и отображать некоторое представление XML в этом конкретном элементе до тех пор, пока не будет нажато долго, и когда я освобождаю палец от этого элемента, он должен показать его старый элемент (т.е. я хочу отобразить предыдущий элемент, который был скрыт).
Может кто-нибудь предложить какие-либо идеи для решения этой задачи!
5 ответов
Попробуй это
ссылка: Обнаружение долгого нажатия с Android
@Override
public boolean onTouchEvent(MotionEvent event, MapView mapView){
if(event.getAction() == MotionEvent.ACTION_DOWN)
//hide wat u want to hide
if((event.getAction() == MotionEvent.ACTION_MOVE)||(event.getAction() == MotionEvent.ACTION_UP))
//show want to show
return super.onTouchEvent(event, mapView);
}
примечание: ссылка может уничтожить, поэтому код вставлен. в вашем переключателе onitemlongclick или onitemclick
yourlistview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
switch (position) {
case 0:
final TextView t = (TextView)arg1.findViewById(R.id.tview_homeoptions);
arg0.setOnTouchListener(new OnTouchListener() {//arg0 is the view of selected position
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN)
{t.setTextColor(Color.parseColor("#ff0000"));}
if((event.getAction() == MotionEvent.ACTION_MOVE)||(event.getAction() == MotionEvent.ACTION_UP))
{t.setText("up");}
return false;
}
});
break;
case 1:
//todo
break;
case 2:
//todo
break;
//so on
default:
break;
}
надеюсь, что это работает.
Сначала используйте onTouch(View view, MotionEvent motionEvent) OnTouchListener() через setOnTouchListener() в ссылке на просмотр списка, чтобы получить события MotionEvent.ACTION_UP и MotionEvent.ACTION_DOWN (также используйте return false, иначе вы заблокируете поток событий для обычных событий просмотра списка).
Затем Вы можете включить представление в xml-макет для элемента списка и использовать свой адаптер, чтобы установить положение элемента, по которому щелкаете, что сделает скрытый макет видимым, и вызовет notifyDataSetchanged(); по ссылке на адаптер,
редактировать
Также вы можете использовать setOnItemLongPressListener() для listview, чтобы получить длинное событие нажатия, а затем захватить событие ACTION_UP.
Вы могли бы сделать следующее.
Для элемента ListView создайте FrameLayout, который включает макет элемента списка (layout1) и макет с видом, который должен отображаться при длительном нажатии (layout2), и установите его видимость пропавшим.
Не надо долго слушать слушателя и делать
layout1.setVisibility(View.GONE);
layout2.setVisibility(View.Visible);
и вернуться назад
layout1.setVisibility(View.Visible);
layout2.setVisibility(View.GONE);
Вот полный код для вас: ваш listItem.xml:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/longClickedView"
android:text="long click"
android:background="#99cc00"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"/>
<TextView
android:id="@+id/normalView"
android:text="normal"
android:background="#cc0011"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
и в вашей деятельности / фрагмент:
list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
view.findViewById(R.id.normal).setVisibility(View.GONE);
view.findViewById(R.id.longClicked).setVisibility(View.VISIBLE);
return true;
}
});
Вы должны сделать следующее:
установите прослушиватель longclick для элементов списка и в функции onItemLongClick измените вид
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> arg0, View v,
int index, long arg3) {
// TODO change you view at index
return true;
}
});