2013-11-24 58 views
1

我創建了一個ListView,每行都有一個EditText。 ListView還允許用戶使用https://github.com/romannurik/Android-SwipeToDismiss中的SwipeDismissListViewTouchListener.java通過水平滑動來刪除列表中的項目。帶有EditText和SwipeDismissListViewTouchListener的ListView

這兩種功能都能正常工作,除非用戶試圖通過EditText上發生的初始ACTION_DOWN事件執行滑動手勢。看起來EditText在傳遞給SwipeDismissListViewTouchListener之前正在使用ACTION_DOWN事件,該事件需要ACTION_DOWN事件來初始化手勢。

問:

我怎樣才能獲得SwipeDismissListViewTouchListener當輕掃手勢上的EditText開始工作?

SampleListFragment.java:

import android.app.Activity; 
import android.app.ListFragment; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.EditText; 
import android.widget.ListView; 

import java.util.ArrayList; 

public class SampleListFragment extends ListFragment { 

    protected AddGroupAdapter adapter; 
    protected ListView lv; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     adapter = new AddGroupAdapter(getActivity()); 
     setListAdapter(adapter); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_sample, container, false); 
     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     lv = getListView(); 
     SwipeDismissListViewTouchListener listener = 
       new SwipeDismissListViewTouchListener(
         lv, 
         new SwipeDismissListViewTouchListener.DismissCallbacks() { 
          @Override 
          public boolean canDismiss(int position) { 
           return true; 
          } 

          @Override 
          public void onDismiss(ListView listView, int[] reverseSortedPositions) { 
           for (int position : reverseSortedPositions) { 
            adapter.removeRecord(position); 
           } 
           adapter.notifyDataSetChanged(); 
          } 
         }); 
     lv.setOnTouchListener(listener); 
     lv.setOnScrollListener(listener.makeScrollListener()); 

     super.onActivityCreated(savedInstanceState); 
    } 

    public class AddGroupAdapter extends BaseAdapter { 

     private LayoutInflater mInflater; 
     private ArrayList<String> data; 

     public AddGroupAdapter(Activity activity) { 
      mInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      data = new ArrayList<String>(); 
      for (int i = 0; i < 10; i++) { 
       data.add("Sample Text " + String.valueOf(i)); 
      } 
      notifyDataSetChanged(); 
     } 

     public void removeRecord(int position) { 
      data.remove(position); 
     } 

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

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

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

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder holder; 
      if (convertView == null) { 
       holder = new ViewHolder(); 
       convertView = mInflater.inflate(R.layout.row, null); 
       holder.edit = (EditText) convertView.findViewById(R.id.edit_text); 
       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      holder.edit.setText(data.get(position)); 
      holder.edit.setId(position); 
      holder.edit.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
       @Override 
       public void onFocusChange(View view, boolean hasFocus) { 
        if (!hasFocus) { 
         final int position = view.getId(); 
         final EditText edit = (EditText) view; 
         if (edit.getText() != null && !edit.getText().toString().isEmpty()) 
          if (position < getCount()) 
           data.set(position, edit.getText().toString()); 
        } 
       } 
      }); 

      return convertView; 
     } 
    } 

    static class ViewHolder { 
     EditText edit; 
    } 
} 

row.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"> 
    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:ems="10" 
     android:id="@+id/edit_text" 
     android:hint="Enter Text" 
     android:gravity="center_horizontal" 
     android:singleLine="true" /> 
</LinearLayout> 

* fragment_sample.xml:*

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ListView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@android:id/list" 
     android:name="com.example.app.SampleListFragment" 
     android:layout_width="match_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1.0" 
     android:descendantFocusability="beforeDescendants" 
     tools:context=".SampleActivity" 
     tools:layout="@android:layout/list_content"/> 

</LinearLayout> 

回答

0

嘗試添加以下內容到LinearLayout我n個row.xml:

android:descendantFocusability="blocksDescendants" 

編輯:

因此很明顯,一個EditText是棘手比按鈕有一個列表視圖中。也許這個答案可以讓你在正確的方向,如果你必須有你的:https://stackoverflow.com/a/2680077/362298

+0

這似乎並不奏效。 SwipeDismissListViewTouchListener仍然不會收到ACTION_DOWN事件。 – Adam

+0

我認爲這個答案可能更接近我所需要的:[http://stackoverflow.com/a/3542124/3027659](http://stackoverflow.com/a/3542124/3027659)。我似乎無法弄清楚如何將其實現到我的代碼中(從GestureDetector切換到OnTouchListener)。 – Adam