在我的main.xml中,我有一个LinearLayout:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/linearMain"
>
</LinearLayout>
然后,在我的Main.java中,我正在从DB(项目的名称和价格)中检索值。然后,我使用以下代码动态创建了我的表单:
Cursor cursor = mydb.getAllJuice();
lm = (LinearLayout) findViewById(R.id.linearMain);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT);
while (cursor.moveToNext()) {
int cid = cursor.getInt(0);
String id = Integer.toString(cid);
String name = cursor.getString(1);
String price = cursor.getString(2);
// Create LinearLayout
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.HORIZONTAL);
// Create TextView
TextView product = new TextView(this);
product.setText(name+" ");
ll.addView(product);
// Create TextView
TextView pricetxt = new TextView(this);
pricetxt.setText(" "+price);
ll.addView(pricetxt);
// Create TextView
TextView currency = new TextView(this);
currency.setText(" LL ");
ll.addView(currency);
// Create TextView
TextView qtylabel = new TextView(this);
qtylabel.setText("QTY ");
ll.addView(qtylabel);
EditText qty = new EditText(this);
qty.setMinLines(1);
qty.setMaxLines(3);
ll.addView(qty);
lm.addView(ll);
}
// Create LinearLayout
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.HORIZONTAL);
final Button btn = new Button(this);
// Give button an ID
int j = 122;
btn.setId(j+1);
btn.setText("Add To Cart");
// set the layoutParams on the button
btn.setLayoutParams(params);
//Add button to LinearLayout
ll.addView(btn);
//Add button to LinearLayout defined in XML
lm.addView(ll);
用户将能够输入项目数量,因此单击按钮将操纵TextView。
要填写此textview,我需要循环创建所有项目以检查价格并检查用户输入的数字。我尝试使用下面的代码,但是我无法访问我想要的特定项目,因为我在每行中都有2个TextView和1个editText:
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// code will be here
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
total = 0 ;
View v1 = null;
for(int i=0; i<lm.getChildCount(); i++) {
v1 = lm.getChildAt(i);
}
}
});
如何访问v1中的其他元素?
答案 0 :(得分:1)
您可以使用Views(TextView,EditText等)的tag参数:setTag(Object)。标签本质上是可以与视图相关联的额外信息。它们通常用作存储与视图本身中的视图相关的数据的便利,而不是将它们放在单独的结构中。查看Android documentation了解详情。
P.S。您可以将RecyclerView(或更旧的ListView)与ViewHolder一起使用,而不是使用您的方法。这已在评论中提到过。
答案 1 :(得分:1)
回答你的问题: 问题是你的“产品”,“pricetxt”,“btn”变量是局部变量,并在你当前的循环迭代结束后收集垃圾。
您可以在项目中实现视图持有者模式。
创建一个名为ViewHolder的类
class ViewHolder{
LinearLayout ll;
TextView product;
TextView pricetxt ;
TextView currency ;
TextView qtylabel ;
EditText qty ;}
public ViewHolder(LinearLayout ll TextView product TextView pricetxt TextView currency TextView qtylabel EditText qty)
{
this.l1= l1;
this.product=product;
this.pricetxt=pricetxt;
this.currency = currency;
this.qtylabel = qtylevel;
this.qty = qty;
}
此类可以通过传递所有这些参数(qty,pricetxt等)来保存所有数据。 现在,您必须在顶部维护此ViewHolder对象的List。你可以这样做 -
List myList<ViewHolder> = new ArrayList<ViewHolder>();
在每次迭代结束时,创建并添加ViewHolder对象; 您可以按照以下方式执行此操作
ViewHolder currentView = new ViewHolder(l1.product,pricetxt,currency,qtylabel,qty);
myList.add(currentView); myList.add(currentView);
您可以在“index”位置访问列表中维护的任何ViewHolder对象
myList.get(index);
或者EditText“qty”为
myList.get(index).qty;
通过这种方式,即使在循环迭代结束后,您也可以访问创建的EditTexts和TextView。
我的建议: - 没有人这样做。正如在这里建议一些人你应该安装推荐的RecyclerView,这比当前的实现更有效。如果你甚至可以ListView。