2017-09-08 3 views
3

私はアダプタで作業していて、notifydatasetchangedで更新しようとしました。しかし、私が直面している問題は、リストビューで変更が行われていることがわかるアダプタを正常に更新した後、他のフラグメントから戻った後に以前のデータに戻ってしまうことです。私は、アダプターが問題を引き起こす同じデータで変換ビューを再利用すると聞いたことがありますが、これを修正する方法はわかりません。私は答えを探しましたが、ほとんどの答えがすべて新しいアダプターを宣言していたのと同じようなものは見つかりませんでした。私の質問があり、NotifyDataSetChangedについて

public class DialogListAdapter extends BaseAdapter { 
Context context; 
private ImageLoader imageLoader; 
private static LayoutInflater inflater; 
private ArrayList<HashMap<String, Object>> member_list; 
private ArrayList<HashMap<String, Object>> member_list2; 
private SparseBooleanArray mSelectedItemsIds; 
private ArrayList<Integer> selectedItemPosition; 
//private static final int droidGreen = Color.parseColor("#A4C639"); 
//private BadgeView badge; 
Resources res; 
String sorting; 

public DialogListAdapter(Context c, 
         ArrayList<HashMap<String, Object>>content, String temp_sorting) { 

    inflater=(LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.context=c; 
    this.member_list = content; 

    this.member_list2 = new ArrayList<>(); 
    this.member_list2.addAll(this.member_list); 

    res=c.getResources(); 

    this.sorting = temp_sorting; 
    mSelectedItemsIds = new SparseBooleanArray(); 
    selectedItemPosition = new ArrayList<>(); 

} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return member_list.size(); 
} 

@Override 
public HashMap<String, Object> getItem(int position) { 
    // TODO Auto-generated method stub 
    return member_list.get(position); 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

public void update(ArrayList<HashMap<String,Object>> obj) { 
    member_list2.clear(); 
    member_list2.addAll(obj); 
    notifyDataSetChanged(); 
} 

public final class DialogListItem{ // view holder 
    public TextView read_count; 
    public TextView nameView; 
    public TextView numberView; 
    public TextView statusView; 
    public ImageView thumb_image; 
    public TextView timeView; 
    public TextView senderView; 
    public ImageView tick; 
    //public BadgeView badge; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    int index; 

    if(sorting.equals("D")){ 
     index = member_list.size()-position-1; 
    }else{ 
     index = position; 
    } 

    View row = convertView; 
    DialogListItem dialogItem=null; 
    String textbuff_time = null; 
    String textbuff_mess = null; 
    String textbuff_sender = null; 
    if (convertView==null){ 
     row=inflater.inflate(R.layout.dialog_list_single, null); 
     dialogItem=new DialogListItem(); 
     dialogItem.read_count=(TextView)row.findViewById(R.id.readcount); 
     dialogItem.nameView=(TextView)row.findViewById(R.id.member_name); 
     dialogItem.numberView=(TextView)row.findViewById(R.id.tab2number); 
     dialogItem.statusView=(TextView)row.findViewById(R.id.tab2status); 
     dialogItem.thumb_image=(ImageView)row.findViewById(R.id.tab2image); 
     dialogItem.timeView=(TextView) row.findViewById(R.id.tab2date); 
     dialogItem.senderView=(TextView) row.findViewById(R.id.tab2sender); 
     dialogItem.tick = (ImageView) row.findViewById(R.id.tick); 
     row.setTag(dialogItem); 
    } 
    else{ 
     dialogItem=(DialogListItem) row.getTag(); 
    } 

    if (mSelectedItemsIds.get(position)) { 
     row.setBackgroundColor(context.getResources().getColor(R.color.item_selected)); 
    } else { 
     row.setBackgroundColor(context.getResources().getColor(R.color.item_unselected)); 
    } 

    HashMap<String,Object>items; 
    items=member_list.get(index); 
    dialogItem.nameView.setText((String)items.get(DBhelper.MEMBER_NAME)); 
    dialogItem.nameView.setTypeface(null,Typeface.BOLD); 
    dialogItem.nameView.setSingleLine(true); 
    dialogItem.nameView.setMaxLines(1); 
    dialogItem.nameView.setEms(13); 
    dialogItem.nameView.setEllipsize(TruncateAt.END); 
    dialogItem.numberView.setText((String)items.get(DBhelper.MEMBER_NUMBER)); 
    String textbuff=(String)items.get(DBhelper.MEMBER_LMESSAGE); 
    if (!TextUtils.isEmpty(textbuff)){ 
     textbuff_time=textbuff.substring(0, 19); 
     textbuff_mess=textbuff.substring(20); 
     int bound=textbuff_mess.indexOf("½"); 
     if(bound!=-1){ 
      textbuff_sender=textbuff_mess.substring(0,bound); 
      textbuff_mess=textbuff_mess.substring(bound+2); 
     } 
     else 
      textbuff_sender=""; 

     dialogItem.statusView.setText(textbuff_mess); 

     if (textbuff_sender.equals(context.getResources().getString(R.string.myself))) { 
      dialogItem.senderView.setVisibility(View.GONE); 
      dialogItem.tick.setVisibility(View.VISIBLE); 
     } else { 
      textbuff_sender = textbuff_sender + ": "; 
      dialogItem.senderView.setVisibility(View.VISIBLE); 
      dialogItem.senderView.setText(textbuff_sender); 
      dialogItem.tick.setVisibility(View.GONE); 
     } 

     try { 
      dialogItem.timeView.setText(Utility.relativeTime(row.getContext(), textbuff_time)); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
    else{ 
     dialogItem.statusView.setText(""); 
     dialogItem.senderView.setText(""); 
     dialogItem.timeView.setText("---"); 
    } 

    dialogItem.statusView.setTextColor(Color.GRAY); 
    dialogItem.statusView.setTypeface(null,Typeface.NORMAL); 
    dialogItem.timeView.setTextColor(Color.GRAY); 
    dialogItem.timeView.setTypeface(null,Typeface.NORMAL); 
    dialogItem.senderView.setTextColor(Color.GRAY); 
    dialogItem.senderView.setTypeface(null,Typeface.NORMAL); 
    dialogItem.senderView.getPaint().setTextSkewX(-0.25f); 

    String sformat=" "+String.valueOf(items.get(DBhelper.MEMBER_SIZE))+" "; 
    dialogItem.read_count.setText(sformat); 
    int badge_number=(Integer)items.get(DBhelper.MEMBER_SIZE); 
    if(badge_number>0){ 

     dialogItem.read_count.setVisibility(View.VISIBLE); 
     dialogItem.statusView.setTextColor(Color.BLACK); 
     dialogItem.statusView.setTypeface(null,Typeface.BOLD); 
     dialogItem.timeView.setTextColor(Color.BLACK); 
     dialogItem.timeView.setTypeface(null,Typeface.BOLD); 
     dialogItem.senderView.setTextColor(Color.BLACK); 
     dialogItem.senderView.setTypeface(null,Typeface.BOLD); 
     dialogItem.senderView.getPaint().setTextSkewX(-0.25f); 
    } 
    else{ 
     dialogItem.read_count.setVisibility(View.GONE); 
    } 

    StringBuffer link=new StringBuffer(Register.get_current_server_address()); 
    if(items.get(DBhelper.MEMBER_TYPE).equals(res.getString(R.string.broadcast_chat))){ 
     dialogItem.nameView.setTextColor(row.getResources().getColor(R.color.tab4_title)); 
     link.append("uniappSystemFile.asp"); 
     link.append("?file=").append("broadcast.png"); 
     //imageLoader.DisplayImage(link.toString(), dialogItem.thumb_image); 
     Picasso.with(context).load(link.toString()).transform(new CircleTransform()).resize(200,200).into(dialogItem.thumb_image); 
     dialogItem.read_count.setVisibility(View.GONE); // disable broadcast badge 
    } 
      Picasso.with(context).load(R.drawable.ic_contact).resize(200,200).into(dialogItem.thumb_image); 
      Picasso.with(context).load(R.drawable.ic_notif).resize(200, 200).into(dialogItem.thumb_image); 
     }else{ 
      link2 = new IMService(context.getApplicationContext()).group_image_thumb_get(tab2.myphone, (String) items.get(DBhelper.MEMBER_NUMBER)); 
      dialogItem.nameView.setTextColor(row.getResources().getColor(R.color.tab3_title)); 
      //imageLoader.DisplayImage(link2, dialogItem.thumb_image); 
      Picasso.with(context).load(link2).transform(new CircleTransform()).resize(200, 200).placeholder(R.drawable.ic_group_circle_black_48dp).error(R.drawable.ic_group_circle_black_48dp).into(dialogItem.thumb_image); 
     } 
    } 

public void setSearchPattern(String pattern) { 
    filterListByPattern(pattern.trim()); 
    this.notifyDataSetChanged(); 
} 

private void filterListByPattern(String searchPattern) { 

    member_list.clear(); 
    for (HashMap<String,Object> info : member_list2) { 
     boolean add = true; 
     do { 
      if (searchPattern == null || searchPattern.equals("")) { 
       break; 
      } 
      if (info.get(DBhelper.MEMBER_NAME).toString().toLowerCase().contains(searchPattern)) { 
       break; 
      } 
      add = false; 
     } while (false); 
     if (add) { 
      member_list.add(info); 
     } 
    } 
} 

public void resetList() { 
    this.member_list2 = new ArrayList<HashMap<String,Object>>(); 
    this.member_list2.addAll(this.member_list); 
    this.notifyDataSetChanged(); 
} 

public void remove(Object object) { 
    member_list.remove(object); 
    notifyDataSetChanged(); 
} 

public void toggleSelection(int position) { 
    selectView(position, !mSelectedItemsIds.get(position)); 
} 

public void removeSelection() { 
    mSelectedItemsIds = new SparseBooleanArray(); 
    selectedItemPosition = new ArrayList<>(); 
    notifyDataSetChanged(); 
} 

public void selectView(int position, boolean value) { 
    if (value) { 
     mSelectedItemsIds.put(position, value); 
     selectedItemPosition.add(position); 
    } else { 
     mSelectedItemsIds.delete(position); 
     selectedItemPosition.remove(selectedItemPosition.indexOf(position)); 
    } 
    notifyDataSetChanged(); 
} 

public int getSelectedCount() { 
    return mSelectedItemsIds.size(); 
} 

public SparseBooleanArray getSelectedIds() { 
    return mSelectedItemsIds; 
} 

public ArrayList<Integer> getItemPosition() { 
    return selectedItemPosition; 
} 

}

だから、フラグメントで

1.refresh方法

public void toggleRefreshInBackground(ArrayList<HashMap<String, Object>> list) { 
    dialog_list.clear(); 
    dialog_list.addAll(list); 
    adapter.update(list); 
} 

2.getView()私のアダプタの:以下 は、私のコードの一部です。なぜ私のアダプタとリストビューは、私がこのフラグメントに他のフラグメントから戻った後に古いデータを表示するのでしょうか?これを修正する方法は?

P.S.私はそれが動作します知っているが、それは重い操作だとあなたも宣言した後notifyDataSetChangedを使用する必要はありませんので、それが良いと適切なアプローチではありません。この

adapter = new MyAdapter(list); 
adapter.notifyDataSetChanged(); 

のような新しいアダプタを宣言するために私に教えないでください新しいアダプタ。

感謝

+0

リストビューの代わりにリサイクルビューを使用してみませんか? – Anonymous

+0

@Anonymousしかし、recyclerviewとリストビューの違いは何ですか?私はまだアダプターが必要とそれに変更を加える –

+0

リサイクルビューのホルダーを見ることはリストビューよりも大幅に強化されています。アダプター全体を投稿する方法はありません。コードを分析するのは簡単です – Anonymous

答えて

0

はあなたのフラグメント内setRetainInstance(true); を入れてみてください。断片のonpause()内の上部に

宣言Parcelable state;

保存リストビュー状態、state = listview.onSaveInstanceState();または手動断片を変え -

上記のように以下onSaveInstanceState()と試みる次に動作しない場合。 次に、onCreateViewチェックstateがnullかどうかを確認します。 nullは、アダプタを設定した場合、一方

listview.onRestoreInstanceState(state); 

を設定していない場合は/あなたがフラグメントをロードするたびに、ArrayListのは、空のオフを開始します、データを取得します。したがって、データを保存する際には注意が必要です。

関連する問題