2015-01-08 6 views
0

У меня есть ArrayList, который использует ArrayAdapter для отображения его данных списка в ListViewКак обновить ListView из класса ArrayAdapter?

Каждый элемент ListView имеет один TextView и кнопку. Щелчок по кнопке обновляет данные, хранящиеся в ArrayList, и это отлично работает. Как получить ListView для обновления одновременно? Я знаю, как это сделать из Activity, где создан ArrayAdapter, потому что я могу вызвать itemAdapter.notifyDataSetChanged(), чтобы обновить представление. Но я не вижу, как это сделать из класса ArrayAdapter (то есть ListItemAdapter), когда нажата кнопка myButton.

Любые идеи? Благодарю.

StartActivity Класс

public class StartActivity extends Activity { 

ArrayList<DataRecord> datalist; 
ListView listView; 
ListItemAdapter itemAdapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list_screen); 

    datalist = new ArrayList<DataRecord>(); 

    listView = (ListView) findViewById(R.id.ListViewId); 
    itemAdapter = new ListItemAdapter(this, android.R.layout.simple_list_item_1, datalist); 
    listView.setAdapter(itemAdapter); 

    DataRecord dataRecord = new DataRecord("Data Item 1 "); 
    datalist.add(dataRecord); 

    dataRecord = new DataRecord("Data Item 2 "); 
    datalist.add(dataRecord); 

    dataRecord = new DataRecord("Data Item 3"); 
    datalist.add(dataRecord); 

    itemAdapter.notifyDataSetChanged(); 
} 
} 

ListItemAdapter Класс

public class ListItemAdapter extends ArrayAdapter<DataRecord> { 
private ArrayList<DataRecord> datalist; 

public ListItemAdapter(Context context, int textViewResourceId, ArrayList<DataRecord> datalist) { 
    super(context, textViewResourceId, datalist); 
    this.datalist = datalist; 
} 

@Override 
public View getView(final int position, View convertView, final ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.list_row, null); 

    } 
    Button mybutton = (Button)v.findViewById(R.id.pushBtn); 

    final DataRecord dataitem = datalist.get(position); 

    mybutton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      dataitem.information = "Hello"; 
      for (int i = 0; i < datalist.size(); i++) { 
       Log.d("Item", datalist.get(i).information); // this shows the ArrayList gets updated 
      } 
     } 
    }); 


    if (dataitem != null) { 
     TextView listText = (TextView) v.findViewById(R.id.list_text); 

     if (listText != null) { 
      listText.setText(dataitem.information); 
     } 

    } 
    return v; 
} 
} 
+0

вы можете использовать 'notifyDataSetChanged' непосредственно в onClickListener – doodeec

ответ

3

Просто используйте тот же метод в адаптере, но без ссылки на объект, так как вы находитесь в контексте объекта

mybutton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     dataitem.information = "Hello"; 
     notifyDataSetChanged(); 
    } 
}); 
0

попробовать это

mybutton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
    // 
    //update data 
    // 
    this.notifyDataSetChanged(); 
    } 
}); 
0
mybutton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     dataitem.information = "Hello"; 
     ListItemAdapter.this.notifyDataSetChanged(); 
    } 
}); 
Смежные вопросы