2016-04-13 9 views
10

मेरे पास आइटम बच्चे के अंदर edittext है। फिर, मैंने इस edittext के अंदर एक टेक्स्ट दर्ज किया, लेकिन जब भी मैं अन्य expandablelistview शीर्षलेख पर क्लिक करता हूं, तो मेरे द्वारा दर्ज किया गया टेक्स्ट गायब हो जाता है।ExpandableListView के अंदर EditText सामग्री अगले ExpandableListView शीर्षलेख पर क्लिक करते समय गायब हो जाती है

मैंने पहले से ही मेरे Manifest.xml और कई अन्य संभावित सुधारों के अंदर android:windowSoftInputMode="adjustPan" का उपयोग किया है, लेकिन काम नहीं किया है।

यह मेरा एडाप्टर है:

public class ExpendableAdapter extends BaseExpandableListAdapter { 
    private Context _context; 
    private List<String> _listDataHeader; 
    private HashMap<String, List<ExpandItemModel>> _listDataChild; 

public ExpendableAdapter(Context context, List<String> listDataHeader, 
          HashMap<String, List<ExpandItemModel>> listChildData) { 
    this._context = context; 
    this._listDataHeader = listDataHeader; 
    this._listDataChild = listChildData; 
} 

@Override 
public Object getChild(int groupPosition, int childPosititon) { 
    return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
      .get(childPosititon); 
} 

@Override 
public long getChildId(int groupPosition, int childPosition) { 
    return childPosition; 
} 

@Override 
public View getChildView(final int groupPosition, final int childPosition, 
         boolean isLastChild, View convertView, ViewGroup parent) { 

    final ExpandItemModel childText = (ExpandItemModel) getChild(groupPosition, childPosition); 

    if (convertView == null) { 
     LayoutInflater infalInflater = (LayoutInflater) this._context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = infalInflater.inflate(R.layout.list_item, null); 
    } 

    final EditText etTotal = (EditText)convertView 
      .findViewById(R.id.et_total); 

    etTotal.setText(childText.getTotal); 

    return convertView; 
} 

@Override 
public int getChildrenCount(int groupPosition) { 
    return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
      .size(); 
} 

@Override 
public Object getGroup(int groupPosition) { 
    return this._listDataHeader.get(groupPosition); 
} 

@Override 
public int getGroupCount() { 
    return this._listDataHeader.size(); 
} 

@Override 
public long getGroupId(int groupPosition) { 
    return groupPosition; 
} 

@Override 
public View getGroupView(int groupPosition, boolean isExpanded, 
         View convertView, ViewGroup parent) { 
    String headerTitle = (String) getGroup(groupPosition); 
    if (convertView == null) { 
     LayoutInflater infalInflater = (LayoutInflater) this._context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = infalInflater.inflate(R.layout.list_group, null); 
    } 



    TextView tvHeader = (TextView) convertView 
      .findViewById(R.id.tv_header); 
    tvHeader.setTypeface(null, Typeface.BOLD); 
    tvHeader.setText(headerTitle); 

    return convertView; 
} 

@Override 
public boolean hasStableIds() { 
    return true; 
} 


@Override 
public boolean isChildSelectable(int groupPosition, int childPosition) { 
    return true; 
} 
} 

और यह लेआउट है:

<RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/rl_expen_but" 
     android:layout_below="@+id/rl_ats_draft2" 
     android:layout_above="@+id/selanjutnya" 
     > 



     <ExpandableListView 
      android:background="@color/cardview_light_background" 
      android:id="@+id/lvExp" 
      android:descendantFocusability="beforeDescendants" 
      android:layout_height="wrap_content" 
      android:layout_width="match_parent" 
      android:animateLayoutChanges="true"/> 

     <View 
      android:layout_below="@+id/lvExp" 
      android:layout_width="match_parent" 
      android:layout_height="1dp" 
      android:background="#bebebe"/> 

    </RelativeLayout> 

वहाँ कुछ गड़बड़ मैं ऊपर कोड के साथ किया था है? धन्यवाद।

संपादित करें:

यह कैसे मेरे कोड के रूप में chandil03 ने सुझाव दिया करने के बाद उस संपादित की तरह लग रहा है। जब मैं हेडर का विस्तार करता हूं तो विस्तार योग्यसूचीदृश्य अब रीफ्रेश नहीं होता है। लेकिन आश्चर्यजनक रूप से, जब मैंने ग्रुपपॉजिशन 0 और बाल स्थिति 0 पर एडिटेक्स्ट में मूल्य टाइप किए, तो अलग-अलग गौपोज़िशन और शिशुओं में कुछ अन्य संपादनों में मैंने पिछले संस्करण में टाइप किए गए वही सटीक मान दिखाई दिए। या यहां तक ​​कि अजनबी, पिछले संपादन पर मूल्य कभी-कभी असंतुष्ट हो जाते हैं।

static class ViewHolder { 
    protected View et; 

    public void addView(View et){ 
     this.et = et; 
    } 
} 

     @Override 
     public View getChildView(final int groupPosition, final int childPosition, 
        boolean isLastChild, View convertView, ViewGroup parent) { 

     final ExpandItemModel childText = (ExpandItemModel) getChild(groupPosition, childPosition); 

     ViewHolder viewHolder; 

     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.list_item, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.addView(convertView 
       .findViewById(R.id.et_total)); 
      convertView.setTag(viewHolder); 
     }else{ 
      viewHolder = (ViewHolder)convertView.getTag(); 
     } 

     final EditText etTotal = (EditText)convertView 
     .findViewById(R.id.et_total); 

     etTotal.setText(childText.getTotal); 

     return convertView; 
    } 

उत्तर

1

मैं इस पुस्तकालय का उपयोग करके इस संभाल करने के लिए अंत में सक्षम:

http://bignerdranch.github.io/expandable-recycler-view/

फिर AddTextChangedListener का उपयोग करके, मैं मूल्य मैं टाइप डाला। उसके बाद, ViewHolderChild पर डाले गए मानों की जांच करें। उदाहरण के लिए:

public void bind(final MyModel model) { 
      tvName.setText(model.getName()); 
      tvPrice.setText(model.getPrice()); 
      tvNote.setText(model.getNote()); 

      for(int i=0;i<listProduct.size();i++){ 
       if(listProduct.get(i).getIdProduct().equals(model.getIdProduct())){ 
        et.setText(listProduct.get(i).getQuantity()); 
        break; 
       } 
      } 

      et.addTextChangedListener(new TextWatcher() { 
       @Override 
       public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

       } 

       @Override 
       public void onTextChanged(CharSequence s, int start, int before, int count) { 

       } 

       @Override 
       public void afterTextChanged(Editable s) { 
        if(m!=null){ 
         listProduct.remove(m); 
        } 

        if (!s.toString().equals("")) { 

         m = new MyModel(); 
         m.setName(model.getName()); 
         m.setNote(model.getNote()); 
         m.setIdProduct(model.getIdProduct()); 
         m.setPrice(model.getPrice()); 
         m.setQuantity(s.toString()); 
         m.setSubtotal(Long.parseLong(s.toString()) * Long.parseLong(model.getPrice()) + ""); 
         m.setStock(model.getStock()); 
         listProduct.add(m); 
        } 
       } 
      }); 
     } 
3

जब भी आप किसी अन्य समूह सूची को रीफ्रेश करते हैं और आपको संपादन टेक्स्ट का एक अन्य उदाहरण मिलता है जिसमें कोई टेक्स्ट नहीं होता है। आपके द्वारा टेक्स्ट में दर्ज किए गए संपादन टेक्स्ट में groupView का बच्चा बन जाएगा।

तो मैं आपको एक व्यूहोल्डर कक्षा बनाने और इसे देखने के लिए अनुशंसा करता हूं और इसे एक टैग के रूप में सेट करता हूं और getView() में जांच करता हूं कि convertView शून्य है कि आप पहले से ही कर चुके हैं। बस convertView से अन्य भाग जोड़ें और getTag जोड़ें और तदनुसार मान सेट करें।

उदाहरण के लिए:

@Override 
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) 
    { 
     View v = convertView; 
     if (v == null) 
     { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = inflater.inflate(R.layout.my_layout, parent, false); 
      ViewHolder holder = new ViewHolder(); // View holder to save views. 
      holder.addView(v.findViewById(R.id.myView)); 
      v.setTag(holder); 
     } 
     else{ 
     ViewHolder holder = (ViewHolder) v.getTag(); // get tag and set values 
     // Do whatever you need to with the group view 
     } 
     return v; 
    } 

संपादित करें 1

मैं अपने को संशोधित किया है। टिप्पणियां भी देखें।

@Override 
    public View getChildView(final int groupPosition, final int childPosition, 
          boolean isLastChild, View convertView, ViewGroup parent) { 

     final ExpandItemModel childText = (ExpandItemModel) getChild(groupPosition, childPosition); 
     ViewHolder holder; 
     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this._context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.list_item, null); 
      holder = new ViewHolder(convertView); 
      convertView.setTag(holder); 
     }else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.editText.setText(childText.getTotal); // Here whatever you will type in edittext will be overwritten by the value of 'childText.getTotal'. So after you are done writing in edit text make sore you change that in "_listDataChild" list. 

     return convertView; 
    } 

    /**This is a class that holds view, Here i m not talking about support.v7.widget.RecyclerView.ViewHolder class. Though concept is more or less same.*/ 
    class ViewHolder{ 
     EditText editText; 

     public ViewHolder(View v) 
     { 
      editText = (EditText) v.findViewById(R.id.et_total); 
     } 
    } 

संपादित 2

getChildView() विधि में कोड निम्नलिखित जोड़ें।

holder.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() 
    { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) 
     { 
      if(!hasFocus) 
       childText.getTotal = holder.editText.getText().toString(); 
// In java variable contains reference of Object so when you change childText object, it will be reflected in same HashMap you are getting data from. 

     } 
    }); 
+0

मैंने कोशिश की और परिणाम वास्तव में विस्तार योग्य सूचीदृश्य रीफ्रेश नहीं हुआ। लेकिन आश्चर्यजनक रूप से, जब मैंने ग्रुपपॉजिशन 0 और बाल स्थिति 0 पर एडिटेक्स्ट में मूल्य टाइप किए, तो अलग-अलग गौपोज़िशन और शिशुओं में कुछ अन्य संपादनों में मैंने पिछले संस्करण में टाइप किए गए वही सटीक मान दिखाई दिए। या यहां तक ​​कि अजनबी, पिछले संपादन पर मूल्य कभी-कभी असंतुष्ट हो जाते हैं। ऐसा क्यों हुआ? –

+0

सूची दृश्य चक्र/इसे स्मृति को कुशल बनाने के लिए अपने विचारों का उपयोग करता है। इसलिए यदि आप setTag और getTag का उपयोग करके ViewHolder का उपयोग करके विचारों को संभाल नहीं रहे हैं। आपको इस समस्या का सामना करना पड़ेगा। आप एक से अधिक बच्चे में edittext का एक ही संदर्भ सेट कर रहे हैं, यही कारण है कि आपको यह समस्या है। अपने प्रश्न को अपने संशोधित कोड के साथ संपादित करें ताकि मैं देख सकूं। – chandil03

+0

मैंने अपना प्रश्न संपादित कर लिया है। अब मैं पूछना चाहता हूं कि एडाप्टर, ग्रुपव्यू या चाइल्डव्यू में कौन सा दृश्य है, जोल्डर, बसने(), और gettag() का उपयोग करना है? मैंने उन्हें दोनों का उपयोग किया लेकिन कुछ भी नहीं बदला। क्या आप मुझे ऊपर दिए गए कोड में holder.addview के बारे में बता सकते हैं? मुझे नहीं पता कि मैं सही तरीके से इसका उपयोग करता हूं या नहीं। –

1

EditText हर बार जब आप नीचे स्क्रॉल या ExpandableListView में एक और शीर्षक पर क्लिक पुनर्नवीनीकरण है।

आपकी सर्वश्रेष्ठ शर्त उपयोगकर्ता को आपके मॉडल ई में दर्ज पाठ को सहेजना होगा।छ: में फिर

public class DummyStatic { 
public static ArrayList<DummyModel> arl_static=new ArrayList(); 
} 

:

etTotal.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus) { 
       childText.setTotal(etTotal.getText().toString().trim()); 
      } 
     } 
    }); 
+0

मॉडल खुद ही पुनर्नवीनीकरण नहीं किया गया है और इसके मूल्य भी खो देते हैं? –

1

सबसे पहले इस तरह edittext से अपने डेटा को स्टोर करने के लिए एक डमी मॉडल वर्ग बनाने के लिए:

public class DummyModel { 
    String edt_field; 
    // 
    //And any other data you might want to store 
    // 
    public DummyModel(String field) 
    { 
     this.edt_field=field; 
    } 
} 

फिर अपने डाटा स्टोर करने के लिए एक स्थिर ArrayList बनाने आपकी एडाप्टर क्लास आपकी getChildView() विधि को इस तरह बदलती है:

@Override 
public View getChildView(final int groupPosition, final int childPosition, 
         boolean isLastChild, View convertView, ViewGroup parent) { 

    final ExpandItemModel childText = (ExpandItemModel) getChild(groupPosition, childPosition); 

    if (convertView == null) { 
     LayoutInflater infalInflater = (LayoutInflater) this._context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = infalInflater.inflate(R.layout.list_item, null); 
    } 

    final EditText etTotal = (EditText)convertView 
      .findViewById(R.id.et_total); 
    etTotal.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
      DummyStatic.arl_static.add(childPosition,new DummyModel(charSequence.toString())); 
     } 

     @Override 
     public void afterTextChanged(Editable editable) { 

     } 
    }); 

    etTotal.setText(childText.getTotal); 

    return convertView; 
} 

यह कोड क्या करने जा रहा है यह है कि जब आप संपादन में वर्ण टाइप करते हैं तो वे सरली सूची के अंदर डमीमोडेल ऑब्जेक्ट में संग्रहीत हो जाएंगे।

आपके द्वारा इस डेटा को प्राप्त कर सकते हैं:

String value = DummyStatic.arl_static.get(position).edt_field; 
संबंधित मुद्दे