2011-02-18 2 views
1

저는 CommonsGuy의 드래그 앤 드롭 예제를 사용하고 있습니다. 기본적으로 Android 메모장 예제와 통합하려고합니다. 2 개의 서로 다른 드래그 아웃간단한 커서를 사용하여 드래그 앤 드롭

Drag N Drop

N 내가 그들 모두 내가 데이터베이스에서 목록을 받고 간단한 커서 어댑터를 사용하고 같은 정적 문자열 배열을 사용한 본 적이 예를 놓습니다.

그래서 내 질문에 어떻게 문자열 배열에 간단한 커서 어댑터에서 결과를 얻을 수 있지만 목록 항목을 클릭 할 때 행 id를 반환 할 수 있도록 메모를 편집하는 새 활동에 전달할 수 있습니다.

여기 내 코드입니다 :

Cursor notesCursor = mDbHelper.fetchAllNotes(); 
    startManagingCursor(notesCursor); 

    // Create an array to specify the fields we want to display in the list (only NAME) 
    String[] from = new String[]{WeightsDatabase.KEY_NAME}; 

    // and an array of the fields we want to bind those fields to (in this case just text1) 
    int[] to = new int[]{R.id.weightrows}; 

    // Now create a simple cursor adapter and set it to display 
    SimpleCursorAdapter notes = 
      new SimpleCursorAdapter(this, R.layout.weights_row, notesCursor, from, to); 
    setListAdapter(notes); 

그리고 저는 여기에 그 일을하기 위해 노력하고있어 코드입니다.

public class TouchListViewDemo extends ListActivity { 
private static String[] items={"lorem", "ipsum", "dolor", "sit", "amet", 
                   "consectetuer", "adipiscing", "elit", "morbi", "vel", 
                   "ligula", "vitae", "arcu", "aliquet", "mollis", 
                   "etiam", "vel", "erat", "placerat", "ante", 
                   "porttitor", "sodales", "pellentesque", "augue", "purus"}; 
private IconicAdapter adapter=null; 
private ArrayList<String> array=new ArrayList<String>(Arrays.asList(items)); 

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 

    adapter=new IconicAdapter(); 
    setListAdapter(adapter); 

    TouchListView tlv=(TouchListView)getListView(); 

    tlv.setDropListener(onDrop); 
    tlv.setRemoveListener(onRemove); 
} 

private TouchListView.DropListener onDrop=new TouchListView.DropListener() { 
    @Override 
    public void drop(int from, int to) { 
      String item=adapter.getItem(from); 

      adapter.remove(item); 
      adapter.insert(item, to); 
    } 
}; 

private TouchListView.RemoveListener onRemove=new TouchListView.RemoveListener() { 
    @Override 
    public void remove(int which) { 
      adapter.remove(adapter.getItem(which)); 
    } 
}; 

class IconicAdapter extends ArrayAdapter<String> { 
    IconicAdapter() { 
     super(TouchListViewDemo.this, R.layout.row2, array); 
    } 

    public View getView(int position, View convertView, 
              ViewGroup parent) { 
     View row=convertView; 

     if (row==null) {              
      LayoutInflater inflater=getLayoutInflater(); 

      row=inflater.inflate(R.layout.row2, parent, false); 
     } 

     TextView label=(TextView)row.findViewById(R.id.label); 

     label.setText(array.get(position)); 

     return(row); 
    } 
} 

}

나는 내가 많이 요구하고있어 알고 있지만 올바른 방향으로 점은 꽤 도움이 될 것이다! 감사

+0

업데이트 : 원래 이름이 포함 된 문자열 배열을 만들었습니다. 어떤 위치가 변경되었는지 찾기 위해 드래그 앤 드롭 배열에 대한 상호 참조를 만든 다음 해당 변경 내용으로 rowId 배열을 업데이트합니다. 추악하지만 작동합니다. 이제는 더 효율적으로 실행되도록 노력하겠습니다. – Cameron

답변

3

당신은 SimpleCursorAdapter이 수정 될 수 없다는 단순한 이유를 들어, SimpleCursorAdapterTouchListView와 함께 사용할 수 없습니다. Adapter은 작업을 반영하고 끌어서 놓기 위해 데이터를 변경해야합니다.

간단하지만 다소 투박한 솔루션은 Cursor 반복 및 데이터의 무언가의 ArrayList을 생성하는 것입니다, 다음 사용 ArrayListArrayAdapterTouchListView 그.

매끄러운하지만 복잡한 솔루션은 데이터 변경 사항을 TouchListView하고 SimpleCursorAdapter 사이에 위치하여 드래그를 인식하는 장식 ListAdapter을 만들고 드롭하고 즉시이를 적용한다. 예를 들어 사용자가 위치 5와 6을 바꾼 경우 TouchListViewgetView()을 호출하여 위치 5를 얻으면 장식 어댑터는 SimpleCursorAdapter에서 위치 6의 행을 가져 오는 것을 알게됩니다.

+0

고마워요! 내가 대답하고 싶었던 바로 그 사람) 그래, 나는 그것이 너무 단순하지 않을까 두려웠다. 그것을 조사한 후 맞춤 어댑터가 필요할 것 같습니다. 나를 올바른 방향으로 가리켜 주셔서 감사합니다. 나는 지금 그것에 대해 어떻게 생각하는지에 대한 생각을 가지고 있다고 생각한다. 내가 작업 솔루션을 얻는다면 나는이 스레드를 업데이트 할 것이다. – Cameron

+0

@ 카메론 : "고마워! 내가 대답하고 싶었던 사람." "음,이 질문을 보니 우연히 운이 좋았다. 'TouchListView'에 대한 홈 페이지가 가리키고 있기 때문에, 그것에 대한 지원은'cw-android' Google 그룹에 있습니다. 당신이 거기에 질문을한다면, 나는 그들을 볼 가능성이 훨씬 더 큽니다. – CommonsWare

+0

@cameron 이것을 구현할 수 있었습니까? 내 접근 방식을 설계하고 CursorAdapter -> ListAdapter -> TouchListView 사이의 연결을 이해하고 효과적인 솔루션을 구현하는 방법을 이해하려고합니다. – HGPB