Jayesh
Jayesh

Reputation: 3881

How to refresh the ListView in Drag-Sort ListView?

I have implement Drag-Sort ListView(DSLV) and LazyList together in my Project, I download the Demo LazyList and Drag-Sort ListView from github then integrate and modify as per my requirement ,

I use DSLV for drag and sort the items of ListView and LazyList for Displaying Image from URL, i just implement "Basic usage playground" from DSLV for drag and sort,

I have implement search in TestBedDSLV.java, but the problem is that when I search the Content from the list, but i can't update the list, i have tried notifyDataSetChanged method but it not works, generally we create new adapter and pass it to listview like lv.setAdapter(adapter) , but here they just set ListAdapter, so we cant do lv.setAdapter(adapter)

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

and other require class can be download from github link that i given above.....

Upvotes: 4

Views: 3376

Answers (2)

Passionate Androiden
Passionate Androiden

Reputation: 732

If you are using array as the base arraylist for adapter, just update this array and call adapater.notifyDataSetChanged(). This will update DSLV for sure as I have used same approach in one of my project.

Upvotes: 1

Parvaz Bhaskar
Parvaz Bhaskar

Reputation: 1367

Actually if you see your code closly there's a method that you have mention

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);
}

So as you said : "generally we create new adapter and pass it to listview like lv.setAdapter(adapter) , but here they just set ListAdapter, so we cant do lv.setAdapter(adapter)"

Can't you easily do this by easily generating an array based on your search and set it like the code ??

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

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

EDIT: I think you are asking the wrong question. Your main concern should be how to communicate between activity and fragments...since your search functionality is in activity and list is in fragment. So you need to setup an interface that basically passes on the search string to your fragment and there you can make an array and set it the same way you are doing right now.

Read this SO question and answer. In the answer you'll find one similar approach on passing data between activity and fragment.

Edit 2: Your main concern is to communicate from activity to fragment for this..declare an interface in your activity like this:

    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;
}

}

}

You can refer this link for any further clarifications. Check only the implementation of FragmentCommunicator

Upvotes: 1

Related Questions