ユーザーが更新できるリストを持っていますが、listView
に関連付けられているアダプターでnotifyDataSetChanged()
が機能していません。フラグメントで使用しています。 Datbaseは更新されますが、Adpaterは更新されません。以下は私の実装です:
私の主な農場:
_public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myArrayList = new ArrayList<myList>();
myArrayList = Database.getSharedObject(getActivity()).getMyList();
if (myArrayList != null && myArrayList.size() > 0) {
adapter = new myListAdapter(getActivity(), 0, myArrayList);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.mainfragment, container, false);
myListView = (ListView) v.findViewById(R.id.my_list_view);
myListView.setOnItemClickListener(this);
if (adapter != null) {
myListView.setAdapter(adapter);
}
return v;
}
_
いくつかのナビゲーションプロセスリストが更新された後、onResume()
メソッドでデータベースから更新されたリストを取得し、ビューを更新しないnotifyDatasetChanged()
メソッドを呼び出しますが、DBの対応する配列は更新されます。
_@Override
public void onResume() {
super.onResume();
myArrayList = Database.getSharedObject(getActivity()).getMyList();
adapter.setItems (myArrayList);
adapter.notifyDataSetChanged();
}
_
MyListAdapter
_public class MyListAdapter extends ArrayAdapter<Message> {
private ArrayList<Message> myList;
/* Context */
private Context context;
public void setItems (ArrayList<Message> myList) {
this.myList = myList;
}
public MyListAdapter (Context context, int textViewResourceId, ArrayList<Message> myList) {
super(context, textViewResourceId, myList);
this.context = context;
this.myList = myList;
}
@Override
public View getView (int position, View v, ViewGroup parent) {
// Keeps reference to avoid future findViewById()
MyViewHolder viewHolder;
if (v == null) {
LayoutInflater li = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.list_row, parent, false);
viewHolder = new MyViewHolder();
viewHolder.txtImage = (ImageView) v.findViewById(R.id.message_icon);
viewHolder.txtMessage = (TextView) v.findViewById(R.id.message);
viewHolder.txtDate = (TextView) v.findViewById(R.id.date);
v.setTag(viewHolder);
} else {
viewHolder = (MyViewHolder) v.getTag();
}
Message myMessage = new Message();
myMessage = myList.get(position);
if (myMessage != null) {
viewHolder.txtMessage.setText(myMessage.getText());
viewHolder.txtDate.setText(myMessage.getDate());
}
return v;
}
static class MyViewHolder {
ImageView txtImage;
TextView txtMessage;
TextView txtDate;
}
}
_
何が問題になっているのかについての考えはありますか?リストビューが更新されないのはなぜですか?どんな助けでもありがたいです。
notifyDataSetChanged()
は機能しません。理由
常に新しいリストを作成してアダプタに追加します。次のようにします。グローバルに宣言しながら、ArrayListを初期化します。
ArrayList<myList> myArrayList=new ArrayList<myList>();
//グローバル変数として
Nullおよび空の条件をチェックせずに、リストをアダプターに直接追加します。アダプターをリストに直接設定します(条件を確認しないでください)
myListView.setAdapter(adapter);
常にmyArrayListにデータを追加します(データが完全に新しい場合は、実際にリストにデータを追加する前にadapter.clear()およびmyArrayList.clear()を呼び出すことができます)が、アダプターを設定しないでください。つまり、新しいデータがmyArrayListにadapter.notifyDataSetChanged()
だけでなく
_adapter = new myListAdapter(getActivity(), 0, myArrayList);
_
この行を削除
adapter.setItems (myArrayList);
GetCountメソッドをオーバーライドするだけ
@Override
public int getCount() {
return myArrayList.count();
}
SetItemsメソッドで、古いArrayListをクリアしてみてください。
これの代わりに:
public void setItems(ArrayList<Message> myList) {
this.myList = myList;
}
これを試して:
public void setItems(ArrayList<Message> myList) {
this.myList.clear();
this.myList.addAll(myList);
notifyDataSetChanged();
}
問題はMyListAdapterのコンストラクターにあります
の代わりに
_public MyListAdapter(Context context, int textViewResourceId, ArrayList<Message> myList) {
super(context, textViewResourceId, scheduledMessageList);
this.context = context;
this.myList = myList;
}
_
試す
_public MyListAdapter(Context context, int textViewResourceId, ArrayList<Message> myList) {
super(context, textViewResourceId, myList);
this.context = context;
this.myList = myList;
}
_
また、メソッドsetItemsを所有する代わりに、adapter.clear();
の後にadapter.addAll(myArrayList);
を呼び出す必要があります。