2013-04-09 110 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