2013-04-09 103 views
4

我在我的項目執行拖放排序的ListView(DSLV)和LazyList在一起,我下載演示LazyListDrag-Sort ListView從GitHub然後整合和修改按我的要求,如何在Drag-Sort ListView中刷新ListView?

我用DSLV的阻力和對項目進行排序ListView和LazyList從URL顯示圖像, 我只是執行「基本使用遊樂場」從DSLV的阻力和排序,

我實現TestBedDSLV.java搜索,但問題是,當我從搜索內容該列表,但我不能更新列表,我已經嘗試notifyDataSetChanged方法,但它不起作用,一般我們創建新的適配器並將它傳遞給像lv.setAdapter(適配器),列表視圖牛逼在這裏,他們剛剛成立ListAdapter,所以我們不能做lv.setAdapter(適配器)

TestBedDSLV.java

package com.mobeta.android.demodslv; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.widget.Button; 
import android.widget.EditText; 

import com.mobeta.android.dslv.DragSortController; 
import com.mobeta.android.dslv.DragSortListView; 

public class TestBedDSLV extends FragmentActivity { 

private int mNumHeaders = 0; 
private int mNumFooters = 0; 

private int mDragStartMode = DragSortController.ON_DOWN; 
private boolean mRemoveEnabled = false; 
private int mRemoveMode = DragSortController.FLING_RIGHT_REMOVE; 
private boolean mSortEnabled = true; 
private boolean mDragEnabled = true; 

private String mTag = "dslvTag"; 
Button search; 
EditText search_customer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.test_bed_main); 

    search = (Button) findViewById(R.id.btn_search); 
    search_customer = (EditText) findViewById(R.id.search_product); 

    search_customer.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 

      // here is logic for refresh the list View 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 

    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.test_bed, getNewDslvFragment(), mTag).commit(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.mode_menu, menu); 
    return true; 
} 


private Fragment getNewDslvFragment() { 
    DSLVFragmentClicks f = DSLVFragmentClicks.newInstance(mNumHeaders, 
      mNumFooters); 
    f.removeMode = mRemoveMode; 
    f.removeEnabled = mRemoveEnabled; 
    f.dragStartMode = mDragStartMode; 
    f.sortEnabled = mSortEnabled; 
    f.dragEnabled = mDragEnabled; 
    return f; 
} 
} 

DSLVFragmentClicks.java

package com.mobeta.android.demodslv; 

import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.os.Bundle; 
import android.widget.Toast; 

public class DSLVFragmentClicks extends DSLVFragment { 

public static DSLVFragmentClicks newInstance(int headers, int footers) { 
    DSLVFragmentClicks f = new DSLVFragmentClicks(); 

    Bundle args = new Bundle(); 
    args.putInt("headers", headers); 
    args.putInt("footers", footers); 
    f.setArguments(args); 

    return f; 
} 

AdapterView.OnItemLongClickListener mLongClickListener = 
     new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       String message = String.format("Long-clicked item %d", arg2); 
       Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show(); 
       return true; 
      } 
     }; 

@Override 
public void onActivityCreated(Bundle savedState) { 
    super.onActivityCreated(savedState); 

    ListView lv = getListView(); 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      String message = String.format("Clicked item %d", arg2); 
      Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show(); 

     } 
    }); 
    lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      String message = String.format("Long-clicked item %d", arg2); 
      Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show(); 
      return true; 
     } 
    }); 
} 
} 

DSLVFragment.java

package com.mobeta.android.demodslv; 

import java.util.ArrayList; 
import java.util.Arrays; 

import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 

import com.mobeta.android.dslv.DragSortController; 
import com.mobeta.android.dslv.DragSortListView; 

public class DSLVFragment extends ListFragment { 

ArrayAdapter<String> adapter; 

private String[] array; 
public static ArrayList<String> list; 

private DragSortListView.DropListener onDrop = new DragSortListView.DropListener() { 
    @Override 
    public void drop(int from, int to) { 
     if (from != to) { 
      String item = adapter.getItem(from); 
      adapter.remove(item); 
      adapter.insert(item, to); 
     } 
    } 
}; 

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

protected int getLayout() { 
    return R.layout.dslv_fragment_main; 
} 

/** 
* Return list item layout resource passed to the ArrayAdapter. 
*/ 
protected int getItemLayout() { 
    return R.layout.list_item_handle_right; 

} 

private DragSortListView mDslv; 
private DragSortController mController; 

public int dragStartMode = DragSortController.ON_DOWN; 
public boolean removeEnabled = false; 
public int removeMode = DragSortController.FLING_RIGHT_REMOVE; 
public boolean sortEnabled = true; 
public boolean dragEnabled = true; 

public static DSLVFragment newInstance(int headers, int footers) { 
    DSLVFragment f = new DSLVFragment(); 

    Bundle args = new Bundle(); 
    args.putInt("headers", headers); 
    args.putInt("footers", footers); 
    f.setArguments(args); 

    return f; 
} 

public DragSortController getController() { 
    return mController; 
} 

/** 
* Called from DSLVFragment.onActivityCreated(). Override to set a different 
* adapter. 
*/ 
public void setListAdapter() { 
    array = getResources().getStringArray(R.array.jazz_artist_names); 
    list = new ArrayList<String>(Arrays.asList(array)); 

    adapter = new ArrayAdapter<String>(getActivity(), getItemLayout(), 
      R.id.text, list); 
    setListAdapter(adapter); 
} 

/** 
* Called in onCreateView. Override this to provide a custom 
* DragSortController. 
*/ 
public DragSortController buildController(DragSortListView dslv) { 
    DragSortController controller = new DragSortController(dslv); 
    controller.setDragHandleId(R.id.drag_handle); 
    controller.setClickRemoveId(R.id.click_remove); 
    controller.setRemoveEnabled(removeEnabled); 
    controller.setSortEnabled(sortEnabled); 
    controller.setDragInitMode(dragStartMode); 
    controller.setRemoveMode(removeMode); 
    return controller; 
} 

/** Called when the activity is first created. */ 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    mDslv = (DragSortListView) inflater.inflate(getLayout(), container, 
      false); 

    mController = buildController(mDslv); 
    mDslv.setFloatViewManager(mController); 
    mDslv.setOnTouchListener(mController); 
    mDslv.setDragEnabled(dragEnabled); 

    return mDslv; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    mDslv = (DragSortListView) getListView(); 

    mDslv.setDropListener(onDrop); 
    mDslv.setRemoveListener(onRemove); 

    Bundle args = getArguments(); 
    int headers = 0; 
    int footers = 0; 
    if (args != null) { 
     headers = args.getInt("headers", 0); 
     footers = args.getInt("footers", 0); 
    } 
    setListAdapter(); 
} 
} 

test_bed_main.xml

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

<LinearLayout 
    android:id="@+id/search_lay" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:orientation="horizontal" > 

    <EditText 
     android:id="@+id/search_product" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="2dp" 
     android:layout_marginLeft="5dp" 
     android:layout_marginTop="2dp" 
     android:layout_weight="1" 
     android:background="@drawable/search_back" 
     android:hint="Enter Firstname" 
     android:imeOptions="actionSearch" 
     android:inputType="text" 
     android:paddingBottom="2dp" 
     android:paddingLeft="5dp" 
     android:paddingTop="2dp" 
     android:visibility="visible" /> 

    <Button 
     android:id="@+id/btn_search" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="5dp" 
     android:layout_weight="2.5" 
     android:text="CANCEL" 
     android:textColor="#155280" 
     android:textSize="14sp" 
     android:textStyle="bold" 
     android:visibility="visible" /> 
</LinearLayout> 

<FrameLayout 
    android:id="@+id/test_bed" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 
<!-- We will add the DSLVFragment inside the FrameLayout in code --> 

</LinearLayout> 

enter image description here

和其他需要的類可以從我上面給出的github鏈接下載.....

+2

你粘貼了太多的代碼。你爲什麼不嘗試把它縮小到重要的線。 – asloob 2013-04-09 05:03:04

+0

「Talk is cheap,給我看代碼。」 – JJ86 2013-04-12 13:43:30

+0

我有帖子的代碼請檢查.... – Jayesh 2013-04-15 07:43:40

回答

1

其實,如果你看到你的代碼closly還有的,你有一個方法提

public void setListAdapter() { 
    array = getResources().getStringArray(R.array.jazz_artist_names); 
    list = new ArrayList<String>(Arrays.asList(array)); 

    adapter = new ArrayAdapter<String>(getActivity(), getItemLayout(), 
      R.id.text, list); 
    setListAdapter(adapter); 
} 

所以,當你說: 「一般我們創造新的適配器,並將它傳遞給ListView控件像lv.setAdapter(適配器),但在這裏,他們剛剛成立ListAdapter,所以我們不能做lv.setAdapter(適配器)」

難道你不能輕鬆地通過根據您的搜索輕鬆生成一個數組並將其設置爲代碼?

list = new ArrayList<String>(Arrays.asList(array)); 

     adapter = new ArrayAdapter<String>(getActivity(), getItemLayout(), 
       R.id.text, list); 
     setListAdapter(adapter); 

編輯:我想你是問錯了問題。您的主要關注點應該是如何在活動和片段之間進行通信......因爲您的搜索功能處於活動狀態並且列表處於片段狀態。所以你需要設置一個基本上將搜索字符串傳遞給你的片段的接口,然後你可以創建一個數組,並按照你現在正在做的相同的方式進行設置。

閱讀this SO問題與解答。在答案中,您會發現在活動和片段之間傳遞數據的一種類似方法。

編輯2:您主要關注的是從活動傳達給片段爲this..declare一個在你的活動這樣的接口:

public interface FragmentCommunicator{ 
     public void passDataToFragment(String someValue); 
    } 

then call the interface at your text change listener..for example 

    FragmentCommunicator mfragmentCommunicator; 
    //your onCreate function 
    { 
    //your textchangelistenr 
    { 
    onTextChanged call 
if(mfragmentCommunicator != null) 
    mfragmentCommunicator.passDataToFragment(Pass your string here) 
    } 

then make your fragement implement this interface like 

public class someFragment extends Fragment implements FragmentCommunicator 
{ 
//this is your rest of the fragment 

@Override 
public void passDataToFragment(String somevalue) 
{ 
//This function will get fired each time your text is changed since in your activity you are calling this same function in your textchange listener. the String somevalue will be the string that you passed from your activity 


} 

//rest of the code 
. 
. 
. 
//Don't forget to initialize your interface in fragment itself. Do this in your onAttach 
like this 
@Override 
public void onAttach(Activity activity){ 
    super.onAttach(activity); 
    context = getActivity(); 

    ((MainActivity)context).fragmentCommunicator = this; 
} 

} 

} 

你可以參考任何進一步的澄清this鏈接。只檢查碎片通信器的實現

+0

我試了很多次,但它不能工作.....讓我知道我從哪裏設置? 我已經在TestBedDSLV.java文件中實現了搜索,我必須從TestBedDSLV.java中設置它,我已經做了很多次但它不能工作....我認爲這個setListAdapter只能在DSLV中設置一次 – Jayesh 2013-04-17 10:52:15

+0

setListAdapter只是因爲這個類擴展了ListFragment。如果將其擴展爲片段,則可以使用setadapter。沒有什麼區別。總而言之,您總是可以在活動和片段之間創建一個接口,以直接在片段本身中刷新您的視圖。 – 2013-04-17 14:09:45

+0

我剛剛讀到這個問題,當這個getData()方法被調用時,只有當活動開始時?我在搜索時如何發送數據? – Jayesh 2013-04-18 07:12:55

1

如果您使用數組作爲適配器的基本數組列表,請更新此數組並調用adapater.notifyDataSetChanged()。這將會更新DSLV,因爲我在我的一個項目中使用了相同的方法。

+0

我嘗試了很多次兄弟,但它不適合我......這不是一個小問題.... – Jayesh 2013-04-18 11:56:03