ListView的几个领域的EditText [英] ListView with several edittext fields

查看:198
本文介绍了ListView的几个领域的EditText的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个基于一个RelatieLayout几个TextViews和一个EditText上一个ListView。一项所述的文本框的获取基于什么在的EditText字段的值是更新。

I have a ListView based on a RelatieLayout with several TextViews and one EditText. One of the textfields gets updated based on what the value in the EditText-field is.

我的问题是,以preserve的EDITTEXT场的滚动列表视图时的值。我BaseAdapter的延伸是这样的:

My problem is to preserve the value of the editText-field when scrolling the listView. My extention of BaseAdapter looks like this:

public class ListViewAdapter extends BaseAdapter {

static class ItemViewHolder {
    TextView
        itemName,
        itemPrize,
        itemTotalPrize,
    EditText
        itemAmount;
}   

static class CatViewHolder {
    TextView
        categoryName;
    Button
        categoryInfo;
}

ArrayList<ListItem> itemsList;
HashMap<Integer, String> volume = new HashMap<Integer, String>();

public ListViewAdapter(ArrayList<ListItem> itemsList) {
    this.itemsList = itemsList;
}   

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

@Override
public ListItem getItem(int position) {
    // TODO Auto-generated method stub
    return this.itemList.get(position);
}

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

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    if (getItem(position).isCategory()) return 0;
        else return 1;
}   

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;     
    if (!getItem(position).isCategory()) {
        String[] string;// = {"", ""};
        final Item item = (Item) getItem(position);
        if (row == null) {
            row = inflater.inflate(R.layout.item, parent, false);
            viewHolder = new ItemViewHolder();
            viewHolder.itemName = (TextView) row.findViewById(R.id.itemName);
            viewHolder.itemPrize = (TextView) row.findViewById(R.id.itemPrize);
            viewHolder.itemTotalPrize = (TextView) row.findViewById(R.id.itemTotalPrize);                
            viewHolder.itemAmount = (EditText) row.findViewById(R.id.itemAmount);
            row.setTag(viewHolder);
        }   else viewHolder = (DrugViewHolder) row.getTag();
        viewHolder.itemName.setText(item.getName());
        viewHolder.itemPrize.setText(String.valeuOf(item.getPrize()));
        viewHolder.itemAmount.addTextChangedListener(new AmountTextWatcher(item, position, row));
        viewHolder.itemAmount.setText(volume.get(item.getId)));
        viewHodler.itemTotalPrize.setText(String.valueOf(item.getPrize() * volume.get(item.getId));
    }   else {
            Category category = (Category) getItem(position);
            if (row == null) {
                row = inflater.inflate(R.layout.category, parent, false);
                catViewHolder = new CatViewHolder();
                catViewHolder.categoryName = (TextView) row.findViewById(R.id.categoryName);
                catViewHolder.categoryInfo = (Button) row.findViewById(R.id.categoryInfo);
                row.setTag(catViewHolder);
            }   else catViewHolder = (CatViewHolder) row.getTag();
            catViewHolder.categoryName.setText(category.getCatName());
        }
return row;     
}
@Override
public void AmountTextWatcher_interface(String amount, int position) {
    volume.put(position, amount);
}   

修改,添加列表项结构

列表项类,看起来像这样:

ListItem class that looks like this :

package com.buy.ng;
    public interface ListItem {
    public boolean isCategory();
}

我的两个对象,项目和cateogory实现列表项和isCategory()在这两个项目,cateogry被覆盖。项目返回false和类别返回true。

My two objects, item and cateogory implements ListItem and isCategory() is overridden in both item and cateogry. Item returns false and the category returns true.

我AmountTextWatcher看起来是这样的:

My AmountTextWatcher looks like this:

class AmountTextWatcher implements TextWatcher {

public AmountTextWatcher_Interface textChangedListener = null;

interface AmountTextWatcher_Interface {
    public abstract void AmountTextWatcher_interface(String amount, int position);
}

private static final String TAG = "amountTextWatcher";

private TextView textView_TotalPrize,
private Item item;

public PrizeTextWatcher(Item item, int position, View row) {
    this.row = row;
    this.item = item;
    this.textView_TotalPrize = (TextView) row.findViewById(R.id.itemTotalPrize);
}

@Override       
public void afterTextChanged(Editable s) {
    String amount = s.toString().replace(",", ".").trim();
    int dummy;

    if (amount.length() == 0 || amount == null ) amount = "0";

    try {
        dummy = Integer.valueOf(amount);
    }   catch (NumberFormatException npe) {
            amount= "0";
            EditText editText = (EditText) view.findViewById(R.id.itemAmount);
            editText.setText("");
        }
    this.textView_prize.setText(Intege.valueOf(amount) * item.getPrize());
    textChangedListener.PrizeTextWatcher_interface(amount, item.getId());
}

public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}

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

我试过几种方法,但我不能得到量的EditText字段的值要上的ListView滚动preserved。

I've tried several approaches, but I can't get the value in the amount EditText-field to be preserved on ListView scroll.

我试过HashMap的金额=新的HashMap();并与在EditText上,volume.put(item.getId(),金额)输入的值来填充,但我似乎无法得到它的权利。

I've tried HashMap amount = new HashMap(); and populate this with values entered in the EditText, volume.put(item.getId(), amount), but I can't seem to get it right.

试过与此PrizeTextWatcher具有量和item.getId()作为变量的接口。这个接口在ListViewAdapter实现,它modifes此适配器内的HashMap的体积是这样的:

Tried an interface with this PrizeTextWatcher that has amount and item.getId() as variable. This interface is implemented in the ListViewAdapter and it modifes the HashMap volume within this adapter like this :

@Override
public void AmountTextWatcher_interface(String amount, int id) {
    volume.put(id, amount);
}   

任何建议或我在做这一切错了吗?作为android系统中一个相对的新手,我觉得这是相当困难才达到...

Any suggestions or am I doing this all wrong? As a relative newbie in android, I find this quite difficult to achive...

推荐答案

选择要回答我的问题有这样的ListView控件的一个有些工作版本。有一些userexperience-问题,但此BaseAdapter处理的EditText场

Choose to answer my own question with a somewhat working version of this kind of ListView. There are some userexperience-problems, but this BaseAdapter handles edittext-fields.

在我的问题了code和我的答案code之间的主要区别是什么?

What is the main difference between the code in my question and the code in my answer?

三ViewHolders

我想我可能只是从一个没有需要EDITTEXT场的意见,删除的EditText场。错误。或至少​​它的工作原理有三个ViewHolders。

I thought I could just remove the EditText-field from the views that didn't need an editText-field. Wrong. Or atleast it works with three ViewHolders.

OnFocusChange

OnFocusChange代替addTextChangedListener的用途。从这里直接瞧修改adpater数据集!

Use of OnFocusChange instead of addTextChangedListener. Modifies the adpater-dataset directly from here and voila!

requestFocusFromTouch

viewHolder.itemAmount.requestFocusFromTouch();触摸时给出了EDITTEXT焦点。

viewHolder.itemAmount.requestFocusFromTouch(); gives the editText focus when touched.

在清单中,添加

android:windowSoftInputMode="adjustPan"

到您的活动。

在一个XML-列表视图中,添加

In the the XML-Listview, add

android:descendantFocusability="afterDescendants"

一些人认为, beforeDescendants 的应在XML的ListView控件使用。在我的例子code不会改变任何东西。

Some argue that "beforeDescendants" should be used in the XML-ListView. Doesn't change anything in my examplecode.

该adpater看起来是这样的:

The adpater looks like this:

public class ListViewAdapter extends BaseAdapter {

static class ItemViewHolderEditText {
    TextView
        itemName,
        itemPrize,
        itemTotalPrize,
    EditText
        itemAmount;
}   

static class ItemViewHolder {
    TextView
        itemName,
        itemPrize,
        itemTotalPrize,
}   

static class CatViewHolder {
    TextView
        categoryName;
}

ArrayList<ListItem> itemsList;
Item item;

public ListViewAdapter(ArrayList<ListItem> itemsList) {
    this.itemsList = itemsList;
}   

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

@Override
public ListItem getItem(int position) {
    return this.itemsList.get(position);
}

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

@Override
public int getViewTypeCount() {
    return 3;
}

@Override
public int getItemViewType(int position) {
    if (getItem(position).isCategory()) return 0;
        else {
            item = (Item) getItem(position);
            if (item.hasEditText()) return 1;
            return 2;
        }
}   

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;     
    if (!getItem(position).isCategory()) {
        item = (Item) getItem(position);
        if (item.hasEditText()) {
            if (row == null) {
                row = inflater.inflate(R.layout.item_edittext, parent, false);
                viewHolder = new ItemViewHolderEditText();
                viewHolder.itemName = (TextView) row.findViewById(R.id.itemName);
                viewHolder.itemPrize = (TextView) row.findViewById(R.id.itemPrize);
                viewHolder.itemTotalPrize = (TextView) row.findViewById(R.id.itemTotalPrize);                
                viewHolder.itemAmount = (EditText) row.findViewById(R.id.itemAmount);
                row.setTag(viewHolder);
            }   else viewHolder = (ItemViewHolderEditText) row.getTag();
            viewHolder.itemName.setText(item.getName());
            viewHolder.itemPrize.setText(String.valeuOf(item.getPrize()));
            viewHolder.itemAmount.setId(position);
            viewHolder.itemAmount.requestFocusFromTouch();
            viewHolder.itemAmount.selectAll();
            viewHolder.itemAmount.setOnFocusChangeListener(new OnFocusChangeListener() {
                public void onFocusChange(View v, boolean hasFocus) {
                    if (!hasFocus){
                        final EditText amount = (EditText) v;
                        Item item = (Item) itemsList.get(position);
                        item.setTotalPrize(Double.valueOf(amount.getText().toString().trim()));
                        itemsList.set(v.getId(), item);
                    }
                }
            });     
            viewHolder.itemAmount.setText(volume.get(item.getId)));
            viewHodler.itemTotalPrize.setText(String.valueOf(item.getPrize() * volume.get(item.getId));
        }   else {
                if (row == null) {
                    row = inflater.inflate(R.layout.item, parent, false);
                    viewHolder = new ItemViewHolder();
                    viewHolder.itemName = (TextView) row.findViewById(R.id.itemName);
                    viewHolder.itemPrize = (TextView) row.findViewById(R.id.itemPrize);
                    viewHolder.itemTotalPrize = (TextView) row.findViewById(R.id.itemTotalPrize);                
                    row.setTag(viewHolder);
                }   else viewHolder = (ItemViewHolder) row.getTag();
                viewHolder.itemName.setText(item.getName());
                viewHolder.itemPrize.setText(String.valeuOf(item.getPrize()));
                viewHodler.itemTotalPrize.setText(item.getTotalPrize());
            }
    }   else {
            Category category = (Category) getItem(position);
            if (row == null) {
                row = inflater.inflate(R.layout.category, parent, false);
                catViewHolder = new CatViewHolder();
                catViewHolder.categoryName = (TextView) row.findViewById(R.id.categoryName);
                catViewHolder.categoryInfo = (Button) row.findViewById(R.id.categoryInfo);
                row.setTag(catViewHolder);
            }   else catViewHolder = (CatViewHolder) row.getTag();
            catViewHolder.categoryName.setText(category.getCatName());
        }
    return row;     
}

这篇关于ListView的几个领域的EditText的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆