Как обновить ListView в Drag-Sort ListView?

Я реализовал Drag-Sort ListView (DSLV) и LazyList вместе в своем проекте, я загружаю демо-версию LazyList и Drag-Sort ListView из github, затем интегрируйте и измените в соответствии с моим требованием,

Я использую DSLV для перетаскивания и сортировки элементов ListView и LazyList для отображения изображения из URL-адреса, я просто реализую «Основную игровую площадку» из DSLV для перетаскивания и сортировки,

У меня есть поиск в TestBedDSLV.java, но проблема в том, что когда я ищу содержимое из списка, но не могу обновить список, я пробовал метод notifyDataSetChanged, но он не работает, обычно мы создаем новый адаптер и передаем его для просмотра списка, как lv.setAdapter(adapter) , но здесь они просто устанавливают ListAdapter, поэтому мы не можем сделать 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>

введите здесь описание изображения

и другой требуемый класс можно скачать по ссылке github, которую я дал выше.....


person Jayesh    schedule 09.04.2013    source источник
comment
Вы вставили слишком много кода. Почему бы вам не попытаться сузить его до важных строк.   -  person asloob    schedule 09.04.2013
comment
Разговор дешевый. Покажи мне код.   -  person JJ86    schedule 12.04.2013
comment
я отправил код, пожалуйста, проверьте его....   -  person Jayesh    schedule 15.04.2013
comment
Некоторое время, если вы не инициализируете ArrayList, он сгенерирует исключение нулевого указателя. Сначала вы должны инициализировать ArrayList.   -  person TheLittleNaruto    schedule 17.04.2013


Ответы (2)


На самом деле, если вы внимательно посмотрите на свой код, есть метод, который вы упомянули

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

Итак, как вы сказали: «обычно мы создаем новый адаптер и передаем его в список, например lv.setAdapter(adapter) , но здесь они просто устанавливают ListAdapter, поэтому мы не можем сделать lv.setAdapter(adapter)»

Разве вы не можете легко сделать это, легко сгенерировав массив на основе вашего поиска и установив его как код ??

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

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

РЕДАКТИРОВАТЬ: Я думаю, вы задаете неправильный вопрос. Ваша главная забота должна заключаться в том, как общаться между активностью и фрагментами... поскольку ваша функция поиска находится в активности, а список - во фрагменте. Итак, вам нужно настроить интерфейс, который в основном передает строку поиска в ваш фрагмент, и там вы можете создать массив и установить его так же, как вы делаете сейчас.

Прочтите этот ТАК вопрос и ответ. В ответе вы найдете похожий подход к передаче данных между активностью и фрагментом.

Редактировать 2: Ваша главная задача - передать информацию от действия к фрагменту для этого. Объявите интерфейс в своей деятельности следующим образом:

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

}

}

Вы можете перейти по этой ссылке для получения дополнительных разъяснений. . Проверить только реализацию FragmentCommunicator

person Parvaz Bhaskar    schedule 17.04.2013
comment
Я пробовал это много раз, но это не сработало ..... дайте мне знать, где я это установил ?? У меня есть поиск в файле TestBedDSLV.java, и я должен установить его из TestBedDSLV.java, я делал это много раз, но это не сработает... Я думаю, что этот setListAdapter может установить только один раз в DSLV - person Jayesh; 17.04.2013
comment
setListAdapter существует только потому, что класс расширяет ListFragment. Если вы расширите его до фрагмента, вы можете использовать setadapter. Нет никакой разницы. В любом случае вы всегда можете создать интерфейс между активностью и фрагментом, чтобы обновить представление непосредственно в самом фрагменте. - person Parvaz Bhaskar; 17.04.2013
comment
Я только что прочитал этот вопрос SO, когда этот метод getData() вызывается, только когда начинается активность ?? как мы можем отправить данные, когда я делаю поиск ?? - person Jayesh; 18.04.2013
comment
у вас есть только один фрагмент или вы добавляете более одного? - person Parvaz Bhaskar; 18.04.2013
comment
давайте продолжим обсуждение в чате - person Jayesh; 18.04.2013
comment
не могли бы вы предоставить какое-либо демонстрационное приложение - person Jayesh; 19.04.2013
comment
извините, я не могу поделиться кодом .. вам придется попробовать самому .. с какими проблемами вы столкнулись? - person Parvaz Bhaskar; 19.04.2013
comment
я не очень хорошо разбираюсь в Fragment, поэтому прошу отдельную демонстрацию.... - person Jayesh; 20.04.2013
comment
Нет, я не решил эту проблему, поэтому я прошу у вас демонстрацию, чтобы я мог понять, как это работает, но я просто пытаюсь что-то еще..... в методе onTextChanged EditText я только что вызвал getSupportFragmentManager().beginTransaction ().replace(R.id.test_bed, getNewDslvFragment(), mTag).commitAllowingStateLoss(); и в методе setListAdpater - person Jayesh; 22.04.2013
comment
Это сработает, но требует много памяти, так как вы снова и снова запускаете весь фрагмент. Если вы обнаружите какие-то утечки памяти в своем проекте, я бы порекомендовал вернуться к этой концепции. Извините, я не могу показать вам демо, потому что код используется в живом приложении. - person Parvaz Bhaskar; 22.04.2013
comment
Реализация действительно проста... пример кода, который я разместил выше, в этом примере ваш фрагмент может быть DSLVFragment... на самом деле нет большой разницы между ListFragment и обычным фрагментом, оба одинаковы... поэтому вы можете использовать обратный вызов интерфейса каждый раз вызывать setListAdapter... и в вашем setListAdapter создавать массив в соответствии с полученной строкой. - person Parvaz Bhaskar; 22.04.2013
comment
developer.android.com/guide/components/fragments.html... Я рекомендую вам перейти по этой ссылке и прочитать ее еще раз, сравнивая ее с вашим собственным кодом. В нем также есть раздел об общении с активностью, прочитайте его, а также прочитайте ссылку, которую я разместил вам в ответе. - person Parvaz Bhaskar; 22.04.2013

Если вы используете массив в качестве базового массива для адаптера, просто обновите этот массив и вызовите adapater.notifyDataSetChanged(). Это точно обновит DSLV, так как я использовал такой же подход в одном из своих проектов.

person Passionate Androiden    schedule 18.04.2013
comment
я пробовал это так много раз, братан, но у меня это не работает.... это не маленькая проблема.... - person Jayesh; 18.04.2013