Android Adding view from inflate layout and how to

2019-12-16 19:14发布

I have created view from inflating separate layout. I used for loop to create view more than 5 view like an ListView. Here I want call balance check. Inside view, I will click balance button and once receive response from server, I want to update particular TextView in an existing created view. Any help? I am expecting same for phonepe app balance checking page. enter image description here while scrolling also, it should not hide the updated balance. My Ref stack link: Updating a textview in different layout xml from the main activity

Create a custom View by inflating a layout? My Sample Code:

for (int i=0; i<AccNoList.size; i++) {
    LayoutInflater inflater = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v =  inflater.inflate(R.layout.my_table_row, myTable, true);
    inflater.setId(i);
    ImageButton balancebtn = (ImageButton) v.findViewById(R.id.balancebtn);
    TextView    textview_accnumber   = (TextView)    v.findViewById(R.id.textview_accnumber);
    textview_accnumber.setText("Text for this row");
    balancebtn.setId(i); // So that when it is clicked we know which one has been clicked!
    balancebtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    // once received value from server, i want to update the same row textview balance.
    checkBalance(i);
    }
    });          
    textview_accnumber.setId(i);
    tr.setId(i);
    textview_accnumber.setText(AccNoList.get(i));

    linearlayout.addView(inflater);
}

2条回答
再贱就再见
2楼-- · 2019-12-16 20:02

To update a view property you have to store that view reference. In your case store the views you have created from inflating separate layout.

View view1 = LayoutInflater.from(context).inflate(layoutId, parent, false);
View view2 = LayoutInflater.from(context).inflate(layoutId, parent, false);
View view3 = LayoutInflater.from(context).inflate(layoutId, parent, false);

Then when you receive response from server, get reference the child view you want to update by findViewById() method and update child's property.

Example:

TextView textView1 = view1.findViewById(viewId);
textView1.setText("Updated Text");

TextView textView2 = view2.findViewById(viewId);
textView2.setText("Updated Text");

Edit

// declare it as global
View views[] = new View[size]

for (int i=0; i<AccNoList.size; i++) {
  LayoutInflater inflater = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  views[i] =  inflater.inflate(R.layout.my_table_row, myTable, true);
   //inflater.setId(i);
  ImageButton balancebtn = (ImageButton) views[i].findViewById(R.id.balancebtn);
  TextView    textview_accnumber   = (TextView)    views[i].findViewById(R.id.textview_accnumber);
  textview_accnumber.setText("Text for this row");
   // balancebtn.setId(i); // So that when it is clicked we know which one has been clicked!
  balancebtn.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
     // once received value from server, i want to update the same row textview balance.
       checkBalance(i);
    }
  });          
  //textview_accnumber.setId(i);
  //tr.setId(i);
  textview_accnumber.setText(AccNoList.get(i));

  linearlayout.addView(inflater);
}

checkBalance method

public void checkBalance(final int position){
  // .................
  // ..............
 // after received response
    updateStatus(position);
}

updateStatus method

private void updateStatus(int position, String text){
  if(position < views.length){
     TextView textview_accnumber = (TextView)views[i].findViewById(R.id.textview_accnumber);
     if(textview_accnumber != null)
       textview_accnumber.setText(text);
  }
}
查看更多
走好不送
3楼-- · 2019-12-16 20:13

You can use array of views to identify them easily.

View[] viewlist=new View[AccNoList.size];
    for (int i=0; i<AccNoList.size; i++) {
        LayoutInflater inflater = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        viewlist[i]=  inflater.inflate(R.layout.my_table_row, myTable, true);
        inflater.setId(position);
        ...
        balancebtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
        // once received value from server, i want to update the same row textview balance.

        checkBalance(position);
        ((TextView)viewlist[i].findViewById(that_id)).setText("Your Text");
        }
        });          
       ...
    }
查看更多
登录 后发表回答