2016-06-12 13 views
0

In der Hauptklasse habe ich einen ListView und einen EditText. Die ListView verwendet einen benutzerdefinierten BaseAdapter und enthält mehrere Elemente, die pro Zeile angezeigt werden. Ich möchte wie ein TextWatcher verwenden, mit dem ich eine Nummer in den EditText eingeben kann und diese Eingabe wird unter einem der Elemente der ListView angezeigt.EditText aktualisiert Elemente in ListView mit TextWatcher

Bitte unten einige Teile meiner Codes sehen, um meine Frage besser zu erklären.

Hauptklasse:

... 
etAmount = (EditText) findViewById(R.id.edt_text); 
lvDisplay = (ListView) findViewById(R.id.listView_display); 
... 
CustomAdapter adapter = new CustomAdapter(this, menuList, new CustomAdapter.onDoneClick() { 
    @Override 
    public void onClick(View v, int position) {} 
    }); 
lvDisplay.setAdapter(adapter); 
... 

CustomAdapter Klasse:

... 
public CustomAdapter(Context context, List<MenuModel> objects, onDoneClick listener) { 
    this.context = context; 
    this.menuList = objects; 
    this.mListener = listener; 
} 

public interface onDoneClick{ 
    void onClick(View v, int position); 
} 

@Override 
public int getCount() { 
    return menuList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return menuList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    View view = convertView; 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    if (view == null) { 
     holder = new ViewHolder(); 
     view = inflater.inflate(R.layout.item_layout, parent, false); 
     holder.tvFirst = (TextView) view.findViewById(R.id.item1); 
     holder.tvSecond = (TextView) view.findViewById(R.id.item2); 
     holder.tvThird = (TextView) view.findViewById(R.id.item3); 
    } else { 
     holder = (ViewHolder) view.getTag(); 
    } 

    final MenuModel item = menuList.get(position); 

    if (item != null) { 
     holder.tvFirst.setText(item.getName()); 
     holder.tvSecond.setText(item.getRate()); 
    } 

    return view; 
} 

static class ViewHolder { 
    TextView tvFirst; 
    TextView tvSecond; 
    TextView tvThird; 
} 

Mein Ziel ist es, einige Zahlen auf der EditText (zB 100) eingeben, die Nummer wird durch den Wert der tvSecond multipliziert werden, Zeigen Sie dann den endgültigen Wert in tvThird an.

Ihre Hilfe wird sehr geschätzt.

Antwort

1

Ich hoffe, ich verstehe die Situation richtig, aber Sie können eine Instanzvariable tvThirdText in CustomAdapter hinzufügen. Fügen Sie jetzt den Textwatcher zum EditText etAmount und in die afterTextChanged(Editable text) Methode tvThirdText zu was Sie wollen, und rufen Sie notifyDataSetChanged() auf dem Adapter. Die letzte Änderung, die Sie vornehmen müssen, ist in der getView() Methode, die Sie holder.tvThird auf den richtigen Wert setzen müssen. Hier ist der vollständige Code, um Ihnen zu helfen.

Hauptklasse:

 etAmount.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) { 
      adapter.tvThirdText = Integer.parseInt(s.toString().trim()); 
      adapter.notifyDataSetChanged(); 
     } 
    }); 

Adapter Klasse:

public int tvThirdText; //can make this private and add setter method if needed 
... 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
... 
    if (item != null) { 
     holder.tvFirst.setText(item.getName()); 
     holder.tvSecond.setText(item.getRate()); 
     holder.tvThird.setText(tvThirdText * item.getRate()); 
    } 
+0

Hallo @Sahith, danke für Sie Eingang oben, es ist das, was ich suchte. Ich stieß jedoch auf weitere Herausforderungen. Lassen Sie mich es als Antwort unten posten. –