вызовите notifyondatasetchanged() из другого адаптера

Возможный дубликат:
Есть ли способ вызвать notifyDataSetChanged() из основного действия для пользовательского адаптера элемента внутри другого пользовательского адаптера?

у меня есть два адаптера listarray A и B. «A» содержит несколько кнопок, которые при нажатии должны обрабатывать данные, присутствующие в «B», а затем уведомлять адаптер «B» о том, что произошли некоторые изменения, так что «B» обновляется и отображает новые данные . Я вижу, что эта проблема задавалась ранее -custom">здесь в SO. Но решение не дает адекватной информации.

Спасибо за решение... Я попытался реализовать это, но он не распознает, какая кнопка была нажата (он рассматривает весь список как один объект). Кроме того, он также не обновляет содержимое списка, хотя я пытался сохранить сортировку по умолчанию.

    headerListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View v, int arg2,
                    long arg3) {
                sorter = new TwoWaySorter();
                Message msg = new Message();

                Log.i("Click","arg0.getId():"+arg0.getId());
                Log.i("Click", v.getId() + " id is " + v.toString());
                Log.i("Click","arg2:"+arg2+" arg3:"+arg3);
                switch (v.getId()) {

                case R.id.headerList_quantity: // perform sort over the quantity
                    Log.i("Click", "qty clicked");
                    System.out.println("..Item is clicked..");
                    msg.what = UPDATE_QTY;
                    updateListHandler.sendMessage(msg);
                    //sorter.sortBasedOn(contentList, "symQty");
                    //contentAdapter.notifyDataSetChanged();
                    break;
                case R.id.headerList_price: // perform sort over price
                    Log.i("Click", "list price clicked");
                    msg.what = UPDATE_PRICE;
                    updateListHandler.sendMessage(msg);

                    //sorter.sortBasedOn(contentList, "price");
                    //contentAdapter.notifyDataSetChanged();

                    break;
}
}});


 private Handler updateListHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                case UPDATE_LIST:
                    sorter = new TwoWaySorter();
                    Log.i("Click", "sort based on priceYesterday");
                    sorter.sortBasedOn(contentList, "priceYesterday");
                    contentAdapter.notifyDataSetChanged();
                    break;

                }

            }};

Кроме того, на всякий случай вы хотите увидеть адаптер. Обратите внимание, что для TextView установлено значение setClickable="true"

public class HeaderAdapter extends ArrayAdapter<Header>  {
final Header[] listSymbols;
private TwoWaySorter sorter;
private Vector<Content> contentList;
//private ArrayAdapter<Content> contentAdapter;

public HeaderAdapter(Context context, int symResourceID, Header[] objects,
        Vector<Content> contentList, ArrayAdapter<Content> contentAdapter) {
    super(context, symResourceID, objects);
    listSymbols = objects;
    sorter = new TwoWaySorter();
    this.contentList = contentList;
    //this.contentAdapter = contentAdapter;

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    if (row == null) {
        LayoutInflater inflater = (LayoutInflater) getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.twoway_header_right, parent, false);
    }
    Header headerRec = listSymbols[position];

    TextView symQty = (TextView) row.findViewById(R.id.headerList_quantity);
    symQty.setText("" + headerRec.symQty);
    Log.i("Click","symQty id"+symQty.getId());
    //symQty.setOnClickListener(this);

    TextView symPx = (TextView) row.findViewById(R.id.headerList_price);
    symPx.setText("" + headerRec.price);
    Log.i("Click","symPx id"+symPx.getId());
    //symPx.setOnClickListener(this);

    TextView symPxC = (TextView) row
            .findViewById(R.id.headerList_priceChange);
    symPxC.setText("" + headerRec.priceYesterday);
//  symPxC.setOnClickListener(this);

    TextView symVal = (TextView) row.findViewById(R.id.headerList_value);
    symVal.setText("" + headerRec.daysGain);
//  symVal.setOnClickListener(this);

    TextView symValC = (TextView) row
            .findViewById(R.id.headerList_valueChange);
    symValC.setText("" + headerRec.daysGainPercent);
//  symQty.setOnClickListener(this);

    TextView symValCP = (TextView) row
            .findViewById(R.id.headerList_valueChangePercent);
    symValCP.setText("" + headerRec.change);
//  symQty.setOnClickListener(this);

    TextView symQuote = (TextView) row.findViewById(R.id.headerList_quote);
    symQuote.setText("" + headerRec.week52High);
//  symQty.setOnClickListener(this);

    row.setBackgroundColor(R.color.light_gray);
    return row;
}

/*@Override
public void onClick(View v) {
    Log.i("Click", v.getId() + " " + v.toString());
    switch (v.getId()) {

    case R.id.headerList_quantity: // perform sort over the quantity
        Log.i("Click", "qty clicked");
        sorter.sortBasedOn(contentList, "symQty");
        MainActivity.contentAdapter.notifyDataSetChanged();
        break;
    case R.id.headerList_price: // perform sort over price
        Log.i("Click", "list price clicked");

        sorter.sortBasedOn(contentList, "price");
        MainActivity.contentAdapter.notifyDataSetChanged();

        break;
    case R.id.headerList_priceChange: // perform sort over price change
        sorter.sortBasedOn(contentList, "priceYesterday");
        MainActivity.contentAdapter.notifyDataSetChanged();

        Log.i("Click", "price change clicked");

        break;
    case R.id.headerList_value:
        Log.i("Click", "list value clicked");

        sorter.sortBasedOn(contentList, "change");
        MainActivity.contentAdapter.notifyDataSetChanged();

        break;
    case R.id.headerList_valueChange:
        Log.i("Click", "value change clicked");

        sorter.sortBasedOn(contentList, "daysGain");
        MainActivity.contentAdapter.notifyDataSetChanged();

        break;
    case R.id.headerList_valueChangePercent:
        Log.i("Click", "change percent clicked");

        sorter.sortBasedOn(contentList, "daysGainPercent");
        MainActivity.contentAdapter.notifyDataSetChanged();

        break;
    case R.id.headerList_quote:
        Log.i("Click", "return clicked");

        sorter.sortBasedOn(contentList, "returns");
        MainActivity.contentAdapter.notifyDataSetChanged();

        break;
    //}

*/ //} }


person i_raqz    schedule 30.06.2011    source источник


Ответы (1)


Используйте концепцию обработчика. Если вы нажмете на любой элемент списка1, вызовите обработчик для обновления списка2.

Пример примера для обновления любого списка

import java.util.ArrayList;

import android.app.ListActivity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MyListView extends ListActivity {
    ArrayList<String> pens = new ArrayList<String>();
    ArrayAdapter arrayAdapter = null;
    private static final byte UPDATE_LIST = 100;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        pens.add("MONT Blanc");
        pens.add("Gucci");
        pens.add("Parker");

        arrayAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, pens);
        setListAdapter(arrayAdapter);

        getListView().setTextFilterEnabled(true);
        ListView lv = getListView();

        lv.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                System.out.println("..Item is clicked..");
                Message msg = new Message();
                msg.what = UPDATE_LIST;
                updateListHandler.sendMessage(msg);
            }
        });



        // System.out.println("....g1..."+PhoneNumberUtils.isGlobalPhoneNumber("+912012185234"));
        // System.out.println("....g2..."+PhoneNumberUtils.isGlobalPhoneNumber("120121852f4"));

    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub

        super.onConfigurationChanged(newConfig);
        System.out.println("...11configuration is changed...");
    }

    void addMoreDataToList() {
        pens.add("item1");
        pens.add("item2");
        pens.add("item3");

    }

    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Object o = this.getListAdapter().getItem(position);
        String pen = o.toString();
        Toast.makeText(this, id + "You have chosen the pen: " + " " + pen,
                Toast.LENGTH_LONG).show();
    }

    private Handler updateListHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case UPDATE_LIST:
                addMoreDataToList();
                arrayAdapter.notifyDataSetChanged();
                break;

            }
            ;
        };
    };




}
person Sunil Kumar Sahoo    schedule 30.06.2011
comment
@Sunil.. спасибо за это, но я все еще не могу его использовать. Пожалуйста, проверьте вопрос, потому что я добавил то, что реализовал на основе предоставленного вами решения. Спасибо - person i_raqz; 30.06.2011